PDO - foreach 只更新最后一个

Posted

技术标签:

【中文标题】PDO - foreach 只更新最后一个【英文标题】:PDO - foreach only update the last one 【发布时间】:2015-02-26 00:21:11 【问题描述】:

我是 PDO 的新手,在更新数据库中的数组值时遇到问题。除了更新数组中的多个值之外,一切正常。

带有 php 代码的 html

<?php  
$next = 0;
echo '<ul>';
$sql = "SELECT * FROM customers LEFT JOIN products ON customers.product_code = products.product_code RIGHT JOIN transactions ON customers.transcode = transactions.transcode WHERE transactions.id = '$id'";

foreach ($pdo->query($sql) as $row) 
   echo '<li>'.$row['product_name'] .' x <input name="p_qty['.$next++.']" type="number" value="'. $row['p_quantity'] .'"></li>';                    

echo '</ul>';
?>

输出:

MVP 令人难以置信的散装获得者(8 磅)x 2 MVP 令人难以置信的批量获得者 (16 磅)x 2 Elite Labs 100% Isoblend(4 磅)x 2

每当我尝试更改第三个结果的数量时,第一和第二个数量也随之而来。

这是 PDO 代码:

$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "UPDATE transactions JOIN customers ON transactions.transcode = customers.transcode SET transactions.transcode = ?, date = ?, customers.custname = ?, payment = ?, status = ?, customers.p_quantity = ? WHERE transactions.id = ?";
$q = $pdo->prepare($sql);

foreach($_POST['p_qty'] as $qty)
    $q->execute(array($transcode, $date, $custname, $payment, $status, $qty, $id));

Database::disconnect();
header("Location: index.php");

【问题讨论】:

ORDER BY somefield LIMIT 1,或者如果您不知道如何订购LIMIT 2, 1并希望UPDATE将按照与SELECT相同的顺序处理记录 【参考方案1】:

您的 select 语句正在为相关事务 ID 提取这 3 行。

您的更新语句的 where 子句也仅通过事务 ID 拉取,这意味着它将匹配这 3 行。

如果您希望更新语句仅更改其中一种产品的数量,则需要向 where 子句传递一个附加字段。

【讨论】:

感谢您的回答,但我对这个 PDO 的东西还是很陌生。我怎样才能添加额外的字段。你能给出一个线索/一个例子吗?我正在使用与更新单个名称、地址等相同的代码......但是当涉及到数组时......我只能更新最后一个。我试过回显 $_POST['p_qty'],它按数组顺序正确显示,但只更新最后一个。 您的产品和交易表的架构是什么?

以上是关于PDO - foreach 只更新最后一个的主要内容,如果未能解决你的问题,请参考以下文章

PHP Mysql PDO查询来自foreach存储的多个值以供输出

PDO - 对多个 foreach 循环使用相同的查询

Laravel foreach 形式只需要最后一行[重复]

删除foreach最后一个逗号PHP [重复]

使用 PDO 插入/更新辅助函数

如果需要,插入更新 pdo mysql 查询并获取最后插入的 id