【问题标题】:PHP UPDATEing values through MySQL prepared statementPHP 通过 MySQL 准备好的语句更新值
【发布时间】:2014-01-18 20:08:10
【问题描述】:

很抱歉再次发布有关准备好的语句,但我对 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 语法问题。任何帮助都将非常感激!

【问题讨论】:

  • 错误很明显。表中的cat_id 被声明为唯一的,并且您将重复值放在多行中。更改表以满足您的需要(通过删除unique 约束)或修复您的代码以使用表定义。没有语法问题。
  • 感谢您的回复。我想确保数据库包含与数组相同的值。所以如果一个项目被添加到数组中,它应该被添加到数据库中。如果将其从阵列中删除,则应将其从数据库中删除。 cat_id 是唯一的并且仅与一个标签相关,这一点很重要。 UPDATE 是错误的方法吗?

标签: php mysql prepared-statement


【解决方案1】:

您的更新查询中没有 WHERE 子句,因此它将尝试将每条记录中的所有 catid 更改为,在本例中为“0”。这就是为什么它给你错误。它尝试为每条记录设置相同的 catid,但它必须是唯一的。您需要在查询中添加 WHERE 子句,具体取决于要更改的记录。就像 WHERE id=:id 一样。或在哪里 catid=:catid。我不认为您想更改每条记录?

【讨论】:

    【解决方案2】:

    我相信你想要的更新声明是:

    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);
    

    【讨论】:

    • 再次感谢您的宝贵时间。如果我将一个项目添加到数组中,这两个都会更新数据库,但如果从数组中删除一个项目,它们都不会从数据库中删除项目。
    • @StuartBrown 。 . .正确的。当我读到你的问题时,那不在里面。
    • 对不起,我试图在“但是我试图弄清楚如何创建更新(如果从 $sitecategories 添加或删除项目)”中表达这一点
    • @StuartBrown 。 . .一种正确的做法是在代码中编写用于操作数组的函数(一个添加元素,一个删除元素)。 使用这些功能。该函数维护数组数据库表。
    • 很好,感谢您的建议。我会继续努力的
    【解决方案3】:

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

    请参阅此文档以了解有关MySQL 命令的更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多