Heim > Fragen und Antworten > Hauptteil
Ich habe den folgenden Code, mit dem ich eine CSV-Datei aus einer Datenbank generieren kann.
<?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()); } ?\>
Ich habe jedoch einige Felder, die basierend auf den Feldwerten in der vorherigen Zeile der CSV geändert werden müssen. Zum Beispiel : Für alle Zeilen, in denen $rs['id_order'] den Wert 486 hat, ist mein Odrline-Wert 1, aber wenn in der nächsten Zeile $rs['id_order'] 487 ist, sollte Odrline 2 usw. sein.
Wie kann ich meine Datei durchsuchen und den Wert basierend auf dem Feld in der vorherigen Zeile ändern?
Wie kann ich meine Datei durchsuchen und den Wert basierend auf dem Feld in der vorherigen Zeile ändern?
P粉2079697872024-04-05 12:15:03
不要在创建文件后通过文件来更改数据,而是在创建文件之前处理数据。
将 id_order
存储在变量中,并在每次循环迭代开始时进行比较。
类似于:
$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, ';');