2017-04-08 45 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()',如果它在兩個不同的行? –

相關問題