Основная проблема, я полагаю, заключается в выражении sql - в нем отсутствует запятая между u_add
и u_pass
$reg = $db->prepare('INSERT INTO bakery_users (u_name, u_mail, u_add, u_pass) VALUES (:u_name, :u_mail, :u_add, :u_pass)');
Если вы проверяете возвращаемое значение prepare
, вы можете форк логика зависит от его успеха / неудачи
if( $reg ){
$reg->bindParam(':u_mail', $username,PDO::PARAM_STR);
$reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
$reg->bindParam(':u_add', $address,PDO::PARAM_STR);
$reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
$reg->execute();
return true;
} else {
exit('error');
}
У вас также есть неправильно названный параметр в первом операторе связывания
$reg->bindParam(':u_mail', $username,PDO::PARAM_STR);
должно быть
$reg->bindParam(':u_name', $username,PDO::PARAM_STR);
Вы Я могу использовать блок try/catch
, чтобы попытаться идентифицировать проблемы конструктивным образом, как этот
public function reg_user($username, $email, $address, $pwd){
try{
$pass = password_hash($pwd, PASSWORD_BCRYPT);
$check = $this->db->prepare('SELECT * FROM `bakery_users` WHERE `u_mail` = :u_mail');
if( !$check )throw new Exception('Failed to prepare SELECT query');
$check->bindParam(':u_mail', $email, PDO::PARAM_STR);
$check->execute();
$count = $check->rowCount();
if( $count < 0 ){
$reg = $db->prepare('INSERT INTO `bakery_users` (`u_name`, `u_mail`, `u_add`, `u_pass` ) VALUES ( :u_name, :u_mail, :u_add, :u_pass )');
if( $reg ){
$reg->bindParam(':u_name', $username,PDO::PARAM_STR);
$reg->bindParam(':u_mail', $email,PDO::PARAM_STR);
$reg->bindParam(':u_add', $address,PDO::PARAM_STR);
$reg->bindParam(':u_pass', $pass,PDO::PARAM_STR);
$reg->execute();
return true;
} else {
throw new Exception('Failed to prepare INSERT query')
}
} else{
$db = null;
return false;
}
}catch( Exception $e ){
exit( sprintf('An error "%s" on line %d of "%s"',$e->getMessage(),$e->getLine(),__METHOD__ ) );
}
}
Я должен был заметить раньше, чем использовать if( $count < 0 )
~, что должно быть if( $count==0 )
«rake db: migrate» попытается запустить все незавершенные миграции для вашего проекта. Если вы просто хотите сбросить схему, выполните команду rake db: schema: dump.
Но я думаю, у вас проблема, когда говорится, что таблица уже существует. Одна из ваших миграций не удалась, потому что таблица, которую он пытается добавить, уже существует в вашей базе данных. Вы создали его вручную? Вы выполнили миграцию, но не записали ее? Вам нужно будет исправить это, прежде чем вы сможете писать будущие миграции. Если это просто ошибка, а таблица есть и исправьте, и вы хотите проигнорировать это. Я рекомендую обойти это, закомментировав таблицу создания в неудачной миграции. Затем запустите rake db: migrate. Затем создайте таблицу обратно. Это обновит вашу версию схемы.
Убедитесь, что вы указали правильные отключения для всех миграций.
отвечая на ваш последний вопрос относительно документации:
Я обнаружил, что иногда, когда все становится немного странно, вы попадаете в ситуацию, когда Rails захочет выполнить миграцию, которую по праву следует считать уже выполненной ( таблица уже существует и т. д.). Вы можете пометить миграцию как выполненную, найдя ее номер (числовую часть в начале имени файла), войдя в mysql и выполнив такой запрос:
insert into schema_migrations values('20090521153438');
(или любой другой номер вашей миграции)
Или если миграция плагина выполняется с использованием migrate_plugin Desert:
insert into plugin_schema_migrations values('my_plugin', '005');