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

如何使用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格式里的特殊字符(比如逗号、引号),避免出现格式错乱的问题,非常好用。具体实现可以分这几步来:

  1. 添加CSV表头(可选但推荐)
    你现在拿到的数组只有纯数据,没有列名,建议先写一行表头,这样导出的CSV文件打开后能直接看懂每列是什么内容。表头字段对应你SELECT语句里的列名就行:

    $headers = ['账号', '姓名', '学生管理员', '合同', '国籍', '大学', '专业', '课程', '特殊备注', '电话', '邮箱', '生日', '学校地址'];
    fputcsv($fp, $headers);
    

    要是习惯用英文列名也没问题,直接用['accountNumber', 'Name', 'studentManager', ...]就行,看你需求。

  2. 循环写入数据行
    遍历你拿到的$thisArray数组,把每一行数据挨个写入CSV:

    foreach ($thisArray as $row) {
        fputcsv($fp, $row);
    }
    
  3. 收尾工作:关闭流
    最后记得关闭输出流,释放资源,再加个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 = "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);
    
    这样能有效防止SQL注入,提升代码安全性。

内容的提问来源于stack exchange,提问作者user9419091

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:19:42