2012-12-23 68 views
2

count($existuser)函數總是返回1.即使沒有具有該名稱或電子郵件的用戶。PDO用戶驗證

下面是代碼:

function registerUser($username, $password, $passwordagain, $email, $mcname) { 
    include $_SERVER['DOCUMENT_ROOT'] . "/config/config.php"; 
    $conn   = new PDO('mysql:host=' . $ip . ';dbname=' . $database, $username, $password); 
    $validusername = "/^[a-z0-9]+$/"; 
    $validpassword = "/^[A-Za-z0-9]+$/"; 
    $validemail = "/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/"; 
    $validmcname = "/^[A-Za-z0-9]+$/"; 
    $error   = 0; 

    if (strlen($username) < 4 || strlen($username) > 24) { 
     $error = 1; 
    } 
    if (strlen($password) < 6 || strlen($password) > 24) { 
     $error = 1; 
    } 
    if (strlen($mcname) < 4 || strlen($mcname) > 24) { 
     $error = 1; 
    } 
    if (!preg_match($validusername, $username)) { 
     $error = 1; 
    } 
    if (!preg_match($validpassword, $password)) { 
     $error = 1; 
    } 
    if (!preg_match($validemail, $email)) { 
     $error = 1; 
    } 
    if (!preg_match($validmcname, $mcname)) { 
     $error = 1; 
    } 
    if ($password != $passwordagain) { 
     $error = 1; 
    } 
//test 
    $userquery = $conn->query('SELECT * FROM users WHERE username="' . $username . '"'); 
    $existuser = $userquery->fetch(); 
    echo count($existuser); 
//test 
    if (count($existuser)) { 
     $error = 1; 
     echo "<div class='erroralert'>Username already exists!</div>"; 
    } 
//test 
    $emailquery = $conn->query('SELECT * FROM users WHERE email="' . $email . '"'); 
    $existemail = $emailquery->fetch(); 
//test 
    if (count($existemail)) { 
     $error = 1; 
     echo "<div class='erroralert'>E-mail already exists!</div>"; 
    } 
    if ($error != 1) { 
     $encryptedpassword = hash('sha512', $password); 
     $registeruser  = $conn->query("INSERT INTO users(username, password, email, mcname) VALUES ('$username', '$encryptedpassword', '$email', '$mcname')"); 
     echo "<div class='successalert'>Succesfully registred</div>"; 
    } 
} 
+0

我不明白您的查詢發佈,也將是對你的調試過程中改變你的錯誤狀態,所以你可以找出什麼是錯的你/用戶正在輸入該功能。 –

+0

請參閱:http://php.net/faq.passwords.php - 您也可以將驗證的長度限制放入正則表達式中(您已經使用電子郵件正則表達式執行此操作),並且您應該在此處使用準備好的語句,因爲您不要處理驗證結果。 – hakre

回答

0

該查詢可能無法執行,這就是爲什麼你總是得到「1」,這可能是錯誤報告。

通過您的代碼閱讀,我建議你試試這個:

在下面的查詢,你是其中附有用戶名」,但是,這並不總是支持,而是應該使用單引號'並用「包圍字符串本身。所以下面的一行

$userquery = $conn->query('SELECT * FROM users WHERE username="' . $username . '"'); 

應該

$userquery = $conn->query("SELECT * FROM users WHERE username='" . $username . "'"); 

做同樣的具有相同問題的其他問題。

+0

Nope:S同樣的問題 – IcEaGe

1

你爲什麼要使用PDO如果你這樣做:

$userquery = $conn->query('SELECT * FROM users WHERE username="' . $username . '"'); 
$existuser = $userquery->fetch(); 

你應該有以下邏輯:

$userquery = $conn->prepare('SELECT * FROM users WHERE username = ?'); 
$userquery->execute(array($username)); 
if ($userquery->rowCount()) { 
    // found user 
} else { 
    // user not found 
} 
+0

請注意,'SELECT'和'PDOStatement :: rowCount()'不能很好地結合在一起,請參閱http://stackoverflow.com/a/14012410/367456 – hakre

+0

@hakre我同意在便攜式應用程序這是有效的,但如果你不做一個,你做兩個查詢,而不是一個。 – Ranty

+0

哦,對於Mysql,你可以這樣做,對:[解決PHP5的PDO rowCount MySQL問題](http://stackoverflow.com/q/460010/367456) - 然而,這是*不是*什麼你在你的答案中建議。 – hakre

0

您使用count()錯在這裏。它會返回1爲任何正常變量和一個數組,它將返回元素的數量。

重要的部分是第一部分。如果沒有行,PDOStatement::fetch()將返回FALSE,其計數1這是truthy:

count(FALSE);  # 1 
count($existuser); # 1 when there is no user, when there is a user at least 2 
        # for default fetchmode PDO::FETCH_BOTH 

所以你剛纔檢查什麼。取而代之的測試,它是FALSE

if ($existuser === FALSE) { 
    // error. 
}