#php #mysql
#php #mysql
Вопрос:
Итак, у меня есть старый веб-сайт со старой базой данных, и я пытаюсь перенести данные в свою новую базу данных. Я и мои сотрудники написали скрипт для этого, но он не работает должным образом.
<?php
$user = 'homestead';
$pass ='secret';
try {
$oldDb = new PDO('mysql:host=127.0.0.1;dbname=old_database', $user, $pass);
$newDb = new PDO('mysql:host=127.0.0.1;dbname=new_database', $user, $pass);
$newDb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$selectRoles = $newDb->prepare("SELECT * FROM roles");
$selectRoles->execute();
$roles = $selectRoles->fetchAll(PDO::FETCH_COLUMN, 0);
if (!$roles) {
$sql = "INSERT INTO roles (`id`, `name`) VALUES ('1', 'Student')";
$newDb->exec($sql);
$sql = "INSERT INTO roles (`id`, `name`) VALUES ('2', 'Teacher')";
$newDb->exec($sql);
$sql = "INSERT INTO roles (`id`, `name`) VALUES ('3', 'Manager')";
$newDb->exec($sql);
$sql = "INSERT INTO roles (`id`, `name`) VALUES ('4', 'Admin')";
$newDb->exec($sql);
}
$users = [];
foreach ($oldDb->query('SELECT id, email, password, name, street, house_number, postcode, role from users') as $row) {
$userId = $row['id'];
$street = $row['street'];
$houseNumber = $row['house_number'];
$postal_code = $row['postal_code'];
$row['Address_id'] = $row['id'];
$row['Profile_id'] = $row['id'];
if ($row['role'] == 'Student') {
$row['Role_id'] = '1';
} elseif ($row['role'] == 'Teacher') {
$row['Role_id'] = '2';
} elseif ($row['role'] == 'Manager') {
$row['Role_id'] = '3';
} elseif ($row['role'] == 'Admin') {
$row['Role_id'] = '4';
}
$address = $newDb->prepare("INSERT INTO addresses (id, street, house_number, postal_code) VALUES (:id, :street, :house_number, :postal_code)");
$address->bindParam(':id', $row['id']);
$address->bindParam(':street', $street);
$address->bindParam(':house_number', $houseNumber);
$address->bindParam(':postal_code', $postal_code);
$address->execute();
$name = explode(" ", $row['name']);
$first_name = $name[0];
$last_name = $name[1];
$address = $newDb->prepare("INSERT INTO profiles (id, first_name, last_name) VALUES (:id, :first_name, :last_name)");
$address->bindParam(':id', $row['id']);
$address->bindParam(':first_name', $first_name);
$address->bindParam(':last_name', $last_name);
$address->execute();
$user = $newDb->prepare("INSERT INTO users (id, email, password, Address_id, Profile_id, Role_id) VALUES (:id, :email, :password, :Address_id, :Profile_id, :Role_id)");
$user->bindParam(':id', $row['id']);
$user->bindParam(':email', $row['email']);
$user->bindParam(':password', $row['password']);
$user->bindParam(':Address_id', $row['id']);
$user->bindParam(':Profile_id', $row['id']);
$user->bindParam(':Role_id', $row['Role_id']);
$user->execute();
}
foreach ($oldDb->query('SELECT id, title, content, Users_id from blog') as $row) {
$blog = $newDb->prepare("INSERT INTO blogs (id, title, content, User_id) VALUES (:id, :title, :content, :User_id)");
$blog->bindParam(':id', $row['id']);
$blog->bindParam(':title', $row['title']);
$blog->bindParam(':content', $row['content']);
$blog->bindParam(':User_id', $row['id']);
$blog->execute();
}
foreach ($oldDb->query('SELECT id, author, text, Blog_id from comment') as $row) {
$name = explode(" ", $row['author']);
$first_name = $name[0];
$last_name = $name[1];
$profile = $newDb->prepare("SELECT id FROM profiles WHERE first_name = :first_name");
$profile->bindParam(':first_name', $first_name);
$profile->execute();
$data = $profile->fetchAll();
$comment = $newDb->prepare("INSERT INTO comments (id, text, Blog_id, User_id) VALUES (:id, :text, :Blog_id, :User_id)");
$comment->bindParam(':id', $row['id']);
$comment->bindParam(':text', $row['text']);
$comment->bindParam(':Blog_id', $row['Blog_id']);
$comment->bindParam(':User_id', $data[0]['id']);
$comment->execute();
}
foreach ($oldDb->query('SELECT id, uploaded_by, filename from file') as $row) {
$name = explode(" ", $row['uploaded_by']);
$first_name = $name[0];
$last_name = $name[1];
$profile = $newDb->prepare("SELECT id FROM profiles WHERE first_name = :first_name");
$profile->bindParam(':first_name', $first_name);
$profile->execute();
$data = $profile->fetchAll();
$file = $newDb->prepare("INSERT INTO files (id, filename, User_id) VALUES (:id, :filename, :User_id)");
$file->bindParam(':id', $row['id']);
$file->bindParam(':filename', $row['filename']);
$file->bindParam(':User_id', $data['id']);
$file->execute();
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
Поэтому я пытаюсь вставить данные из старой базы данных в новую, но получаю сообщение об ошибке :
Error!: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'User_id' cannot be null
когда я пытаюсь вставить файлы из старой базы данных в новую. Когда я печатаю_r_id_пользователя, я получаю
Notice: Undefined index: id in /home/vagrant/HassanKebabStore/newDatabase/index.php on line 36
Если кто-то может мне помочь, я был бы очень признателен!
Ответ №1:
Вы получаете ошибку, потому что она не может найти переменную user_id. Точно так же, как у вас есть:
$file->bindParam(':id', $row['id']);
$file->bindParam(':filename', $row['filename']);
Вам нужно изменить идентификатор пользовательских данных на user_id
$file->bindParam(':User_id', $data['User_id']);
Я думаю, что это исправление
Ответ №2:
Похоже, что результаты вашего запроса не те, которые вы ожидаете. Прежде всего, я бы поставил a print_r($row)
, чтобы проверить, что строка имеет значения, которые вы используете позже. Я предполагаю, что эти значения пусты (по крайней мере, ‘id’).
...
foreach ($oldDb->query('SELECT id, email, password, name, street, house_number, postcode, role from users') as $row) {
print_r($row);
$userId = $row['id'];
...
Не могли бы вы предоставить нам результаты, пожалуйста?