PHP通过MySQL语句更新值

PHP通过MySQL语句更新值,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,我很抱歉再次发布关于准备好的语句,但我对PHP/MySQL非常陌生,对准备好的语句也完全陌生 我有如下代码: function query($query, $bindings, $conn) { $stmt = $conn->prepare($query); $stmt->execute($bindings); //$results = $stmt->fetchAll(); return $results ? $results : false; } $site

我很抱歉再次发布关于准备好的语句,但我对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";
       }
}
连接在别处,但插入件工作正常。生成的mysql表看起来像下面的cat_id是唯一的:

+----+--------+-------------+
| id | cat_id | label       |
+----+--------+-------------+
|  1 |      0 | Uncategoriz |
|  2 |     10 | Abstract    |
|  3 |     11 | Animals     |
但是,我正在试图弄清楚如何为从$sitecategories添加或删除的项目创建更新。我把插页改为

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语法问题。任何一方的帮助都将不胜感激

更新查询中没有WHERE子句,因此它将尝试将每个记录中的所有catid更改为0。这就是它给你错误的原因。它尝试为每个记录设置相同的catid,但它必须是唯一的。您需要向查询中添加WHERE子句,具体取决于要更改的记录。比如id=:id.或者catid=:catid。我不认为您想要更改每一条记录?

我相信您想要的更新语句是:

UPDATE categories
    SET label = :label
    WHERE  cat_id=:catid;
如果:catid可能在表中,也可能不在表中,则可以使用insert。在重复密钥更新时:


向查询中添加where子句。Update命令需要知道要更新的行,并在where子句中提供此详细信息。添加where子句可以消除错误


有关命令的详细信息,请参阅本文档

错误非常清楚。表中的cat_id被声明为唯一的,并且您正在多行中放置重复的值。通过删除唯一约束更改表以满足您的需要,或者修复代码以使用表定义。没有语法问题。谢谢你的回复。我希望确保数据库包含与数组相同的值。因此,如果一个项目被添加到数组中,它应该被添加到数据库中。如果将其从阵列中删除,则应将其从数据库中删除。重要的是,cat_id是唯一的,并且只与一个标签相关。更新是错误的方法吗?再次感谢您的时间。如果我向数组中添加一个项,这两个选项都将更新数据库,但如果从数组中删除一个项,这两个选项都不会从数据库中删除该项。@StuartBrown。对的当我读到你的问题时,你的问题不在其中。很抱歉,我曾试图在中表达这一点,但我试图找出如何为添加或删除项目创建更新$sitecategories@StuartBrown . . . 一种正确的方法是在代码中编写用于操纵数组的函数,一个用于添加元素,一个用于删除元素。只使用这些功能。函数维护数组和数据库表。太好了,谢谢你的建议。我要继续讲下去
INSERT INTO categories(catid, label)
    VALUES (:cat_id, :label)
    ON DUPLICATE KEY UPDATE label = VALUES(label);