我很遗憾再次发布关于准备好的陈述,但我对PHP / MySQL很陌生,并且对准备好的陈述完全不熟悉。
我的代码如下:
function query($query, $bindings, $conn) {
$stmt = $conn->prepare($query);
$stmt->execute($bindings);
//$results = $stmt->fetchAll();
return $results ? $results : false;
}
$sitecategories = array(
0 => "Uncategorized", 10 => "Abstract", 11 => "Animals"
);
foreach ($sitecategories as $key => $value) {
if ( $conn ) {
$catquery=query("INSERT IGNORE into categories (cat_id, label) VALUES (:catid, :label)",
array(':catid'=>$key, ':label'=>$value),
$conn);
} else {
print "could not connect to the database";
}
}
连接在其他地方,但INSERT工作正常。生成的mysql表如下所示(cat_id是唯一的):
+----+--------+-------------+
| id | cat_id | label |
+----+--------+-------------+
| 1 | 0 | Uncategoriz |
| 2 | 10 | Abstract |
| 3 | 11 | Animals |
但是我想弄清楚如何创建更新(如果在$ sitecategories中添加或删除项目)。我将INSERT改编为
foreach ($sitecategories as $key => $value) {
if ( $conn ) {
$catquery=query("UPDATE categories SET cat_id=:catid, label = :label",
array('catid'=>$key, 'label'=>$value),
$conn);
} else {
print "could not connect to the database";
}
}
然而,当我运行这个时,我得到了
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity
constraint violation: 1062 Duplicate entry '0' for key 'cat_id''
我猜这与cat_id是唯一的有关,这个问题与我准备好的语句无关,但是是一般的MySQL语法问题。任何帮助都会非常感激!
答案 0 :(得分:0)
您的更新查询中没有WHERE子句,因此它会尝试将每个记录中的所有catid更改为“0”。这就是它给你错误的原因。它试图为每个记录设置相同的catid,而它必须是唯一的。您需要在查询中添加WHERE子句,具体取决于要更改的记录。就像WHERE id =:id一样。或者在哪里catid =:catid。我不认为你想改变每一条记录?
答案 1 :(得分:0)
我相信你想要的更新声明是:
UPDATE categories
SET label = :label
WHERE cat_id=:catid;
如果:catid
可能会或可能不在表格中,那么您可以使用insert . . . on duplicate key update
:
INSERT INTO categories(catid, label)
VALUES (:cat_id, :label)
ON DUPLICATE KEY UPDATE label = VALUES(label);
答案 2 :(得分:0)
在查询中添加where子句。更新命令需要知道要更新的行,并在where子句中提供此详细信息。添加where子句可以消除您的错误。
请参阅此文档以了解有关MySQL命令
的更多信息