PHP导出勾选数据至CSV:表头缺失与数据重复问题求助
问题修复:PHP导出CSV表头缺失+数据重复
问题根源
表头不显示:
- 代码虽已写入表头,但如果
conexion.php存在多余空格、换行等隐性输出,会导致HTTP头无法正常发送,CSV内容被干扰。 - 原代码中
Content-Disposition里的文件名使用了HTML实体",可能导致浏览器解析异常,影响表头显示。
- 代码虽已写入表头,但如果
数据重复:
循环中错误地将迭代变量$value(存储选中的ID)重新赋值为SQL语句,导致后续循环时$value不再是原始ID,重复执行同一条SQL,输出重复数据。
修复后的代码
<?php require 'includes/conexion.php'; // 检查是否有选中数据 if (!isset($_POST['casilla']) || !is_array($_POST['casilla'])) { exit('No se ha seleccionado ningun dato para la exportacion'); } $delimiter = ","; $filename = "equipos_" . date('Y-m-d') . ".csv"; // 创建内存文件指针 $f = fopen('php://memory', 'w'); // 写入CSV表头 $fields = [ 'hostName', 'nSerie', 'modelo', 'cargador', 'maletin', 'docking', 'ratonTeclado', 'notas', 'user_id' ]; fputcsv($f, $fields, $delimiter); // 遍历选中的ID,查询并写入数据 foreach ($_POST['casilla'] as $id) { // 使用参数化查询避免SQL注入,同时避免变量名冲突 $sql = "SELECT * FROM informatica WHERE id = ? LIMIT 1"; $stmt = $mysqli->prepare($sql); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); if ($d = $result->fetch_assoc()) { $lineData = [ $d['hostName'], $d['nSerie'], $d['modelo'], $d['cargador'], $d['maletin'], $d['docking'], $d['ratonTeclado'], $d['notas'], $d['user_id'] ]; fputcsv($f, $lineData, $delimiter); } $stmt->close(); } // 将文件指针移到开头 fseek($f, 0); // 设置正确的下载头 header('Content-Type: text/csv; charset=utf-8'); header("Content-Disposition: attachment; filename=\"{$filename}\""); // 输出文件内容 fpassthru($f); fclose($f); exit; ?>
关键修改说明
- 变量名重命名:将循环中的SQL语句变量从
$value改为$sql,避免覆盖原始ID变量$id,解决数据重复问题。 - 参数化查询:替换直接拼接SQL的写法,使用预处理语句,避免SQL注入风险,提升查询稳定性。
- 修复HTTP头:修正文件名的引号写法,添加字符编码声明,确保浏览器正确解析文件。
- 资源释放:手动关闭预处理语句和文件指针,避免资源泄漏。
- 额外检查:确保
conexion.php文件开头无多余空格、换行,结尾可删除?>(或清除?>后的空白),防止隐性输出导致HTTP头失效。
内容的提问来源于stack exchange,提问作者Monica
相关产品推荐
相关产品推荐

