在PHP PDO
好更新数据错误,我用PHP与PDO扩展作为数据库驱动程序工作周围。在PHP PDO
我正在那里的东西是相当弄乱了我一个“更改密码”情景:(
我们(有些#1助手,奖励!)设法验证当前密码的密码,但它不更新的数据,因为我认为
这里是相遇场景:
哟你正在改变你的密码从quora到*。我们知道,如果你更改了密码,则无法使用旧密码,但在我的情况,你可以使用旧的密码,但不是新的,使得新已废弃。
这里是我的代码片段一:
所有的
$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!');
}
首先,请确保您可以通过以下包括行到你的页面的顶部看到错误。
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...
我需要消毒领域,以避免注射和防止从字段中插入一些* raw *数据。谢谢,我不知道我是哈希当前密码而不是新密码:) – astronomicalXoom
@astronomicalXoom不客气!事实上,自从您使用准备好的陈述以来,您不必担心注射。 (http://php.net/manual/en/pdo.prepared-statements.php) – jetblack
我无法在这里看到的问题。 –
你有两个'?'-placeholders,但只有一个通过'execute' –
传递价值@u_mulder它也将失败'执行(阵列(password_hash($密码,$ _SESSION [ '账户'] [ '用户名']) '不能按引用传递,*等* ... –