【问题标题】:export mysql query array using fputcsv使用 fputcsv 导出 mysql 查询数组
【发布时间】:2015-06-15 03:49:51
【问题描述】:

我正在尝试使用 fputcsv 将 sql 查询的结果导出到 CSV,但是不断收到错误消息“fputcsv() 期望参数 2 是数组,给定字符串”。

我按照这里给出的答案 - Query mysql and export data as CSV in PHP - 但它抛出了上面的错误。我知道 $val 是一个字符串,并且不会工作,因为 fputcsv 需要一个数组,但不明白如何将每一行放入 csv 中。如果我用 $row 代替 $val,我只会得到 csv 中结果的第一行,而不是循环。我知道我遗漏了一些非常明显的东西,只需要轻推一下就可以告诉我它是什么。代码如下:

// MySQLi Query
$result = mysqli_query($con, "

SELECT d.order_id AS 'Order ID',
m1.meta_value AS 'First Name',
m2.meta_value AS 'Last Name',
m3.meta_value AS 'Address1',
m4.meta_value AS 'Address2',
m5.meta_value AS 'City',
m6.meta_value AS 'State',
m7.meta_value AS 'Post Code',
f1.meta_value AS 'SKU',
d.order_item_name AS 'Product Name',
e2.meta_value AS 'Quantity',
m8.meta_value AS 'Tracking - Carrier',
m9.meta_value AS 'Tracking - Code',
m10.meta_value AS 'Tracking - Date',
m11.meta_value AS 'Tracking - Picked'

FROM dk_posts p
LEFT JOIN dk_postmeta m1 ON p.id = m1.post_id
AND m1.meta_key = '_shipping_first_name'
LEFT JOIN dk_postmeta m2 ON p.id = m2.post_id
AND m2.meta_key = '_shipping_last_name'
LEFT JOIN dk_postmeta m3 ON p.id = m3.post_id
AND m3.meta_key = '_shipping_address_1'
LEFT JOIN dk_postmeta m4 ON p.id = m4.post_id
AND m4.meta_key = '_shipping_address_2'
LEFT JOIN dk_postmeta m5 ON p.id = m5.post_id
AND m5.meta_key = '_shipping_city'
LEFT JOIN dk_postmeta m6 ON p.id = m6.post_id
AND m6.meta_key = '_shipping_state'
LEFT JOIN dk_postmeta m7 ON p.id = m7.post_id
AND m7.meta_key = '_shipping_postcode'
LEFT JOIN dk_postmeta m8 ON p.id = m8.post_id
AND m8.meta_key = 'ywot_carrier_name'
LEFT JOIN dk_postmeta m9 ON p.id = m9.post_id
AND m9.meta_key = 'ywot_tracking_code'
LEFT JOIN dk_postmeta m10 ON p.id = m10.post_id
AND m10.meta_key = 'ywot_pick_up_date'
LEFT JOIN dk_postmeta m11 ON p.id = m11.post_id
AND m11.meta_key = 'ywot_picked_up'

LEFT JOIN dk_woocommerce_order_items d ON d.order_id=m1.post_id

LEFT JOIN dk_woocommerce_order_itemmeta e1 ON d.order_item_id =     e1.order_item_id
AND e1.meta_key = '_product_id'
LEFT JOIN dk_woocommerce_order_itemmeta e2 ON d.order_item_id = e2.order_item_id
AND e2.meta_key = '_qty'

LEFT JOIN dk_postmeta f1 ON e1.meta_value = f1.post_id
AND f1.meta_key = '_sku'

WHERE post_status = 'wc-processing'
AND
order_item_type = 'line_item'
");

$row = mysqli_fetch_array($result, MYSQLI_ASSOC);

$fp = fopen('file.csv', 'w');

foreach ($row as $val) {
    fputcsv($fp, $val);
}

fclose($fp);

【问题讨论】:

    标签: php mysql arrays csv fputcsv


    【解决方案1】:

    对应official manual for mysqli_fetch_array

    mysqli_fetch_array — 以关联、数字数组或两者的形式获取结果行

    您编写了 MYSQLI_ASSOC 标志,因此您获得了 一行 数据的关联数组:

    通过使用 MYSQLI_ASSOC 常量,此函数的行为将与 mysqli_fetch_assoc() 相同

    请参阅examples of mysqli_fetch_assoc 以清楚了解我在说什么。

    所以要将数据逐行放入csv,你应该像这样组织循环:

    <?
    // making your query
    
    $fp = fopen('file.csv', 'w');
    $placed_header = false;
    while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
        // add header to table
        if(!$placed_header) {
            fputcsv($fp, array_keys($row));
            $placed_header = true;
        }
    
        // place row of data 
        fputcsv($fp, array_values($row));
    }
    
    fclose($fp);
    

    【讨论】:

    • 我试过这个并且抛出了很多新错误:警告:array_keys() 期望参数 1 是数组,在第 75 行的 /home/example/export/export3.php 中给出了 null 警告: fputcsv() 期望参数 2 为数组,在第 75 行的 /home/example/export/export3.php 中给出 null 警告:array_values() 期望参数 1 为数组,在 /home/example/export/export3 中给出 null。第 80 行的 php 警告:fputcsv() 期望参数 2 为数组,第 80 行的 /home/example/export/export3.php 中给出 null ...等等:(.
    • 已修复。将循环中的 $val 替换为您实际循环的数据,即 $row。
    • 完美。谢谢你的帮助。我现在也了解 mysqli_fetch_assoc 的区别,因此我的教育取得了进步:)。再次感谢。
    • 我可以在 while 循环中使用 PDOStatement::fetch 将这段代码与 PDO::query 的输出一起使用来代替 mysqli_fetch_array。它运行良好,没有其他修改,也没有警告或错误。谢谢!
    【解决方案2】:

    使用 fputcsv 导出 MySQL 查询数组

    PHP fputcsv()

    $filename = "toy_csv.csv";
    $fp = fopen('php://output', 'w');
    
    $query = "$result = mysqli_query($con, "
    
    SELECT d.order_id AS 'Order ID',
    m1.meta_value AS 'First Name',
    m2.meta_value AS 'Last Name',
    m3.meta_value AS 'Address1',
    m4.meta_value AS 'Address2',
    m5.meta_value AS 'City',
    m6.meta_value AS 'State',
    m7.meta_value AS 'Post Code',
    f1.meta_value AS 'SKU',
    d.order_item_name AS 'Product Name',
    e2.meta_value AS 'Quantity',
    m8.meta_value AS 'Tracking - Carrier',
    m9.meta_value AS 'Tracking - Code',
    m10.meta_value AS 'Tracking - Date',
    m11.meta_value AS 'Tracking - Picked'
    
    FROM dk_posts p
    LEFT JOIN dk_postmeta m1 ON p.id = m1.post_id
    AND m1.meta_key = '_shipping_first_name'
    LEFT JOIN dk_postmeta m2 ON p.id = m2.post_id
    AND m2.meta_key = '_shipping_last_name'
    LEFT JOIN dk_postmeta m3 ON p.id = m3.post_id
    AND m3.meta_key = '_shipping_address_1'
    LEFT JOIN dk_postmeta m4 ON p.id = m4.post_id
    AND m4.meta_key = '_shipping_address_2'
    LEFT JOIN dk_postmeta m5 ON p.id = m5.post_id
    AND m5.meta_key = '_shipping_city'
    LEFT JOIN dk_postmeta m6 ON p.id = m6.post_id
    AND m6.meta_key = '_shipping_state'
    LEFT JOIN dk_postmeta m7 ON p.id = m7.post_id
    AND m7.meta_key = '_shipping_postcode'
    LEFT JOIN dk_postmeta m8 ON p.id = m8.post_id
    AND m8.meta_key = 'ywot_carrier_name'
    LEFT JOIN dk_postmeta m9 ON p.id = m9.post_id
    AND m9.meta_key = 'ywot_tracking_code'
    LEFT JOIN dk_postmeta m10 ON p.id = m10.post_id
    AND m10.meta_key = 'ywot_pick_up_date'
    LEFT JOIN dk_postmeta m11 ON p.id = m11.post_id
    AND m11.meta_key = 'ywot_picked_up'
    
    LEFT JOIN dk_woocommerce_order_items d ON d.order_id=m1.post_id
    
    LEFT JOIN dk_woocommerce_order_itemmeta e1 ON d.order_item_id =     e1.order_item_id
    AND e1.meta_key = '_product_id'
    LEFT JOIN dk_woocommerce_order_itemmeta e2 ON d.order_item_id = e2.order_item_id
    AND e2.meta_key = '_qty'
    
    LEFT JOIN dk_postmeta f1 ON e1.meta_value = f1.post_id
    AND f1.meta_key = '_sku'
    
    WHERE post_status = 'wc-processing'
    AND
    order_item_type = 'line_item'
    ");
    $row = mysqli_fetch_array($result, MYSQLI_ASSOC);
    while ($row = mysql_fetch_row($result)) {
        $header[] = $row[0];
    }   
    header('Content-type: application/csv');
    header('Content-Disposition: attachment; filename='.$filename);
    fputcsv($fp, $header);
    
    $num_column = count($header);       
    $query = "SELECT * FROM toy";
    $result = mysqli_query($query);
    while($row = mysqli_fetch_row($result)) {
        fputcsv($fp, $row);
    }
    exit;
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2021-05-16
      • 2010-11-09
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多