php - PHP PDO 代码连接到数据库但不执行查询且不返回错误
问题描述
我正在尝试创建一个用户注册和登录系统。我的代码正在连接到数据库,表单正在提供数据,但语句没有执行。也没有错误消息。
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;
}
}
解决方案
我相信,主要问题在于 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__ ) );
}
}
推荐阅读
- r - 如何在子数据集中完成重复计算和绘图?
- regex - 您如何在 PHP 中使用正则表达式编写以下字符串?.. 和 /.. 和 ..anyalphanumeric0
- mysql - how to retrieve User model with only one row of Details model (User: One -> Details: Many), based on MAX of date - Laravel 8.0
- javascript - 由于被包裹在异步请求中,JavaScript 中的生成器无法正常工作
- c# - 在图像前面设置一个游戏对象
- css - Grid Container 不会占用完整的 vh
- javascript - 输入值已设置且可见,但在另一个脚本中无法访问
- powershell - 将管道参数绑定到函数参数时出现空错误
- scala - Scala 函数式编程和可变性
- visual-studio-code - vsCode 设置和切换编程语言