PHP从当前会话导出CSV文件出现列数据重复问题该如何解决?
问题根因
核心原因是PDO查询结果默认返回混合格式数组:
PDO的fetch()方法默认使用PDO::FETCH_BOTH作为提取模式,返回的数组同时包含数字索引(0、1、2……)和关联索引(字段名)两类下标,每列的值会在数组中重复出现两次。调用fputcsv()写入文件时会遍历数组所有元素,最终表现为CSV每列数据重复。
修复方法
修改fetch()的提取模式,指定仅返回关联数组或者仅返回数字索引数组即可:
// 方案1:仅返回关联数组(下标为表字段名) while ($row = $q->fetch(PDO::FETCH_ASSOC)) { fputcsv($fh, $row); } // 方案2:仅返回数字索引数组 while ($row = $q->fetch(PDO::FETCH_NUM)) { fputcsv($fh, $row); }
其他需要修复的代码隐患
- 变量作用域错误:
$db是全局变量,在process()函数内使用前需要加global $db;声明,否则会抛出未定义变量错误 - Session键名不匹配:你存入Session的是
$_SESSION['user'] = $_POST['first_name'],但查询时使用的是$_SESSION['user_fname'],会导致查询条件为空,无法匹配到刚插入的数据 - Header格式错误:
Content-disposition头中filename后面应该用等号而非冒号,正确写法为header('Content-Disposition: attachment; filename=info.csv'); - SQL注入风险:直接将变量拼接进SQL语句,建议改用预处理查询规避风险
- 验证函数逻辑不严谨:
validate()函数验证失败时没有显式返回false,可能导致逻辑异常
内容的提问来源于stack exchange,提问作者di3po
相关产品推荐
相关产品推荐

