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

PHP导出表数据为CSV存入JS变量时fputcsv报参数类型错误如何解决

错误原因

fputcsv() expects parameter 2 to be array报错的核心原因是写入CSV表头时传入了单个字符串,而非数组。原代码中循环遍历第一行字段名,每次把单个字符串$field传入fputcsv,不符合该函数第二个参数必须为数组的要求。
除此之外原代码还存在3个隐藏问题:

  • 重复执行两次相同的SQL查询,浪费数据库性能
  • CSV内容直接拼接进JS字符串,没有转义单引号、换行、反斜杠等特殊字符,会触发JS语法报错
  • 异常类名拼写错误:PDOExepction正确写法为PDOException

修正后完整代码

<?php
require_once 'd:\xampp\htdocs\bpr\pdo_db.php';
$sql = "Select ID,FULL_NAMe,AGE from TRIAL";
$csv = get_csv_string($dbh, $sql);
// 转义特殊字符后再赋值给JS变量,避免语法错误
echo "<script> var_csv = '" . addslashes($csv) . "' </script>";

function get_csv_string($dbh, $sql)
{
    try {
        $result = $dbh->query($sql);
        $rows = $result->fetchAll(PDO::FETCH_ASSOC);
        if (empty($rows)) {
            return "No Data";
        }
        $f = fopen('php://memory', 'r+');
        // 写入表头:直接取第一行的键组成数组传入fputcsv
        fputcsv($f, array_keys($rows[0]));
        // 循环写入所有数据行
        foreach ($rows as $row) {
            if (fputcsv($f, $row) === false) {
                return false;
            }
        }
        rewind($f);
        $csv = stream_get_contents($f);
        fclose($f);
        return rtrim($csv);
    } catch (PDOException $e) {
        return $e->getMessage();
    }
}

更优方案(无需CSV中转)

如果你后续需要把CSV转为JSON使用,可以直接跳过CSV转换步骤,直接把PHP查询结果转JSON传给前端,性能更高也不会存在转义兼容问题:

<?php
require_once 'd:\xampp\htdocs\bpr\pdo_db.php';
$sql = "Select ID,FULL_NAMe,AGE from TRIAL";
$result = $dbh->query($sql);
$rows = $result->fetchAll(PDO::FETCH_ASSOC);
// 直接输出JSON格式给JS变量
echo "<script> var data = " . json_encode($rows) . " </script>";

前端可以直接使用data数组,不需要额外编写CSV转JSON的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:24:03