2014-10-28 67 views
0

我試圖做一個基本的登錄系統。用戶在表單中,然後發佈和使用下面的代碼輸入用戶名+密碼:處理沒有從準備好的select語句返回的結果

if(isset($_POST['submit'])) { 


$sql = "SELECT username, password FROM tbl_users WHERE username = ? AND password = ?"; 
$stmt = $mysqli->prepare($sql); 

if(!$stmt) { 
    die("Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error); 
} 


$username = $_POST['username']; 
$password = $_POST['password']; 

var_dump($username); 
var_dump($password); 


$bind_result = $stmt->bind_param("ss", $username, $password); 
if(!$bind_result) { 
    echo "Binding failed: (" . $stmt->errno . ") " . $stmt->error; 
} 

$execute_result = $stmt->execute(); 
if(!$execute_result) { 
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
} 

$stmt->bind_result($returned_username, $returned_password); 

while($stmt->fetch()) { 

    var_dump($returned_username); 
    var_dump($returned_password); 


    if($username === $returned_username && $password === $returned_password) { 
     echo "You are now logged in!"; 
    } else { 
     echo "Incorrect username or password"; 
    } 
} 

如果我在正確的用戶名和密碼輸入,一切工作正常並正確記錄英寸當我輸入錯誤的信息時,使用錯誤的密碼或不在數據庫中的用戶名,問題就會出現。 「不正確的用戶名或密碼」行從來沒有工作過。

我是新使用準備好的語句,但我迄今爲止的理解是,一旦我綁定結果,我只能使用fetch在while循環中訪問它們。但是,如果找不到結果,則該循環將永遠不會運行,因此我無法測試查詢是否找到任何結果。我可能在這裏錯過了一些顯而易見的東西,但我一直在努力解決這個問題,它讓我發瘋。

+0

「var_dumps」的輸出是什麼?我認爲,雖然週期也很糟糕。你需要檢查,'SELECT COUNT(*)AS cnt'查詢該行,而沒有while,如果cnt> 0,那麼有一個用戶名稱。如果有用戶使用該用戶名和密碼,這將返回給你任何東西。 – vaso123 2014-10-28 14:06:18

回答

0

的問題,你'基於你的代碼中實現的邏輯。如果沒有用戶從數據庫中,然後,僅僅通過改變代碼的幾行您可以修復檢查正確的用戶名和密碼永遠不會運行,代碼檢索,試試這個:

//this is your code at the moment 

while($stmt->fetch()) { 

    var_dump($returned_username); 
    var_dump($returned_password); 


    if($username === $returned_username && $password === $returned_password) { 
     echo "You are now logged in!"; 
    } else { 
     echo "Incorrect username or password"; 
    } 
} 

//replace that for this 

while($stmt->fetch()) { 

    var_dump($returned_username); 
    var_dump($returned_password); 

} 

if($username === $returned_username && $password === $returned_password) { 
    echo "You are now logged in!"; 
} else { 
    echo "Incorrect username or password"; 
} 

希望幫助你解決了你的問題,快樂編碼。

0

怎麼樣測試,如果你得到任何結果,如果你不扔錯誤:

if($stmt->fetch()) 
{ 
    do { 

     var_dump($returned_username); 
     var_dump($returned_password); 


     if($username === $returned_username && $password === $returned_password) { 
      echo "You are now logged in!"; 
     } else { 
      echo "Incorrect username or password"; 
     } 
    } while($stmt->fetch()); 
} 
else 
{ 
    echo "Incorrect username or password"; 
} 
+1

如果返回任何結果,則根據結果檢查輸入的用戶名和密碼是多餘的,因爲查詢已完成。 – 2014-10-28 14:12:12

+0

沒錯,我只是在解決當前的問題。他所寫的代碼的質量並不相關。 – 2014-10-28 14:13:19

+0

對不起,我的意思是說這個問題,而不是你的答案。不知道我是怎麼意外地做到這一點的。 – 2014-10-28 14:16:58

1

我建議你,像這樣使用:

if (isset($_POST['submit'])) { 
    //Checking, is a user exists with these credentials? 
    $sql = "SELECT COUNT(*) AS cnt FROM tbl_users WHERE username = ? AND password = ?"; 
    $stmt = $mysqli->prepare($sql); 
    if (!$stmt) { 
     die("Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error); 
    } 
    $bind_result = $stmt->bind_param("ss", $_POST['username'], $_POST['password']); 
    if (!$bind_result) { 
     echo "Binding failed: (" . $stmt->errno . ") " . $stmt->error; 
    } 
    $execute_result = $stmt->execute(); 
    if (!$execute_result) { 
     echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
    } 
    $stmt->bind_result($cnt); 
    $stmt->fetch(); 
    if ($cnt > 0) { 
     echo "You are now logged in!"; 
    } else { 
     echo "Incorrect username or password"; 
    } 
} 
相關問題