INSERT INTO b (id, website...)
VALUES (:id, :website...)
ON DUPLICATE KEY UPDATE
website=:website ...
Run Code Online (Sandbox Code Playgroud)
我有一个MYSQL QUERY,我有SET id唯一,为什么
website=:website ...
Run Code Online (Sandbox Code Playgroud)
不工作,当我改变website="whatever"它的工作.谁知道为什么?
$job_B->bindValue(':website', $website, PDO::PARAM_STR);
Run Code Online (Sandbox Code Playgroud)
您在准备好的声明中遇到了PDO命名参数的不幸和误导行为.尽管指定了名称,但实际上不能多次使用参数,如prepare()文档中所述:
调用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);
Run Code Online (Sandbox Code Playgroud)
作为一般提示,在执行操作时,不应该"复制"插入的值ON DUPLICATE KEY.Mysql VALUES()为此提供了功能,例如
INSERT INTO foo (bar) VALUES (:baz)
ON DUPLICATE KEY UPDATE bar := :baz
Run Code Online (Sandbox Code Playgroud)
可以更好地重写为
INSERT INTO foo (bar) VALUES (:baz)
ON DUPLICATE KEY UPDATE bar = VALUES(bar)
^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
VALUES()将自动重用分配给该部分中指定字段的值VALUES (...),而不需要将另一个变量绑定到查询中.