2017-02-11 44 views
-1

好更新數據錯誤,我用PHP與PDO擴展作爲數據庫驅動程序工作周圍。在PHP PDO

我正在那裏的東西是相當弄亂了我一個「更改密碼」情景:(

我們(有些#1助手,獎勵!)設法驗證當前密碼的密碼,但它不更新的數據,因爲我認爲

這裏是相遇場景
喲你正在改變你的密碼從quorastackoverflow。我們知道,如果你更改了密碼,則無法使用舊密碼,但在我的情況,你可以使用舊的密碼,但不是新的,使得新已廢棄

這裏是我的代碼片段一:
所有的

$option = ['cost' => 12]; 
    $password = password_hash($_currentpassword, PASSWORD_BCRYPT, $option); 

    $selectpasswordsql = "SELECT `password` FROM `auth` WHERE username=?"; 
    $selectpasswordstmt = $conn->prepare($selectpasswordsql); 
    $selectpasswordstmt->execute(array($_SESSION['account']['username'])); 
    $selectpasswordresults = $selectpasswordstmt->fetch(PDO::FETCH_ASSOC); 

    $databasepass = $selectpasswordresults['password']; 
    if(password_verify($_currentpassword,$databasepass)){ 
    if(empty($passmsgs)){ 
     $updatepasssql = "UPDATE `auth` SET 
     `password`=? 
     WHERE username=? 
     "; 
     $updatepassstmt = $conn->prepare($updatepasssql); 
     $updatepassstmt->execute(array(password_hash($password, $_SESSION['account']['username'])); 
     if($updatepassstmt){ 
     array_push($passmsgs, 'Successfully updating your password!'); 
     } else { 
     array_push($passmsgs, 'There was a problem executing your command!'); 
     } 
    } 
    } else { 
    array_push($passmsgs, 'Your current password is wrong!'); 
    } 
+1

我無法在這裏看到的問題。 –

+1

你有兩個'?'-placeholders,但只有一個通過'execute' –

+0

傳遞價值@u_mulder它也將失敗'執行(陣列(password_hash($密碼,$ _SESSION [ '賬戶'] [ '用戶名']) '不能按引用傳遞,*等* ... –

回答

1

首先,請確保您可以通過以下包括行到你的頁面的頂部看到錯誤。

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

您的以下代碼同時存在邏輯錯誤和語法錯誤。

$updatepassstmt->execute(array(password_hash($password, $_SESSION['account']['username'])); 
if($updatepassstmt){ 
  • 您嘗試重新的哈希散列的$ _currentpassword $密碼值。 (請明確定義新的密碼變量。)
  • 您還沒有正確關閉password_hash()函數。 ($ _SESSION [ '賬戶'] [ '用戶名' 作爲第二個參數傳遞。)
  • 你不檢查的execute()結果返回布爾。您需要檢查它,否則您將始終獲得成功消息,因爲$ updatepassstmt在成功prepare()調用時將成爲PDOStatement對象。

我建議你到你的代碼轉換的邏輯是這樣的:

... 
$updatepassstmt = $conn->prepare($updatepasssql); 

$new_hashed_password = password_hash($_POST['new_password'], PASSWORD_BCRYPT, $option); // replace $_POST['new_password'] with the correct one. 

$result = $updatepassstmt->execute($new_hashed_password, $_SESSION['account']['username']); 

if ($result){ 
...etc... 
+0

我需要消毒領域,以避免注射和防止從字段中插入一些* raw *數據。謝謝,我不知道我是哈希當前密碼而不是新密碼:) – astronomicalXoom

+1

@astronomicalXoom不客氣!事實上,自從您使用準備好的陳述以來,您不必擔心注射。 (http://php.net/manual/en/pdo.prepared-statements.php) – jetblack