ON DUPLICATE KEY UPDATE无法在PDO中工作

时间:2013-06-10 16:43:03

标签: php mysql

INSERT INTO b (id, website...) 
VALUES (:id, :website...)
ON DUPLICATE KEY UPDATE  
website=:website ...

我有一个MYSQL QUERY,我有SET id唯一,为什么

website=:website ...

无效,当我更改为website="whatever"时,它可以正常工作。有谁知道为什么?

$job_B->bindValue(':website', $website, PDO::PARAM_STR);

2 个答案:

答案 0 :(得分:5)

您在准备好的声明中遇到了PDO命名参数的不幸和误导行为。尽管指定了名称,但您实际上不能多次使用参数as mentioned in the prepare() documentation:

  

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

这意味着您需要将参数绑定两次,使用两个不同的名称,然后进行两次不同的bindValue()调用:

$stmt = $pdo->prepare("
  INSERT INTO b (id, website...) 
  VALUES (:id, :website_insert...)
  ON DUPLICATE KEY UPDATE  
    website=:website_update ...
");

// Later, bind for each
$job_B->bindValue(':id', ...);
// Same value twice...
$job_B->bindValue(':website_insert', $website, PDO::PARAM_STR);
$job_B->bindValue(':website_update', $website, PDO::PARAM_STR);

答案 1 :(得分:5)

作为一般提示,在执行ON DUPLICATE KEY时,不应该“复制”插入的值。 Mysql为此提供了VALUES()函数,例如

INSERT INTO foo (bar) VALUES (:baz)
ON DUPLICATE KEY UPDATE bar := :baz

可以更好地重写为

INSERT INTO foo (bar) VALUES (:baz)
ON DUPLICATE KEY UPDATE bar = VALUES(bar)
                              ^^^^^^^^^^^

VALUES()会自动重复使用分配给VALUES (...)部分中指定字段的值,而无需将其他变量绑定到查询中。