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
相关产品推荐
相关产品推荐

