如何使用FPUTCSV结合循环将数据库查询数组写入CSV?
如何将PHP数组数据写入CSV文件?
问题背景
我希望将从数据库查询得到的数组数据填充到CSV文件中,目前已经完成了数据查询、数组转换和响应头设置,但是不知道后续的写入逻辑该怎么实现。以下是我的代码片段:
$sql = "SELECT accountNumber, Name,studentManager,contract, nationality,university,major,Course,specialNotes, Phone,email,birthday,uniAddress FROM " . $dbname . " WHERE id ='$id'"; $query2 = mysqli_query($conn, $sql); $thisArray = mysqli_fetch_all($query2, MYSQLI_NUM); header("Content-type: application/csv"); header("Content-Disposition: attachment; filename=userData.csv"); $fp = fopen('php://output', 'w'); // 后续需完成写入逻辑
解决方案
你可以用PHP自带的fputcsv()函数来搞定这个事儿,它能自动处理CSV格式里的特殊字符(比如逗号、引号),避免出现格式错乱的问题,非常好用。具体实现可以分这几步来:
添加CSV表头(可选但推荐)
你现在拿到的数组只有纯数据,没有列名,建议先写一行表头,这样导出的CSV文件打开后能直接看懂每列是什么内容。表头字段对应你SELECT语句里的列名就行:$headers = ['账号', '姓名', '学生管理员', '合同', '国籍', '大学', '专业', '课程', '特殊备注', '电话', '邮箱', '生日', '学校地址']; fputcsv($fp, $headers);要是习惯用英文列名也没问题,直接用
['accountNumber', 'Name', 'studentManager', ...]就行,看你需求。循环写入数据行
遍历你拿到的$thisArray数组,把每一行数据挨个写入CSV:foreach ($thisArray as $row) { fputcsv($fp, $row); }收尾工作:关闭流
最后记得关闭输出流,释放资源,再加个exit确保后面不会有多余的输出干扰CSV文件:fclose($fp); exit;
完整代码
把以上部分整合到你的代码中,最终完整代码如下:
$sql = "SELECT accountNumber, Name,studentManager,contract, nationality,university,major,Course,specialNotes, Phone,email,birthday,uniAddress FROM " . $dbname . " WHERE id ='$id'"; $query2 = mysqli_query($conn, $sql); $thisArray = mysqli_fetch_all($query2, MYSQLI_NUM); // 设置CSV响应头 header("Content-type: application/csv"); header("Content-Disposition: attachment; filename=userData.csv"); // 防止中文乱码(可选,根据你的编码需求调整) header('Content-Encoding: UTF-8'); // 输出BOM解决Excel打开中文乱码问题(可选) $fp = fopen('php://output', 'w'); fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF)); // 写入表头 $headers = ['accountNumber', 'Name', 'studentManager', 'contract', 'nationality', 'university', 'major', 'Course', 'specialNotes', 'Phone', 'email', 'birthday', 'uniAddress']; fputcsv($fp, $headers); // 写入数据行 foreach ($thisArray as $row) { fputcsv($fp, $row); } // 关闭流 fclose($fp); exit;
额外提示
- 中文乱码问题:如果导出的CSV用Excel打开出现中文乱码,可以添加UTF-8 BOM(就是上面代码中的
fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));),同时设置Content-Encoding头为UTF-8。 - SQL注入风险:你的当前SQL语句直接拼接了
$id变量,存在SQL注入风险,建议改用预处理语句,比如:
这样能有效防止SQL注入,提升代码安全性。$sql = "SELECT accountNumber, Name,... FROM " . $dbname . " WHERE id = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "s", $id); mysqli_stmt_execute($stmt); $query2 = mysqli_stmt_get_result($stmt); $thisArray = mysqli_fetch_all($query2, MYSQLI_NUM);
内容的提问来源于stack exchange,提问作者user9419091
相关产品推荐
相关产品推荐

