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

PHP操作Oracle数据库:fputcsv仅写入最后一行问题排查

PHP操作Oracle写入CSV仅保留最后一行的解决方法

问题核心原因

你的代码存在两个关键错误:

  1. 文件打开模式错误:每次循环使用'w'模式打开文件,该模式会直接清空文件原有内容并重新写入,导致每次循环都覆盖之前的数据,最终仅保留最后一次循环的内容。
  2. 文件操作位置错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:53:24