2017-04-08 83 views
0

尝试使用PDO创建基本的用户注册脚本,当用户和电子邮件存在时,我收到单个错误消息(用户或电子邮件已存在),即时尝试获取单独的输出用户和电子邮件错误。另外关于此脚本任何其他建议大加赞赏如何在单个查询中获得两个单独的错误结果

if(isset($_POST['Register'])){ 
$username = $_POST['username']; 
$email = $_POST['email']; 
$password = $_POST['password']; 
//Validating ??? 


$statement = $conn->prepare("SELECT COUNT(*) AS count FROM users 
    WHERE username = :username AND email = :email"); 
$statement->bindParam(':username', $username); 
$statement->bindParam(':email', $email); 
$statement->execute(array(':username' => $username, ':email' => $email)); 

    while ($row = $statement ->fetch(PDO::FETCH_ASSOC)) { 
     $result = $row["count"]; 
     } 
     if ($result > 0) { 
      echo "That usernam or email is already taken"; 

      } 
     else { 
      $sql = ("INSERT INTO users(username, email, password) VALUES(?, ?, ?)"); 
      $statement = $conn->prepare($sql); 
      $statement->bindValue(":username", $username, PDO::PARAM_STR); 
      $statement->bindValue(":password", $password, PDO::PARAM_STR); 
      $statement->bindValue(":email", $email, PDO::PARAM_STR); 
      $statement->execute(array("$username", "$email", "$password")); 
      echo "New record created successfully"; 
      } 
} 
+1

'VALUES(?,?,?)'不能与指定的占位符一起工作,你应该得到一个错误。 –

+1

'SELECT username,email FROM users WHERE username =? OR email =?'如果找到两行 - 两个选项都被采用,如果有的话 - 检查电子邮件,否则它的用户名 – Peon

+1

RTMs http://php.net/manual/en/pdostatement.bindvalue.php --- http:// php.net/manual/en/pdostatement.bindparam.php –

回答

2

我可能会做这样的:

SELECT 
    COUNT(IF (username IS NOT NULL AND username != '', 1, NULL)) AS username_taken 
, COUNT(IF (email IS NOT NULL AND email != '', 1, NULL)) AS email_taken 
FROM users 
WHERE LOWER(username) = LOWER(TRIM(:username)) 
OR LOWER(email) = LOWER(TRIM(:email)) 

注意,我使用COUNT()这里是聚集如果有两个结果行的原因。 COUNT()忽略NULL,所以这会将两行压缩为一个并返回10(从COUNT()),或者只是为两列提供1(如果它们是同一行)。

此外,正如@Fred -ii-指出的那样,您将在后面进行的绑定类型中获得错误的PDO方法调用。所以:

$sql = " 
INSERT INTO users (
    username, email, password 
) VALUES (
    TRIM(:username), TRIM(:email), :password 
) 
"; 

$statement = $conn->prepare($sql); 

$statement->bindParam(":username", $username, PDO::PARAM_STR); 
$statement->bindParam(":password", $password, PDO::PARAM_STR); 
$statement->bindParam(":email", $email, PDO::PARAM_STR); 
+0

谢谢雅雷德,还有一个问题,我如何设置循环,并获得您的查询结果您张贴(可能得到单独的结果电子邮件和用户名),我试图调整我的查询,但没有工作 – skunkhaze

+1

你不需要循环与这个查询。 –

+1

对于您保存的密码,我会向您推荐http://www.phptherightway.com/#password_hashing,请仔细阅读;安全很难,你需要做的正确。我还建议在插入这些用户名和电子邮件时(但不要输入密码!),至少使用'TRIM()'并且可以使用'LOWER()'。这是为了让你存储的数据一致,既不需要外部边缘空白,也不需要改变字符外观。看看我的答案中的“SELECT”,我是如何一起使用它们的。 –

-2

为了得到不同的错误信息,查询必须分隔。

  1. 检查用户名(如果发现,扔掉错误)
  2. 如果没有找到,检查电子邮件(如果发现,扔掉错误)
  3. 如果没有找到,插入用户数据
+0

已经有两个查询的另一个版本,但不能确定如果我可以把所有东西都制作成单个查询 – skunkhaze

0
$username = $statement->fetchColumn(); 
$email = $statement->fetchColumn(1); 

if ($username != null) { 
    echo "Username already taken"; 
} 
elseif ($email != null) { 
    echo "Email already taken"; 
} 
else{ 
    //Insert entry into DB 
} 

OR

if ($row["username"] != null) { 
    echo "Username already taken"; 
} 
elseif ($row["email"] != null) { 
    echo "Email already taken"; 
} 
else{ 
    //Insert entry into DB 
} 

此外,您的查询需要更改为:

SELECT COUNT(*) AS count FROM users WHERE username = :username OR email = :email 

因为使用您当前的查询,您无法同时检查用户名和电子邮件地址。

+0

就目前而言,由于“AND”,一行必须同时具有,所以查询也必须更改。 –

+0

那么,这部分工作,你现在应该删除'COUNT()',如果它在两个不同的行? –

相关问题