摄影项目报价系统:foreach内嵌while循环致表格行缺失问题
问题修复方案
核心问题分析
- 原代码中
echo $event_code = $row['event_code'];的写法会直接输出变量赋值结果,且未配合表格HTML标签,打乱了表格DOM结构,导致浏览器仅能解析第一行,后续行被当作无效内容忽略。 - 循环内多次执行SQL查询不仅效率低下,还可能因数据库资源占用问题引发后续查询异常。
修复步骤与代码示例
步骤1:优化SQL查询,减少数据库交互
改用IN语句一次性获取所有选中活动的详情,避免循环内重复查询:
// 对拆分后的活动代码做转义,防范SQL注入 $escaped_events = array_map(function($code) use ($con) { return mysqli_real_escape_string($con, $code); }, $explode_events); $event_codes_str = implode(',', array_map(function($code) { return "'$code'"; }, $escaped_events)); // 一次性查询所有目标活动 $event_name_query = "SELECT * FROM event_types WHERE event_code IN ($event_codes_str)"; $select_posts = mysqli_query($con, $event_name_query); // 将查询结果存入数组,方便后续快速调用 $event_details = []; while($row = mysqli_fetch_assoc($select_posts)) { $event_details[$row['event_code']] = $row; }
步骤2:正确构建表格行,保证HTML结构完整
遍历活动时,用标准表格标签包裹内容,确保DOM结构合法:
// 假设已打开表格的<tbody>标签 foreach($explode_events as $explode){ if(isset($event_details[$explode])){ $event_code = $event_details[$explode]['event_code']; $event_amount = $event_details[$explode]['event_amount']; // 根据实际表格结构调整<td>内的内容和样式 echo "<tr> <td>$event_code</td> <td>$event_amount</td> </tr>"; } } // 记得关闭<tbody>和<table>标签
步骤3:更安全的预处理语句方案
推荐使用预处理语句进一步提升SQL安全性,避免注入风险:
$placeholders = implode(',', array_fill(0, count($explode_events), '?')); $stmt = mysqli_prepare($con, "SELECT * FROM event_types WHERE event_code IN ($placeholders)"); mysqli_stmt_bind_param($stmt, str_repeat('s', count($explode_events)), ...$explode_events); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $event_details = []; while($row = mysqli_fetch_assoc($result)) { $event_details[$row['event_code']] = $row; }
内容的提问来源于stack exchange,提问作者Vamshi G
相关产品推荐
相关产品推荐

