I want to create a csv file from a SQL query that will fetch the information from the database of my Prestashop site. The creation works well, however an essential need for the creation of my file takes me well the head. The purpose of my file is to save the orders of the customers of the day, each line of my final table corresponds to a product of the order. I need to make sure that if the order number of the previous line is equal to the order number of the current line, that some of the fields in my line don’t fill up. How do I make the current id_order field compare to the previous one and add a condition in my csv file creation?
My php :
<?php require_once 'dbconfig.php'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); $sql = 'SELECT o.id_order ,c.id_customer, c.firstname, c.lastname, a.address1, a.address2, a.postcode, a.city,a.phone,c.email,a.phone_mobile, od.product_id, od.product_name,od.product_quantity, od.product_price,o.total_paid_tax_incl, c.id_customer, op.date_add, op.amount, op.payment_method FROM mod582_orders o INNER JOIN mod582_customer c ON o.id_customer = c.id_customer INNER JOIN mod582_address a ON o.id_address_delivery = a.id_address INNER JOIN mod582_order_detail od ON o.id_order = od.id_order INNER JOIN mod582_order_payment op ON o.reference = op.order_reference WHERE CAST(o.date_add AS DATE) LIKE "2023-01%" /*CAST( curdate() AS DATE)*/; '; $r = $pdo->query($sql); $tab = []; $tab[] = ['ORDNOORDER', 'ORDREFCUSORDER', 'ORDNOCOSTNUMBER','ORDNOCUSTOMER','ORDCUSTOMERCODE','ORDCUSCAT','ORDTYPE','ORDCURRENCY','ORDCURRENCYRATE','ORDDESIGNATION', 'ORDREPCODE','ORDPORT','ORDPORTTYPE','ORDPORTRATE','DEONOORDER','DEOCOMMENT','DEOCOUNTRY','DEONAME','DEOFIRSTNAME','DEOADDRESS1','DEOADDRESS2','DEOZIPCODE','DEOCITY', 'DEOPHONE','DEOMAIL','DEOPHONEPORTABLE','ODLNOORDER','ODLNOORDERLINE','ODLNOARTICLE','ODLARTDESIGN','ODLQUANTITYORDER','ODLTTCCURUPRICE','ODLCODEPARCELLEFLEU', 'PAYNUMPAYMENT','PAYNOCUSTOMER','PAYNOORDER','PAYNOCURRENCY','PAYDATEPAYMENT','PAYPAYMENTTTCCUR','PAYCURRENCYRATE','PAYCONTREPARTIE']; $odrline = 1; while($rs = $r->fetch(PDO::FETCH_ASSOC)){ $tab[] = [$rs['id_order'], $rs['id_order'], '17', '', 'AAA'.$rs['id_customer'],'DET','O','EUR','1','','115','D','P','17', $rs['id_order'],'','FRA', $rs['firstname'], $rs['lastname'], $rs['address1'], $rs['address2'], $rs['postcode'], $rs['city'], $rs['phone'], $rs['email'], $rs['phone_mobile'], $rs['id_order'],$odrline, $rs['product_id'], $rs['product_name'], $rs['product_quantity'], $rs['product_price'],'','','', $rs['id_order'],'EUR', $rs['date_add'], $rs['amount'],'1','VIR']; } $fichier_csv = new SplFileObject('vinistoria/commandes.csv', 'w'); foreach($tab as $ligne){ $fichier_csv->fputcsv($ligne, ';'); } $date = date('d-m-y h:i:s'); echo "nouveau fichier commandes.csv créé à ". $date; } catch (PDOException $e) { die("Could not connect to the database $dbname :" . $e->getMessage()); } ?>
Exemple of my final tab : here, if the order number is the same as the previous one, some fields are empty to indicate that it is the same order. Here is what I would like to do when creating my csv.
Advertisement
Answer
This appears to be a near duplicate of a question I answered previously. Is it an exam question? Compare CSV line in php
Store the id_order in a variable and compare at the start of each loop iteration.
Something like:
$odrline = 0; // start with zero, as incremented before first written out $prevordernumber = 0; // pick a number that is not a valid order number // or empty string if not numeric while($rs = $r->fetch(PDO::FETCH_ASSOC)){ // if order number has changed then increment order line if($prevordernumber != $rs['id_order']) $odrline++; $tab [] = ........ // update stored previous order number $prevordernumber = $rs['id_order']; } // write $tab to file $fichier_csv = new SplFileObject('vinistoria/commandes.csv', 'w'); foreach($tab as $ligne){ $fichier_csv->fputcsv($ligne, ';');