J'ai le code suivant qui me permet de générer un fichier csv à partir d'une base de données.
<?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\['adress1'\], $rs\['adress2'\], $rs\['postcode'\], $rs\['city'\], $rs\['phone'\], $rs\['email'\], $rs\['phone_modile'\], $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()); } ?\>
Cependant, j'ai certains champs qui doivent être modifiés en fonction des valeurs des champs dans la ligne précédente du csv. Par exemple : Pour toutes les lignes où $rs['id_order'] a la valeur 486, ma valeur odrline est 1, mais si dans la ligne suivante $rs['id_order'] est 487, odrline devrait être 2 etc..
Comment puis-je parcourir mon fichier et modifier la valeur en fonction du champ de la ligne précédente??
Comment puis-je parcourir mon fichier et modifier la valeur en fonction du champ de la ligne précédente??
Ne modifiez pas les données via un fichier après l'avoir créé, traitez plut?t les données avant de créer le fichier.
Stockez id_order
dans une variable et comparez-la au début de chaque itération de boucle.
Semblable à?:
$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, ';');