PHP foreach循环中AND条件判断失效,仅更新最后一行数据问题
问题分析与修复方案
看起来你碰到了两个头疼的问题:循环里只更新了最后一行数据,还有if ($updateInvoiceAddedItems AND $updateInvoiceSubtractedItems)那行的报错。我来帮你一步步拆解解决:
1. 报错根源:未定义变量的逻辑判断失误
你的代码里,每次循环只会走if($addedQTY > 0)或者elseif($subtractedQty > 0)其中一个分支,这就意味着另一个分支的变量(比如走added分支时,$updateInvoiceSubtractedItems根本没被定义)。当你用AND同时判断两个变量时,PHP会抛出未定义变量的Notice错误,而且这个条件永远不可能成立——毕竟总有一个变量不存在或者为false。
2. 只更新最后一行的原因:提前终止脚本的exit语句
你把exit放在了循环内部的成功判断里,这意味着只要有一次update执行后(哪怕逻辑判断有问题),脚本就直接终止了,后面的循环迭代根本没机会运行。你说只更新最后一行,大概率是前面的迭代都触发了else的错误提示,只有最后一次迭代的某种情况让错误没触发,但本质上exit打断了所有后续更新操作。
修复后的完整代码
if (isset($_POST['submit'])) { // 初始化全局成功状态,用于循环结束后统一提示 $allUpdatesSuccess = true; foreach($_POST['data'] as $key => $value) { $invoiceItemId = intval($value['invoiceItemId']); $itemId = intval($value['ItemId']); $QTY = intval($value['QTY']); $addedQTY = intval($value['addedQTY']); $subtractedQty = intval($value['subtractedQty']); $Total = is_numeric($value['total']) ? $value['total'] : false; try { $currentUpdateSuccess = false; // 当前条目的更新状态 if($addedQTY > 0) { // 修复了SQL参数名里的空格(原代码里`: addedQTY`有空格,会导致绑定失败) $updateInvoiceAddedItems = $db->prepare("UPDATE `invoiceItems` SET qty = qty + :addedQTY, addedQty = addedQty + :addingQTY where id = :Iid"); $currentUpdateSuccess = $updateInvoiceAddedItems->execute(array( ':Iid' => $itemId, ':addedQTY' => $addedQTY, ':addingQTY' => $addedQTY // 原代码里写的$addedQty,注意变量名大小写统一 )); } elseif($subtractedQty > 0) { $updateInvoiceSubtractedItems = $db->prepare("UPDATE `invoiceItems` SET qty = qty - :subtractedQty, subtractedQty = subtractedQty + :subtractingQty where id = :iiId"); $currentUpdateSuccess = $updateInvoiceSubtractedItems->execute(array( ':iiId' => $itemId, ':subtractedQty' => $subtractedQty, ':subtractingQty' => $subtractedQty )); } // 如果当前条目更新失败,标记全局状态为失败 if (!$currentUpdateSuccess) { $allUpdatesSuccess = false; } } catch (PDOException $e) { echo 'Connection failed: '.$e->getMessage(); $allUpdatesSuccess = false; break; // 遇到异常可以选择终止循环,或者继续执行,这里根据你的需求调整 } } // 循环全部执行完后,统一提示结果 if ($allUpdatesSuccess) { echo '<script> alert("所有条目更新成功") </script>'; } else { echo '<script> alert("部分或全部条目更新失败") </script>'; } }
额外需要注意的细节
- 原SQL语句里的参数名有空格(比如
: addedQTY),这会导致PDO无法正确绑定参数,已经在修复代码里去掉了空格; - 注意变量名大小写:原代码里的
$addedQty(小写q)应该和定义的$addedQTY(大写Q)统一,避免变量未定义的问题; - 如果需要更精细的错误反馈,可以记录每个失败条目的信息,最后一起展示给用户。
内容的提问来源于stack exchange,提问作者SamDasti
相关产品推荐
相关产品推荐

