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

