Mysql 验证PDO中的电子邮件和用户名

Mysql 验证PDO中的电子邮件和用户名,mysql,email,mysqli,pdo,Mysql,Email,Mysqli,Pdo,下面的代码是一个注册表单,在将数据插入数据库之前,我们会检查用户名和电子邮件是否已被占用,实际上它是在phpmysqli中编写的,在那里它工作得很好,但现在我正在切换到PDO。代码工作正常,数据被插入,但它不检查电子邮件和用户名,我的意思是我们可以用相同的电子邮件和用户名再次插入数据。我不知道为什么它不能在这个PDO格式中工作,它在简单的php标准中工作得很好,可能是因为我还没有接触到PDO。请帮帮我。我想要的是在将数据插入数据库之前检查电子邮件和用户名,如果它们已经被获取,则不会插入数据,我们

下面的代码是一个注册表单,在将数据插入数据库之前,我们会检查用户名和电子邮件是否已被占用,实际上它是在
php
mysqli
中编写的,在那里它工作得很好,但现在我正在切换到PDO。代码工作正常,数据被插入,但它不检查电子邮件和用户名,我的意思是我们可以用相同的电子邮件和用户名再次插入数据。我不知道为什么它不能在这个PDO格式中工作,它在简单的php标准中工作得很好,可能是因为我还没有接触到PDO。请帮帮我。我想要的是在将数据插入数据库之前检查电子邮件和用户名,如果它们已经被获取,则不会插入数据,我们会收到错误消息

 $exists = "";
 $query = $db->prepare("SELECT COUNT (username) from userss WHERE username = :username ");
 $query->execute(array(':username'=>$un));
 if ($query->fetchAll() == 1) {
 $exists .= "u";
 } 
 $query = $db->prepare("SELECT COUNT (email) from userss WHERE email = :email ");
 $query->execute(array(':email'=>$em));
 if ($query->fetchAll() == 1) {
 $exists .= "e";
 }

 if ($exists == "u") echo "<p><b>Error:</b> Username already exists!</p>";
 else if ($exists == "e") echo "<p><b>Error:</b> Email already exists!</p>";
 else if ($exists == "ue") echo "<p><b>Error:</b> Username and Email already exists!</p>";
  else {

 $stmt = "INSERT INTO userss (username,first_name,last_name,email,password,password2,) 
 VALUES (:username,:first_name,:last_name,:email,:password,:password2,)";
 $query = $db->prepare( $stmt );  
 $query->execute( array(':username'=>$un,':first_name'=>$fn,':last_name'=>$ln,':email'=>$em,
 ':password'=>$pswd,':password2'=>$pswd2,));
 if ($query->rowCount() == 1) {
  header("Location: login.php");
  } 
 else {
 echo "error";
 }
$exists=”“;
$query=$db->prepare(“从userss中选择COUNT(username),其中username=:username”);
$query->execute(数组(':username'=>$un));
如果($query->fetchAll()==1){
$exists.=“u”;
} 
$query=$db->prepare(“选择来自userss的计数(电子邮件),其中电子邮件=:email”);
$query->execute(数组(':email'=>$em));
如果($query->fetchAll()==1){
$exists.=“e”;
}
如果($exists==“u”)echo“错误:用户名已经存在!

”; 如果($exists==“e”)echo“错误:电子邮件已经存在!

”; 否则如果($exists==“ue”)回显“错误:用户名和电子邮件已经存在!

”; 否则{ $stmt=“插入userss(用户名、名、姓、电子邮件、密码、密码2,) 值(:username、:first_name、:last_name、:email、:password、:password2、)”; $query=$db->prepare($stmt); $query->execute(数组(':username'=>$un',:first_name'=>$fn',:last_name'=>$ln',:email'=>$em, “:password'=>$pswd'”:password2'=>$pswd2,); 如果($query->rowCount()==1){ 标题(“Location:login.php”); } 否则{ 回声“错误”; }
返回一个数组,因此您应该通过计算元素来检查是否返回了任何数据,如下所示:

if (count($query->fetchAll()) > 0)
请注意,它正在测试大于零的数据,如果您的数据库已经有重复的数据,这将防止出现更多数据。

而不是

if ($query->fetchAll() == 1)
尝试:

$query->fetchAll();
将返回多维数组,并且您的查询想要返回
计数
,因此使用
作为
为计数创建别名,您的查询应该如下

 $query = $db->prepare("SELECT COUNT (username) AS user_count from userss WHERE username = :username ");
 $query->execute(array(':username'=>$un));
 if ($query->fetch()['user_count'] > 0) {
 $exists .= "u";
 } 

 $query = $db->prepare("SELECT COUNT (email) AS email_count from userss WHERE email = :email ");
 $query->execute(array(':email'=>$em));
 if ($query->fetch()['email_count'] > 0) {
 $exists .= "e";
 }

什么不起作用?有错误消息吗?测试失败了吗?没有错误,即使已经存在用户名和电子邮件,也会插入数据,我假设会收到用户名和电子邮件之类的错误消息,请选择另一个。只是出于兴趣!为什么要对密码2进行哈希运算,这是
确认密码
?为什么将其存储在数据库中?DUH“那里只是为了检查用户没有输入2个不同的密码,即输入错误。
if ($query->fetchColumn() > 0)
 $query = $db->prepare("SELECT COUNT (username) AS user_count from userss WHERE username = :username ");
 $query->execute(array(':username'=>$un));
 if ($query->fetch()['user_count'] > 0) {
 $exists .= "u";
 } 

 $query = $db->prepare("SELECT COUNT (email) AS email_count from userss WHERE email = :email ");
 $query->execute(array(':email'=>$em));
 if ($query->fetch()['email_count'] > 0) {
 $exists .= "e";
 }