当我尝试运行以下函数时,我收到错误“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;
}
我觉得这很简单,我只是没有抓住。有什么想法吗?
答案 0 :(得分:39)
尝试:
$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()子句。
答案 1 :(得分:15)
这是使用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
答案 2 :(得分:3)
我知道这是一个老问题,但我认为值得注意的是,更合适的解决方案是通过适当利用SQL来避免PHP中笨重的变通方法:
INSERT INTO `persist` (`user_id`, `hash`, `expire`)
VALUES (:user_id, :hash, :expire)
ON DUPLICATE KEY UPDATE `hash`=VALUES(`hash`)
这样,您只需要发送一次值。
答案 3 :(得分:-2)
$stmt = $con->prepare("INSERT INTO items(Name, Description, Price, Country_Made, Status, Add_Date) VALUES( :zname, :zdesc, :zprice, :zcountry, zstatus, now())");
$stmt-> execute(array(
"zname" => $name,
"zdesc" => $desc,
"zprice" => $price,
"zcountry" => $country,
"zstatus" => $status
));