我正在尝试使用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循环生成循环吗?
答案 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);
}