PHP数组值比对触发条件后如何终止循环?if和else同时执行怎么解决
问题原因
- 校验逻辑结构错误:你当前在遍历每个物料的循环内直接判断执行if/else分支,导致每一个符合库存要求的物料都会触发else输出提交提示,只要出现库存不足的物料就触发if弹提示,且检测到异常后没有终止整个流程,最终两个分支都会被执行。
- 提交逻辑位置错误:正常的提交操作应该是所有物料全部校验通过后再统一执行,而不是每校验一个符合要求的物料就执行一次提交逻辑。
- PDO预处理用法错误:你直接把变量拼接到SQL语句中,没有用到预处理的参数绑定能力,存在SQL注入风险。
修正方案
核心思路:先初始化校验通过标记,遍历所有物料做校验,只要有一个不符合就更新标记、记录错误信息并跳出循环,全部校验完成后再根据标记判断是走提交还是报错逻辑。
修正后代码:
if(isset($_POST['btn_action'])){ $material_id = $_POST['material_added_id']; $material_issued = $_POST['material_isseud_weight']; //用户输入的数组 $unit_type = $_POST['unit_type']; $product_id = $_POST['product_id']; $ricip_name = $_POST['ric']; $check_pass = true; //校验标记,默认通过 $error_msg = ''; for($count = 0; $count < count($material_id); $count++) { // 修正PDO预处理写法,避免SQL注入 $qry = "SELECT * FROM material_added_tb WHERE material_added_id = ?"; $statement = $conn->prepare($qry); // 绑定参数执行 $statement->execute([$material_id[$count]]); $result = $statement->fetchAll(PDO::FETCH_ASSOC); $material_weight = 0; $material_name = ''; foreach($result as $value) { $material_weight = $value['material_weight']; $material_name = $value['material_added_name']; } // 比对库存,不符合就更新标记、记录错误并终止循环 if($material_issued[$count] > $material_weight) { $check_pass = false; $error_msg = $material_name . " 库存不足"; break; //直接跳出整个循环,不需要再校验后续物料 } } // 全部校验完成后统一判断 if(!$check_pass) { ?> <script> alert('<?php echo $error_msg;?>'); // window.location.href="../manufacture.php"; </script> <?php } else { // 所有物料都符合要求,在这里统一执行表单提交的业务逻辑 echo "提交表单"; } }
内容的提问来源于stack exchange,提问作者amHafidhJr
相关产品推荐
相关产品推荐

