PHP通过MySQL预处理语句更新值

时间:2014-01-18 20:08:10

标签: 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;
}

$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语法问题。任何帮助都会非常感激!

3 个答案:

答案 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命令

的更多信息