使用mysql&创建多个csv文件php而

时间:2015-07-15 14:15:52

标签: php mysql csv while-loop

我正在尝试使用mysql&生成多个渐进式csv文件(名称为DOC_n°.csv)。 php while。

//query 1
$query2 ="SELECT id_order FROM ps_orders";
$result2= mysql_query($query2); 

$i=1;

while ($riga2 = mysql_fetch_array($result2)){
//query 2
$query = "SELECT ps_order_detail.product_name,ps_orders.id_order,ps_orders.date_add,ps_order_detail.unit_price_tax_incl,ps_order_detail.id_order_detail,ps_order_detail.product_quantity,ps_order_detail.product_reference,ps_order_detail.product_weight,ps_order_detail.unit_price_tax_incl,ps_address.id_customer,ps_address.firstname,ps_address.lastname,ps_address.address1,ps_address.address2,ps_address.postcode,ps_address.city
FROM ps_orders
JOIN ps_order_detail ON  ps_orders.id_order = ps_order_detail.id_order
JOIN ps_address ON ps_orders.id_customer = ps_address.id_customer
WHERE ps_orders.id_order=$i;";

$result = mysql_query($query);  
    //second while to write document and values inside of it
    while ($riga = mysql_fetch_array($result)){
//useful variable to write files
        $path ="TMPIN/";
        $doc=$path."DOC_".$i.".csv";
        $myfile = fopen($doc, "w");
...
...
information inside the csv
...
..          
fwrite($myfile, $testo."\n");
fclose($myfile);
};
$i++;
};

我的代码有效,但在生成的csv文件中,我找到之前生成的所有循环。有一种方法只能看到LAST循环生成循环吗?

3 个答案:

答案 0 :(得分:0)

您的循环设置错误,核心逻辑也非常低效。您应该学习如何使用JOIN s。

无论如何,要修复你的代码

while(... main query loop) {
    $file = fopen(...);
    $subquery = mysql_query(...);
    while($row = mysql_fetch_array($subquery)) {
        fputcsv($file, $subquery);
    }
    fclose($file);
}

注意fopen / close是如何在内循环外部的。

答案 1 :(得分:0)

你有2个while循环。您只在主循环中更改文件名,因此在子循环中,您总是在相同的csv中写入(并顺便打开/关闭此文件!)

所以你应该尝试这样的事情:

$query = "SELECT ps_order_detail.product_name,ps_orders.id_order,ps_orders.date_add,ps_order_detail.unit_price_tax_incl,ps_order_detail.id_order_detail,ps_order_detail.product_quantity,ps_order_detail.product_reference,ps_order_detail.product_weight,ps_order_detail.unit_price_tax_incl,ps_address.id_customer,ps_address.firstname,ps_address.lastname,ps_address.address1,ps_address.address2,ps_address.postcode,ps_address.city
    FROM ps_orders
    JOIN ps_order_detail ON  ps_orders.id_order = ps_order_detail.id_order
    JOIN ps_address ON ps_orders.id_customer = ps_address.id_customer
    WHERE 1=1;";

$result = mysql_query($query);  
//second while to write document and values inside of it 
while ($riga = mysql_fetch_array($result)){
    $testo = "";
    $testo .= "stuff to write\n";
    ...
    ...
    information inside the csv
    ...
    ...

    // once you know what to write, open file.
    //useful variable to write files
    $path ="TMPIN/";
    $doc=$path."DOC_".$riga['id_order'].".csv";
    $myfile = fopen($doc, "w");
    fwrite($myfile, $testo."\n");
    fclose($myfile);
}

编辑:(感谢@Kickstart)

删除了第一个没用的循环...你只能进行1次查询

答案 2 :(得分:0)

消除额外循环,仅输出每个id_order的详细信息。只需在id_order更改时输出文件。

<?php

//query 2
$query = "SELECT ps_order_detail.product_name,ps_orders.id_order,ps_orders.date_add,ps_order_detail.unit_price_tax_incl,ps_order_detail.id_order_detail,ps_order_detail.product_quantity,ps_order_detail.product_reference,ps_order_detail.product_weight,ps_order_detail.unit_price_tax_incl,ps_address.id_customer,ps_address.firstname,ps_address.lastname,ps_address.address1,ps_address.address2,ps_address.postcode,ps_address.city
FROM ps_orders
JOIN ps_order_detail ON  ps_orders.id_order = ps_order_detail.id_order
JOIN ps_address ON ps_orders.id_customer = ps_address.id_customer
ORDER BY ps_orders.id_order";

$result = mysql_query($query);  
    //second while to write document and values inside of it
$last_id_order = 0;
while ($riga = mysql_fetch_array($result))
{
    if ($last_id_order != $riga['id_order'] and $last_id_order != 0)
    {
        output_file($testo, $last_id_order);
        $testo = '';
        $last_id_order = $riga['id_order'];
    }
    //useful variable to write files
    ...
    ...
    information inside the csv
    ...
    ..          
}
if ($last_id_order != 0)
{
    output_file($testo, $last_id_order);
}

function output_file($testo, $last_id_order)
{
    //useful variable to write files
    $path = "TMPIN/";
    $doc = $path."DOC_".$last_id_order.".csv";
    $myfile = fopen($doc, "w");
    fwrite($myfile, $testo."\n");
    fclose($myfile);
}