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

PHP中如何将Oracle查询结果写入CSV文件末尾列?

解决CSV写入Oracle查询结果的问题

你遇到的核心问题是把嵌套数组直接写入CSV导致无法正确解析,咱们一步步来搞定:

问题根源

你代码里把查询返回的关联数组直接赋值给了$data['Sizes']:

$data['Sizes'] = $final;

这里的$final是类似["ACTIVE_SIZES"]=> "XS-S-M-L-XL-2XL"的关联数组,而fputcsv只能处理一维数组的字符串元素,嵌套数组会被当成无效内容,最终要么显示为空,要么输出Array字样,不会显示你要的尺寸字符串。

修复步骤

1. 提取实际的尺寸字符串

不要直接存数组,而是取出ACTIVE_SIZES对应的字符串值:

$data['Sizes'] = $final['ACTIVE_SIZES'];

2. 处理无查询结果的情况

如果某个ADA_STYLE在数据库里没有匹配数据,要给Sizes设置默认值(比如空字符串),避免出现错误:

$data['Sizes'] = $final['ACTIVE_SIZES'] ?? '';

3. 优化查询循环(可选)

从你的示例输出看,每个ADA_STYLE应该只返回一条结果,所以不需要while循环,直接用odbc_fetch_array获取一次即可,减少不必要的循环:

$result = odbc_exec($connect, $query);
$final = odbc_fetch_array($result);
$data['Sizes'] = $final['ACTIVE_SIZES'] ?? '';

修改后的完整代码

<?php
//Modifications on csv file
$delimiter = ";";
$csv_data = array();
if (($handle = fopen($nomcsv, 'r')) !== FALSE) {
    while (($data = fgetcsv($handle, 10000, $delimiter)) !== FALSE) {
        //Add two columns at the end
        $data['Pictures Names'] = (!empty($data[4]) ? ($data[7] ?: '') . "_" . $data[4] . '.jpg' : '');
        $data['Color-Description'] = (!empty($data[3]) ? (ltrim($data[4], '0') ?: '') . "-" . $data[3] : '');
        //Query
        $query = "SELECT ACTIVE_SIZES FROM ADA_ACTIVE_SIZE2_VIEW WHERE ADA_STYLE = '" . $data[4] . "'";
        $result = odbc_exec($connect, $query);
        $final = odbc_fetch_array($result);
        // Assign the actual string value, default to empty if no result
        $data['Sizes'] = $final['ACTIVE_SIZES'] ?? '';
        
        $csv_data[] = $data;
    }
}
fclose($handle);
if (($handle = fopen($nomcsv, 'w')) !== FALSE) {
    foreach ($csv_data as $data) {
        fputcsv($handle, $data, $delimiter);
    }
    fclose($handle);
}
?>

额外建议

  • 注意SQL注入风险:直接把$data[4]拼接到SQL语句里是不安全的,建议使用参数化查询来避免注入,比如:
    $query = "SELECT ACTIVE_SIZES FROM ADA_ACTIVE_SIZE2_VIEW WHERE ADA_STYLE = ?";
    $stmt = odbc_prepare($connect, $query);
    odbc_execute($stmt, [$data[4]]);
    $final = odbc_fetch_array($stmt);
    
  • 可以在写入CSV前检查$csv_data里的Sizes值,确保每个元素都是字符串类型,避免意外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:48:00