PHP操作Oracle数据库:fputcsv仅写入最后一行问题排查
PHP操作Oracle写入CSV仅保留最后一行的解决方法
问题核心原因
你的代码存在两个关键错误:
- 文件打开模式错误:每次循环使用
'w'模式打开文件,该模式会直接清空文件原有内容并重新写入,导致每次循环都覆盖之前的数据,最终仅保留最后一次循环的内容。 - 文件操作位置错误:
fopen和fclose被放在while循环内部,每次循环都重复执行打开、写入、关闭操作,进一步加剧了内容覆盖的问题。
修正方案
方案1:保留原逻辑(每条数据库记录对应两行CSV内容)
将文件打开、关闭操作移到循环外部,仅初始化文件一次,循环内只执行写入操作:
include 'includes/connection.php'; $date = date('d-M-Y'); // 修复SQL字段逗号分隔问题 $query = "SELECT DISTINCT LCM.something1, LCM.something2, LCM.something3, LCM.something4, LCM.something5, LCM.something6, LCM.something7, LCM.something8, LCM.something9, LCM.something10, LCM.something11, LCM.something12, LCM.something13, LCM.something14, LCM.something15 FROM DB.something1 LCM WHERE LCM.something1 = 'ASAS' "; $array = oci_parse($conn, $query); $run = oci_execute($array); $filename = 'file.csv'; // 仅打开一次文件,用'w'模式初始化 $f = fopen($filename, 'w'); if ($f === false) { die('Error opening the file ' . $filename); } while($row=oci_fetch_array($array)){ $CMCF06 = $row[0] ; $CMCF08 = $row[9] ; $CMCF09 = $row[12]; echo $CMCF06 .'<br>'; $data = [ ['HDHD', '2C4L20018', $date, $date, '081054','002'], ['CMCF', '2C4L20018', '', '0100', '',$CMCF06, '', $CMCF08, $CMCF09], ]; // 写入当前循环的两行数据 foreach ($data as $fields) { fputcsv($f, $fields, '|'); } } echo 'done<br>'; fclose($f);
方案2:优化表头(仅写入一次固定表头行)
如果HDHD行是CSV的固定表头,无需重复写入,可调整为:
include 'includes/connection.php'; $date = date('d-M-Y'); $query = "SELECT DISTINCT LCM.something1, LCM.something2, LCM.something3, LCM.something4, LCM.something5, LCM.something6, LCM.something7, LCM.something8, LCM.something9, LCM.something10, LCM.something11, LCM.something12, LCM.something13, LCM.something14, LCM.something15 FROM DB.something1 LCM WHERE LCM.something1 = 'ASAS' "; $array = oci_parse($conn, $query); $run = oci_execute($array); $filename = 'file.csv'; $f = fopen($filename, 'w'); if ($f === false) { die('Error opening the file ' . $filename); } // 仅写入一次表头行 fputcsv($f, ['HDHD', '2C4L20018', $date, $date, '081054','002'], '|'); while($row=oci_fetch_array($array)){ $CMCF06 = $row[0] ; $CMCF08 = $row[9] ; $CMCF09 = $row[12]; echo $CMCF06 .'<br>'; // 仅写入当前数据行 fputcsv($f, ['CMCF', '2C4L20018', '', '0100', '',$CMCF06, '', $CMCF08, $CMCF09], '|'); } echo 'done<br>'; fclose($f);
额外提示
- 原SQL语句中多个字段之间缺少逗号,会导致语法错误,已在修正代码中补充。
- 若仅需索引数组结果,可使用
oci_fetch_array($array, OCI_NUM),减少内存占用并提升性能。
内容的提问来源于stack exchange,提问作者saleh zwy
相关产品推荐
相关产品推荐

