You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

摄影项目报价系统: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 14:05:23