从SQL数据生成HTML表格时出现多余列的问题求助
问题分析与修复方案
为什么会生成8列的表格?
从你给出的print_r($data)输出就能找到核心原因:你的查询结果数组同时包含了关联索引(字段名如Place、Car)和数字索引(0、1),相当于每一列的数据被重复存储了两次。当你用count($row)统计列数时,会把两种索引的键都算进去,原本的4列自然就变成了8列。
两种快速修复方法
方法1:从源头避免重复数据(推荐)
这是最高效的解决方式——修改你获取SQL结果的代码,让它只返回一种索引类型:
- 如果你用的是
mysqli扩展:- 把
mysqli_fetch_array()换成mysqli_fetch_assoc()(后者只返回关联数组) - 或者保持
mysqli_fetch_array(),但传入第二个参数MYSQLI_ASSOC,示例代码:$data = []; while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { $data[] = $row; }
- 把
- 如果你用的是PDO:
- 设置结果集的获取模式为
PDO::FETCH_ASSOC,示例代码:$stmt->setFetchMode(PDO::FETCH_ASSOC); $data = $stmt->fetchAll();
- 设置结果集的获取模式为
处理后,$data里的每个行数组就只有字段名作为键,count($row)会正确返回4,生成的表格就是正常的4列了。
方法2:修改HTML生成函数适配现有数据
如果暂时不想调整查询代码,也可以在生成表格时过滤掉数字索引的键:
function generate_HTMLTable($data){ $tr = ""; foreach ($data as $row) { $td = ""; // 只遍历非数字键的字段 foreach($row as $key => $value) { if (!is_numeric($key)) { $td .= "<td>$value</td>\n"; } } $tr .= "<tr>" . $td . "</tr>\n"; } return "\n<table>" . $tr . "</table>\n"; }
不过这种方式属于“事后补救”,不如第一种从源头解决来得高效。
内容的提问来源于stack exchange,提问作者user11425967
相关产品推荐
相关产品推荐

