Zur Navigation

CSV per PHP in SQL einspielen

1 Thor (Gast)

Hallo,

hab leider Probleme mit dem Login hier im Forum, weshalb ich als Gast poste.

Ich stehe mal wieder völlig auf dem Schlauch :-(

Mein Plan

Eine CSV Datei soll per PHP und Cronjob die Shopdatenbank updaten.
Dabei soll die Artikelnummer der CVS mit der Shopdb übereinstimmen, danach soll in die Shopdb, in einem bestimmten Feld, ein Wert aus der CVS übertragen (z.B. Ware lieferbar) werden.

Das einzige was ich gefunden habe ist ein Codeschnipsel der ähnlich aufgebaut ist. Nur wird da eine lokale Datei eingespielt.

 <form action="<? echo $SERVER[phpSelf] ?>" method="post" enctype="multipart/form-data"> 
  <p>CSV-Datei</p> 
  <input type="file" name="csv_datei" id="csv_datei" value="c:\*.csv" /> <br /> 
  <input type="submit" name="submit" id="submit" /> 
 </form> 


<? 
// Systemeinstellungen 
$user = "xxxxx"; 
$pw = "xxxxx"; 
$host = "localhost"; 
$database = "xxxxxx"; 
$table = "xxxxxx"; 

$verbindung = mysql_connect($host, $user, $pw) or die ("Es konnte keine Verbindung zur Datenbank hergestellt werden!!!"); 

mysql_select_db( $database, $verbindung ); 


if($_POST['submit']) 
{ 
 if(move_uploaded_file(".$_POST[csv_datei].", './temp/')) { 
   echo '<h3>Upload Successful!</h3>'; 
 } 
 else { 
  echo '<h3>ERROR</h3>'; 
 } 

 $datei_temp = "./temp/.$_POST[csv_datei]."; 
 $row = 1; echo $csv_data; 
 $handle = fopen ($datei_temp,"r"); 
 while ($data = fgetcsv ($handle, 1000, ";")) 
 { 

  $insert_csv  = sprintf(" 
    INSERT INTO %s(pid, name, sn, date, time) 
    VALUES ('493', '%s', '%s', '%s', '%s')", 
    $table, $data[0], $data[1], $data[2], $data[3]); 

  mysql_query($insert_csv); 
 } fclose ($handle); 
} 
mysql_close( $verbindung); 
?>

Ich weiß jetzt leider nicht mehr weiter.

Gruß
Thor

30.03.2011 09:28

2 Jörg Kruse

Dabei soll die Artikelnummer der CVS mit der Shopdb übereinstimmen, danach soll in die Shopdb, in einem bestimmten Feld, ein Wert aus der CVS übertragen (z.B. Ware lieferbar) werden.

Dafür benötigst du wohl eine UPDATE-Query

Wenn $data[0] (also das erste csv Feld) der Artikelnummer entspricht, und $data[3] dem Feld 'lieferbar', würde ich es in etwa so versuchen:

while ($data = fgetcsv ($handle, 1000, ";")) { 
    mysql_query("UPDATE " . $table . " SET lieferbar = '" . mysql_real_escape_string($data[3]) . "' WHERE Artikelnummer = " . $data[0]); 
} fclose ($handle);

30.03.2011 09:58

3 Thor (Gast)

danke dir für die schnelle Antwort, das bringt mich ein gutes Stück weiter. :-)

aber wie nehme ich die Verbindung zur CSV auf meinem Server auf?

 <form action="<? echo $SERVER[phpSelf] ?>" method="post" enctype="multipart/form-data"> 
  <p>CSV-Datei</p> 
  <input type="file" name="csv_datei" id="csv_datei" value="c:\*.csv" /> <br /> 
  <input type="submit" name="submit" id="submit" /> 
 </form> 


<? 
// Systemeinstellungen 
$user = "xxxxx"; 
$pw = "xxxxx"; 
$host = "localhost"; 
$database = "xxxxxx"; 
$table = "xxxxxx"; 

$verbindung = mysql_connect($host, $user, $pw) or die ("Es konnte keine Verbindung zur Datenbank hergestellt werden!!!"); 

mysql_select_db( $database, $verbindung ); 


if($_POST['submit']) 
{ 
 if(move_uploaded_file(".$_POST[csv_datei].", './temp/')) { 
   echo '<h3>Upload Successful!</h3>'; 
 } 
 else { 
  echo '<h3>ERROR</h3>'; 
 } 

while ($data = fgetcsv ($handle, 1000, ";")) { 
    mysql_query("UPDATE " . $table . " SET lieferbar = '" . mysql_real_escape_string($data[3]) . "' WHERE Artikelnummer = " . $data[0]); 
} fclose ($handle); 
} 
mysql_close( $verbindung); 
?>

Gruß
Thor

30.03.2011 10:18

4 Jörg Kruse

Das einzige was ich gefunden habe ist ein Codeschnipsel der ähnlich aufgebaut ist. Nur wird da eine lokale Datei eingespielt.

