2015-05-15 117 views
1

有人可以看看這段代碼嗎?我對PDO方法很陌生,出於某種原因,每當我提交時都會導致500錯誤。在PDO查詢時遇到問題

我已將其縮小到此:

難道是這部分? $hash = $stmt['hash'];

if(empty($response['error'])){ 
    $stmt = $db->prepare("SELECT * FROM Login WHERE username= :username"); // Prepare the query 
// Bind the parameters to the query 
    $stmt->bindParam(':username', $username); 
    //Carry out the query 
    $stmt->execute(); 
    $hash = $stmt['hash']; 

    $affectedRows = $stmt->rowCount(); // Getting affected rows count 
    if($affectedRows != 1){ 
     $response['error'][] = "No User is related to the Username"; 
    } 
    if(password_verify($password, $hash)) 
    { 
     $_SESSION['username'] = $_POST['username']; 
      $_SESSION['userid'] = $stmt['ID']; 
    } 
    else 
    { 
     $response['error'][] = "Your password is invalid."; 
    } 
} 

如果您需要更多信息請諮詢我會很樂意提供什麼我可以。

+0

哪個日誌?哪裏?服務器日誌? 如果我刪除了$ hash = $ stmt ['hash'];它沒有錯誤,但它也顯然不會工作。 –

+0

錯誤日誌,是的。 –

+2

你沒有獲取你的查詢結果,http://php.net/manual/en/pdostatement.fetch.php不要以爲那是500,所以你仍然需要檢查錯誤日誌。 – chris85

回答

1

您需要獲取查詢的結果以使其可訪問。我不知道這是你的問題,我倒是覺得$hash只會被設置爲資源ID#X,不是你想要什麼,但不是500以下是如何獲取(http://php.net/manual/en/pdostatement.fetch.php)雖然

$stmt = $db->prepare("SELECT * FROM Login WHERE username= :username"); // Prepare the query 
// Bind the parameters to the query 
    $stmt->bindParam(':username', $username); 
    //Carry out the query 
    $stmt->execute(); 
    //if you will only be getting back one result you dont need the while or hashes as an array 
    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){ 
    $hashes[] = $result['hash']; 
    } 

這裏的一個線程啓用錯誤報告PHP production server - turn on error messages

此外,你不必綁定傳遞值與PDO。你也可以做

$stmt = $db->prepare("SELECT * FROM Login WHERE username= ?"); // Prepare the query 
$stmt->execute(array($username)); 
+0

我做到這一點的方式(第2 - 5行)和你用'$ stmt-> execute(array($ username))執行它的方式有什麼區別? 你的方式更好嗎?或者只是簡寫?我有這樣的,因爲我正在計劃綁定多個結果。 (未來) –

+1

是的,只是一個更短的方式,兩者都是一樣的。你可以有多個值以及'array($ username,$ value2,$ value3,$ etc)'。 PHP文檔頁面上的例子3和例子6說明了這種用法,http://php.net/manual/en/pdo.prepared-statements.php。 – chris85

1

你的代碼真的很混亂。只是爲了幫助你的起點:

if (empty($response['error'])) { 
    if (isset($_POST['username'])) { 
     $username = $_POST['username']; 
     $password = $_POST['password']; 
     $stmt = $db->prepare("SELECT * FROM Login WHERE username= :username"); 
     $stmt->bindParam(':username', $username); 
     $stmt->execute(); 
     if ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
      $hash = $row['hash']; 
      if(password_verify($password, $hash)) { 
       $_SESSION['username'] = $username; 
       $_SESSION['userid'] = $stmt['ID']; 
      } else { 
       $response['error'][] = "Your password is invalid."; 
      } 
     } else { 
      $response['error'][] = "No User is related to the Username"; 
     } 
    } else { 
     $response['error'][] = "Username is not set!"; 
    } 
}