【问题标题】:create multiple csv files using mysql & php while使用 mysql & php 创建多个 csv 文件 while
【发布时间】:2015-07-15 14:15:51
【问题描述】:

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

//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 循环?

【问题讨论】:

  • 如果可以的话,你应该stop using mysql_* functions。它们不再被维护并且是officially deprecated。改为了解 prepared statements,并考虑使用 PDO,it's really not hard
  • 问题可能出在缺少的代码中。 $testo 未在给定代码中定义,可能需要在新循环开始时重置。
  • 这里有很多很好的答案。小点是您的代码似乎选择了所有 id_order 字段,然后获取 id_order = $i 的所有记录。这仅在 id_order 从 1 开始并且没有间隙时才有效。

标签: php mysql csv while-loop


【解决方案1】:

你有 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个查询

【讨论】:

  • 谢谢,但在最后一个 DOC_N.csv 文件中(假设它是 4)它给了我所有以前的订单,当我只想要相对于相关 id_order 的订单时
  • 你没有忘记循环开头的$testo = ""; 吗?它重置每个文件的字符串...
  • $testo 是在 while 循环中连接的更多变量,我在其中写“csv 中的信息”,我不写下这些信息,因为我的问题没有必要
  • 所以问题来了,您在检索这些数据时必须做错事。您所要做的就是在循环开始时重置所有变量...如果它仍然不起作用,您将不得不发布“csv 中的信息”,以便我们可以与您一起修复它...
  • 在这种情况下对我如何重置有什么建议吗?我在循环中尝试了这个: if (isset($query) && $i!=$id_ordine){ unset($query); } 其他{
【解决方案2】:

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

无论如何,修复你的代码

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

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

【讨论】:

    【解决方案3】:

    消除额外的循环,只输出每个 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);
    }
    

    【讨论】:

    • 感谢@Random - 误把它留在了
    • 我试试你的代码,它给了我:解析错误:语法错误,意外 '$testo' (T_VARIABLE)
    • 只是缺少几个分号。如果没有额外的代码、表格等,就无法真正测试它,所以可能还有其他几个错别字。
    猜你喜欢
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多