Also die Datei liegt bereits auf dem Server?

Vor der Schleife muss die Datei noch geöffnet werden

$handle = fopen("/pfad/zur/datei/artikel.csv", "r");

30.03.2011 10:40

5 Thor (Gast)

Ich denke der zusammengestückelte code ist Blödsinn, aber die Verbindung zur Datenbank steht und die CSV wird geöffnet. Keine Fehlermeldung, nur weißer Bildschirm.

Der Datensatz "products_description" enthält die Felder "Artikelnummer" Spalte 1 und "Warenbestand" Spalte 11.

Die CSV die Felder "ArtNummer" Spalte 1 und "ArtBestand" Spalte 8

"Artikelnummer" und "ArtNummer" sollen überstimmen, "ArtBestand" updaten --> "Warenbestand"

<?php

mysql_connect("localhost","xxx","xxx") or die ("Es konnte keine Verbindung zur Datenbank hergestellt werden!!!"); 
mysql_select_db("usr_webxxx") or die ("Die Datenbank existiert nicht.");


$handle = fopen("/home/www/xxx/html/bestaende_iso1.csv", "r") or die ("Kann Datei nicht oeffnen."); 
{
while ($data = fgetcsv ($handle, 1000, ";")) { 
    mysql_query("UPDATE " . $table . " SET ArtBestand = '" . mysql_real_escape_string($data[7]) . "' WHERE ArtNummer = " . $data[0]); 
} fclose ($handle); 
} 
mysql_close; 
?>

30.03.2011 15:43

6 Jörg Kruse

Du musst den Tabellennamen $table noch definieren.

Ansonsten kannst du dir mit mysql_error() nach der Query etwaige SQL-Fehler ausgeben lassen

30.03.2011 17:05

7 Thor (Gast)

1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET ArtBestand = '' WHERE ArtNummer =' at line 1

mysql_query("UPDATE " . $products_description. " SET ArtBestand = '" . mysql_real_escape_string($data[7]) . "' WHERE ArtNummer = " . $data[0]); 

und worher weiß die Datenbank den Bezug "ArtNummer" (Datenbank) zu "ArtBestand" (CSV)?

30.03.2011 18:15

8 Jörg Kruse

1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET ArtBestand = '' WHERE ArtNummer =' at line 1

Da kann ich keinen Fehler draus erkennen? Lass dir mal testweise die komplette Query ausgeben:

die("UPDATE " . $products_description. " SET ArtBestand = '" . mysql_real_escape_string($data[7]) . "' WHERE ArtNummer = " . $data[0]);
mysql_query("UPDATE " . $products_description. " SET ArtBestand = '" . mysql_real_escape_string($data[7]) . "' WHERE ArtNummer = " . $data[0]); 

und worher weiß die Datenbank den Bezug "ArtNummer" (Datenbank) zu "ArtBestand" (CSV)?

Mit dem WHERE Statement sorgst du dafür, dass der Datensatz in der Tabelle mit dem Datensatz derselben ArtNummer in der csv Datei aktualisiert wird (vorausgesetzt, du hast die Indexnummern in $data korrekt zugeordnet)

30.03.2011 20:39

9 Thor (Gast)

Morgen,

UPDATE SET ean_nummer = '' WHERE products_LfStatus = ArtNummer
Woher die "ArtNummer" herkommt ist mir ein Rätsel.

Einfachhalber habe ich die Datensätze der CSV angepasst und erhält jetzt die gleichen Feldnamen wie die Shopdatenbank.

die("UPDATE " . $products_description. " SET ean_nummer = '" . mysql_real_escape_string($data[10]) . "' WHERE products_LfStatus = " . $data[0]);
mysql_query("UPDATE " . $products_description. " SET ean_nummer = '" . mysql_real_escape_string($data[10]) . "' WHERE products_LfStatus = " . $data[0]); 

"' WHERE products_LfStatus = " . $data[0]); Ist die CSV auf Feld Nr. 1
" SET ean_nummer = '" - Ist die Shopdatenbank auf Feld Nr. 11

Er sollte die "products_LfStatus" der CVS mit der "products_LfStatus" der Shopdb vergleichen und die "ean_nummer" der CVS in die "ean_nummer" der Shopdb eintragen.

31.03.2011 09:30

10 Jörg Kruse

UPDATE SET ean_nummer = '' WHERE products_LfStatus = ArtNummer
Woher die "ArtNummer" herkommt ist mir ein Rätsel.

Das scheint wohl aus der Kopfdatenzeile der CSV-Datei zu kommen - der SQL-Syntaxfehler ist in der while Schleife ja auch nur einmal aufgetreten?

Ich würde hier einfach mal den ersten Schleifendurchlauf auslassen:

$i = 0;
while ($data = fgetcsv($handle, 1000, ";")) { 
    if ($i > 0) {
        // UPDATE-Query 
    }
    $i ++;
}
fclose ($handle);

31.03.2011 11:19