未捕获的PDOException:带有UPDATE的SQLSTATE [HY093]

时间:2017-07-04 17:43:26

标签: php pdo

我正在尝试创建一个更改用户密码的功能:

    public function ChangePassword($password)
    {
        $query = $this->db->prepare("UPDATE users SET password = :password WHERE id=:user_id");
        $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
        $query->bindParam("password", $hash, PDO::PARAM_STR);
        $query->execute();
        return true;
    }   

但是它显示了“Uncaught PDOException:SQLSTATE [HY093]”。当我使用

$query = $this->db->prepare("INSERT INTO users(password) VALUES (:password)");

而不是

$query = $this->db->prepare("UPDATE users SET password = :password WHERE id=:user_id");

它有效,意味着我得到一个带密码条目的附加行。我没有找到显示正确使用UPDATE的文档。

4 个答案:

答案 0 :(得分:0)

您必须为SQL字符串中的每个参数占位符提供绑定值。不多也不少。

所以你需要这样的东西:

    $query->bindParam("user_id", $userid);

但我注意到你的函数中没有任何$ userid。你需要那个。

答案 1 :(得分:0)

  

喜欢这样:

 public function ChangePassword($password,$user_id)
    {
        $query = $this->db->prepare("UPDATE users SET password = :password WHERE id=:user_id");
        $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
        $query->bindParam("password", $hash, PDO::PARAM_STR);
        $query->bindParam("user_id",$user_id);
        $query->execute();
        return true;
    }   
  

注意: bindParam user_id并传递参数user_id,如下所示:ChangePassword($password,$user_id)

答案 2 :(得分:0)

检查完整的错误消息,这提供了相当多的提示! SQLSTATE [HY093]表示"参数号无效"

缺少参数user_id

public function ChangePassword($password, $userId)
{
    $query = $this->db->prepare("UPDATE users SET password = :password WHERE id=:user_id");
    $hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
    $query->bindParam("password", $hash, PDO::PARAM_STR);
    $query->bindParam("user_id", $userId, PDO::PARAM_STR);
    $query->execute();
    return true;
}  

答案 3 :(得分:0)

我相信当用户登录时,当前登录的用户ID会存储在会话中。

因此,这就是你所需要的。

我相信当用户登录时,当前登录的用户ID会存储在会话中。

因此,这就是你所需要的。

 <?php
function ChangePassword($password)
{   


    $hash = password_hash($password, PASSWORD_BCRYPT,['cost' => 10]);

    $query = $this->db->prepare("UPDATE users SET password = :password WHERE id=:user_id")->execute(array(
        ":password" => $hash,":user_id" => $_SESSION['userid']));
    return true;
}
?>