首页 >数据库 >mysql教程 >为什么我的 PHP PDO 准备语句抛出'SQLSTATE[HY093]:无效的参数号”?

为什么我的 PHP PDO 准备语句抛出'SQLSTATE[HY093]:无效的参数号”?

Patricia Arquette
Patricia Arquette原创
2024-12-16 08:48:16865浏览

Why Does My PHP PDO Prepared Statement Throw

PHP PDOException: "SQLSTATE[HY093]: Invalid Parameter Number"

调试 PHP PDOException 可能具有挑战性,尤其是当遇到“SQLSTATE[HY093]:无效的参数号”错误。此错误通常表明在预准备语句中命名参数的使用不正确。

考虑以下 PHP 代码:

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

执行此函数时,出现错误“SQLSTATE[HY093]: Invalid”参数号”可能会出现。根本原因在于调用execute()方法的行。具体来说,ON DUPLICATE KEY UPDATE hash=:hash 子句对插入和更新操作使用相同的参数名称“:hash”。

要解决此问题,您需要提供唯一的参数名称更新子句中的哈希值。下面是更正后的代码:

$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)
);

通过为更新子句中的哈希值提供唯一的参数名称“:hash2”,您可以解决“SQLSTATE[HY093]:无效的参数号”错误。这确保了 PDO 驱动程序可以正确地将参数映射到准备好的 SQL 语句。

以上是为什么我的 PHP PDO 准备语句抛出'SQLSTATE[HY093]:无效的参数号”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn