Vergleichen Sie CSV-Zeilen in PHP
P粉649990273
P粉649990273 2024-04-04 13:57:04
0
1
505

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粉649990273
P粉649990273

Antworte allen(1)
P粉207969787

不要在创建文件后通过文件来更改数据,而是在创建文件之前处理数据。

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, ';');
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage