Я пытаюсь создать систему регистрации и входа пользователей. Мой код подключается к базе данных, а форма передает данные, но операторы не выполняются. Сообщений об ошибках тоже нет.
public function reg_user($username, $email, $address, $pwd){
$pass = password_hash($pwd, PASSWORD_BCRYPT);
$check = $this->db->prepare('SELECT * FROM bakery_users WHERE u_mail = :u_mail');
$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)');
$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{
$db = null;
return false;
}
}
Вам не хватает запятой в операторе вставки. Между u_add и u_pass.
Как вы ожидаете, что $count будет меньше, чем ноль?
Если вы модифицируете свой вопрос каждый раз, когда кто-то дает вам ответ, это делает ответы неправильными !!! Поэтому, пожалуйста, не делайте этого. Если вы хотите сказать, что вы что-то изменили, но это все еще не работает, повторно вставьте измененный код под заголовком ОБНОВЛЕНИЕ, если необходимо.






Основная проблема, я считаю, заключается в операторе 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 )
public function reg_user( $username=false, $email=false, $address=false, $pwd=false ){
try{
if ( !( $username & $email & $address & $pwd ) ) throw new Exception('bad foo');
$sql='SELECT * FROM `bakery_users` WHERE `u_mail` = :u_mail';
$stmt = $this->db->prepare( $sql );
if ( !$stmt ) throw new Exception('Failed to prepare SELECT query');
$args=array( ':u_mail' => $email );
$stmt->execute( $args );
$count = $stmt->rowCount();
if ( $count == 0 ){
$sql='INSERT INTO `bakery_users` ( `u_name`, `u_mail`, `u_add`, `u_pass` ) VALUES ( :u_name, :u_mail, :u_add, :u_pass )';
$stmt = $db->prepare( $sql );
if ( $stmt ){
$args=array(
':u_name' => $username,
':u_mail' => $email,
':u_add' => $address,
':u_pass' => password_hash( $pwd, PASSWORD_BCRYPT )
);
return $stmt->execute( $args );
} 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__ ) );
}
}
There are no error messages either
потому что вы используете неправильный режим ошибки PDO, вы используете режим по умолчанию, который, iirc, называется PDO::ERRMODE_SILENT
это НАШИ правильный способ создания объекта PDO:
$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password',
array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
и когда вы создали свой, вы забыли PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION-часть.
Спасибо @hanshenrik! Но до сих пор нет ошибок. вот полный код подключения class BakeryModel { public $db; function __construct(){ try{ $this->db = new PDO('mysql:host=localhost;dbname=bakerydb;charset=utf8mb4', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); } catch (PDOEXCEPTION $e){ echo "connection failed:" .$e->getMessage(); } } .
@Zeekstem о, тогда это, вероятно, PHP White screen of death, у вас есть неперехваченное исключение, и у вас есть display_errors = Off в php.ini, журнал ошибок должен ждать вас в журнале ошибок php :) (ps, в большинстве конфигураций php журнал ошибок перенаправляется в журнал ошибок веб-сервера, поэтому чаще всего это журнал ошибок apache или журнал ошибок nginx)
Скорее всего, count возвращает 0 или больше 0... не меньше 0