PHP PDOException: “SQLSTATE[HY093]: Invalid parameter number”

2022-08-30 14:47:11

当我尝试运行以下函数时,我收到错误“SQLSTATE[HY093]:无效的参数编号”:

function add_persist($db, $user_id) {
    $hash = md5("per11".$user_id."sist11".time());
    $future = time()+(60*60*24*14);
    $sql = "INSERT INTO persist (user_id, hash, expire) VALUES (:user_id, :hash, :expire) ON DUPLICATE KEY UPDATE hash=:hash";
    $stm = $db->prepare($sql);
    $stm->execute(array(":user_id" => $user_id, ":hash" => $hash, ":expire" => $future));
    return $hash;
}

我觉得这是一件简单的事情,我只是没有抓住。有什么想法吗?


答案 1

尝试:

$sql = "INSERT INTO persist (user_id, hash, expire)
        VALUES (:user_id, :hash, :expire)
        ON DUPLICATE KEY UPDATE hash=:hash2";

$stm->execute(
    array(":user_id" => $user_id, 
          ":hash" => $hash, 
          ":expire" => $future,
          ":hash2" => $hash)
);

文档摘录(http://php.net/manual/en/pdo.prepare.php):

在调用 PDOStatement::execute() 时,必须为要传递给语句的每个值包含一个唯一的参数标记。不能在预准备语句中两次使用同名的命名参数标记。不能将多个值绑定到 SQL 语句的 IN() 子句中的单个命名参数。


答案 2

这是使用 PDO 的一个限制。PDO 仅确认查询和执行中的参数数,并在任何不匹配时引发错误。如果您需要在查询中使用参数重复,则必须使用解决方法进行操作

$sql = "insert into persist(user_id, hash, expire) values
    (:user_id, :hash, :value) on duplicate key update
    hash = :hash2";
$stm->execute(array(':user_id' => $user_id, ':hash' => $hash, ':hash2' => $hash,
    ':expire' => $expire));

您可以参考此内容以获取更详细的解决方法 - https://stackoverflow.com/a/7604080/1957346


推荐