【问题标题】:Uncaught PDOException: SQLSTATE[HY093] with UPDATE未捕获的 PDOException:带有 UPDATE 的 SQLSTATE[HY093]
【发布时间】:2017-07-05 17:51:47
【问题描述】:

我正在尝试创建一个函数来更改用户密码:

    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;
    }   

但它显示了“未捕获的 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 的文档。

【问题讨论】:

  • 您有两个参数,但您只是在ChangePassword 函数中绑定密码。尝试为 :user_id 添加 bindParam

标签: php pdo


【解决方案1】:

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

所以你需要这样的东西:

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

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

【讨论】:

【解决方案2】:

检查完整的错误信息,这给出了相当的提示! 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】:

    这样做:

     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)

    【讨论】:

    • 这也行不通。您没有将 user_id 绑定到占位符
    【解决方案4】:

    我相信当前登录用户的 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;
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多