Skip to content
Advertisement

Compare a csv row value with a previous value [PHP]

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 : 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, ';');
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement