簡體   English   中英

PDO 並檢查用戶名或電子郵件是否被占用

[英]PDO and checking if username or email is taken

我正在轉換為 PDO,但在檢查用戶名和電子郵件是否被采用的部分轉換時遇到問題。

下面是代碼:

<?php
session_start();
$host     = "localhost";
$username = "root";
$password = "123";
$dbname   = "test";
$conn = new PDO("mysql:host=$host;dbname=$dbname",$username,$password);
?>

<?php
if(isset($_POST['register'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];

    $usernamecheck = $conn->query("SELECT `id` FROM `user` WHERE                   username='$username'");
    $emailcheck  = $conn->query("SELECT `id` FROM `user` WHERE email='$email'");
    if(mysql_num_rows($usernamecheck) > 0){
        echo "That username is already taken";
    }elseif(mysql_num_rows($emailcheck) > 0){
        echo "That e-mail address is already in use";
}    
?>

我得到的錯誤在以下兩行:

如果(mysql_num_rows($用戶名檢查)> 0){

}elseif(mysql_num_rows($emailcheck) > 0){

提前致謝。

您正在使用mysql_num_rows()進行 PDO 查詢。 您不能混合使用這些 API。

您還將 $_POST 變量直接插入到您的 SQL 中,這是安全方面的禁忌。 使用 PDO 的好處是您可以輕松地使用 SQL 查詢參數來代替,這樣更容易也更安全。

這是我如何編寫此任務的代碼:

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $conn->prepare("SELECT COUNT(*) AS count FROM `user` WHERE username=?");
$stmt->execute(array($username));
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $username_count = $row["count"];
}
if ($username_count > 0) {
  echo "That username is already taken";
}

$stmt = $conn->prepare("SELECT COUNT(*) AS count FROM `user` WHERE email=?");
$stmt->execute(array($email));
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $email_count = $row["count"];
}
if ($email_count > 0) {
  echo "That email address is already in use";
}

還要記住,即使你先檢查,你也應該假設有一天兩個人可能會同時嘗試創建相同的用戶名,如果他們各自請求的代碼以錯誤的順序執行,他們都可以被告知用戶名不存在,繼續並插入它。 因此,您應該在必須唯一的列上定義一個 UNIQUE KEY。 只有第一個 INSERT 會成功,另一個會出錯。 所以你必須檢查錯誤。

首先,整個任務毫無意義。 使用戶名唯一是沒有意義的。 鑒於電子郵件用於識別用戶,用戶名 - 或者更確切地說 -顯示名稱可以是任何內容並允許重復,就像在 Stack Overflow 上在這里完成的一樣。

但是如果您希望用戶名是唯一的,顯然它可以在一個查詢中完成,而沒有任何本質上無用的num rows 功能

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT username, email AS count FROM `user` WHERE username=? OR email=?";
$stmt = $conn->prepare($sql);
$stmt->execute([$username, $email]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    if ($row['username'] === $username) {
        $errors[] = "Username is taken";
    }
    if ($row['email'] === $email) {
        $errors[] = "Email is taken";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM