gpt4 book ai didi

php - 无法使用 PDO 更新行

转载 作者:太空宇宙 更新时间:2023-11-03 11:13:37 26 4
gpt4 key购买 nike

当我运行以下代码时:

  // Loop through each store and update shopping mall ID

protected function associateShmallToStore($stores, $shmall_id) {

foreach($stores as $store_id) {
$sql .= 'UPDATE my_table SET fk_shmallID = :shmall_id WHERE id = :store_id';
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':shmall_id', $shmall_id);
$stmt->bindParam(':store_id', $store_id);
$stmt->execute();
}

}

我收到以下消息:
警告:PDOStatement::execute() [pdostatement.execute]:SQLSTATE[HY093]:无效参数编号:混合命名参数和位置参数

我也尝试了以下但没有成功(没有 $stmt->bindParam):
$stmt->execute(array($shmall_id, $store_id));

我不明白我做错了什么。

更新我已经更新了我的代码以反射(reflect)我在源代码中实际得到的内容。此处不应有任何错别字。

更新 2
我试过了,但仍然收到相同的错误消息。

  protected function associateShmallToStore($stores, $shmall_id) {
$i = 0;

$sql .= "UPDATE sl_store ";

foreach($stores as $store_id) {
$i++;
$sql .= 'SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_'.$i.',';
}

$sql = removeLastChar($sql);
$stmt = $this->db->prepare($sql);

$stmt->bindParam(':shmall_id_'.$i, $shmall_id);

$i = 0;
foreach($stores as $store_id) {
$i++;
$stmt->bindParam(':store_id_'.$i, $store_id);
}

$stmt->execute();
}

这是 SQL 查询的输出:

UPDATE sl_store 
SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_1,
SET fk_shmallID = :shmall_id, lastUpdated = NOW() WHERE id = :store_id_2

更新 3
我最终使用的代码是这样的:

    foreach($stores as $store_id) {
$sql = "UPDATE sl_store SET fk_shmallID = :shmall_id WHERE id = :store_id";
$stmt = $this->db->prepare($sql);
$stmt->bindParam(':shmall_id', $shmall_id);
$stmt->bindParam(':store_id', $store_id);
$res = $stmt->execute();
}

最佳答案

正如错误所说,您混合了命名参数和位置参数:

  • :name(命名)
  • :person_id(命名)
  • ?(位置)

不仅如此,您还有命名参数 :person_id,但您要绑定(bind)到 :id

这些是你的参数,我称它们为 P1P2P3:

UPDATE my_table SET name = :name WHERE id = :person_id ?
^ P1 ^ P2 ^ P3

这是你绑定(bind)它们的地方:

  $stmt->bindParam(':name', $name); // bound to P1 (:name)
$stmt->bindParam(':id', $person_id); // bound to nothing (no such param :id)

您可能希望将第二个参数绑定(bind)到 :person_id,而不是 :id,并删除最后一个位置参数(查询末尾的问号).

此外,通过 foreach 循环的每次迭代都会向查询追加更多内容,因为您使用的是连接运算符而不是赋值运算符:

$sql .= 'UPDATE my_table SET name = :name WHERE id = :person_id ?';

您可能想在 = 之前删除 .

有关此的更多信息,请查看 Prepared statements and stored procedures PDO手册中的页面。您将了解如何绑定(bind)参数以及命名参数和位置参数之间的区别。

总结一下:

  1. 将 SQL 行替换为:

    $sql = 'UPDATE my_table SET name = :name WHERE id = :person_id';
  2. 将第二个 bindParam() 调用替换为:

    $stmt->bindParam(':person_id', $person_id);

关于php - 无法使用 PDO 更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6829324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com