Jip*_*Jip 1 php mysql passwords hash pdo
我目前是一名3年级网络开发学生,对于一个学校项目,我们必须使用PDO和哈希建立一个带有更改密码功能的网站,但是我遇到了一个我自己无法解决的问题,我也是避风港在google和stackoverflow上都没有发现任何类似的问题.
我们必须在数据库中存储2个密码,旧密码(用户最后使用的密码); 和他们当前的密码(将用于登录.)
所有密码都使用标准PHP哈希存储(password_hash()方法)
更改用户密码时,我必须从数据库中获取当前密码(用于登录的密码),并将新的散列密码放入数据库中,然后将其移至oldpassword(上次使用的密码)列.
问题是:我似乎无法在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);
Run Code Online (Sandbox Code Playgroud)
这是我尝试使用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();
Run Code Online (Sandbox Code Playgroud)
$ password和$ username是从表单传递给函数以更改用户密码的变量.
public function updateUserPasswords($username, $password){
Run Code Online (Sandbox Code Playgroud)
我觉得奇怪的是:如果我对$ values ["password"]执行var_dump,我会得到以下数据:
string(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
Run Code Online (Sandbox Code Playgroud)
不要使用散列密码检索数据,因为password_hash()会在使用时生成具有不同salt的新散列
仅使用用户名检索记录,然后使用password_verify()验证密码
编辑
您的更新查询引用列,但没有表,没有WHERE子句:
$sqlStatement2 = $this->db->prepare("UPDATE users SET password=:password, oldPassword=:oldpassword WHERE username = :username");
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR);
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR);
$sqlStatement2->bindParam(":username", $username, PDO::PARAM_STR);
$sqlStatement2->execute();
Run Code Online (Sandbox Code Playgroud)
绑定适当的值
| 归档时间: |
|
| 查看次数: |
452 次 |
| 最近记录: |