我目前是第3年的網絡開發學生,對於學校項目,我們必須使用PDO和哈希來創建具有更改密碼功能的網站,但是我遇到了一個我自己無法解決的問題,我也沒有在google和stackoverflow上發現任何類似的問題。PHP不能在PDO查詢中使用散列密碼
我們必須在數據庫中存儲2個密碼,舊密碼(這是用戶最後使用的密碼);和他們的當前密碼(這將被用來登錄。)
所有密碼的存儲與一個標準的PHP哈希(在password_hash()方法)
當改變用戶的密碼,我必須得到當前密碼(用於登錄的密碼),並將新散列密碼放入數據庫時將其移至舊密碼(最後使用的密碼)列。
問題是:我似乎無法在PDO查詢使用散列密碼,我需要指出的是,我從來沒有與PDO工作過,但谷歌上搜索了一下後,我不認爲我的查詢中有一個錯誤,但在傳遞給該查詢的數據中。
這是我從數據庫
/*prepare and execute a query*/
$sqlStatement = $this->db->prepare("SELECT username, password, oldpassword FROM users WHERE username = :username");
$sqlStatement->bindParam(":username", $username, PDO::PARAM_STR);
$sqlStatement->execute();
/*Fetch the query results*/
$values = $sqlStatement->fetch(PDO::FETCH_ASSOC);
得到所有的當前數據而這正是我嘗試使用PDO SQL查詢
/*Create variables to use in querys*/
$queryPassword = password_hash($password, PASSWORD_DEFAULT);
/*Update the passwords*/
$sqlStatement2 = $this->db->prepare("UPDATE password, oldPassword VALUES (:password, :oldpassword)");
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR);
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR);
$sqlStatement2->execute();
$密碼來存儲數據到數據庫和$ username是從窗體傳遞的變量,到更改用戶密碼的函數。
public function updateUserPasswords($username, $password){
我感到奇怪的是:如果我做的var_dump在$值[ 「密碼」]我得到以下數據:
字符串(60) 「$ 2Y $ 10 $ BBCpJxgPa8K.iw9ZporxzuW2Lt478RPUV/JFvKRHKzJhIwGhd1tpa」
我在哪裏查詢錯誤,給了我下面的數據:
$ 2Y $ 10 $
就好像只哈希被髮送到查詢。
== ==編輯
SQL錯誤發送到瀏覽器:
Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES ('$2y$10$AC.aMG/gNV9zwGB/v/g7keW9jsZ80kuejrSh693DPuhOYChFxA6wu', '$2y$10$' at line 1' in /srv/jip/www/www.jip.nl/classes/user.class.php:92 Stack trace: #0 /srv/jip/www/www.jip.nl/classes/user.class.php(92): PDOStatement->execute() #1 /srv/jip/www/www.jip.nl/pages/first_login.php(26): User->updateUserPasswords('username', 'password') #2 {main} thrown in /srv/jip/www/www.jip.nl/classes/user.class.php on line 92
你爲什麼使用散列字符串作爲輸入?你只需要傳遞原始密碼,並在MYSQL端進行加密。你的var轉儲也很好。 –
@ noobie-php你能解釋一下你的評論嗎?我在OP代碼中看不到有關密碼政策的任何問題。 –
你正在更新你的表中的所有tehe密碼 –