在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!'); 
    } 
+1

我无法在这里看到的问题。 –

+1

你有两个'?'-placeholders,但只有一个通过'execute' –

+0

传递价值@u_mulder它也将失败'执行(阵列(password_hash($密码,$ _SESSION [ '账户'] [ '用户名']) '不能按引用传递,*等* ... –

首先,请确保您可以通过以下包括行到你的页面的顶部看到错误。

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