# CSV Dateien importieren



## raphk (1. Februar 2003)

Wie kann ich CSV Dateien in meine MySQL Datenbank importieren?

Bei folgender Funktion ...

$upload = mysql_query("
                        LOAD DATA LOCAL INFILE \"datei.csv\"
                        REPLACE INTO TABLE $db
                        FIELDS TERMINATED BY ';'
                        LINES TERMINATED BY '\n'
                        OPTIONALLY ENCLOSED BY '\"';
                      ") or die ("Update fehlgeschlagen!");


... kommt immer nur "Update fehlgeschlagen" und die Datei wird nicht importiert obschon der Dateiname und die db richtig angegeben sind. Weiß einer was ich falsch mache? Worauf muss ich achten wenn ich CSV Dateien importiere?


Thx 4 help!

MFG Raphael


----------



## melmager (3. Februar 2003)

sieht eigendlich gut aus der befehl

mach mal hinten dran den:

or die(mysql_error()) dan bekommste die fehlermeldung von mysql

ist etwas aussagefähiger wie "ist fehlgeschlagen"


----------



## raphk (7. Februar 2003)

*Acces Denied*

Hab ich mal versucht! Fehler ist:

Access denied for user: 'user@Kunden2-1.KONTENT.De' (Using password: YES)

Komisch da PW und Datenbank korrekt sind und ich auch verbunden bin. Weiß einer wie ich das Problem weg bekomme? Bin bei Kontent gehostet. Hab also keinen eigenen Server. 

Wäre schön wenn mir einer weiterhelfen könnte! Bin quasi fertig mit programmieren nur dieser Upload will net!  

Danke schonmal im vorraus!

MFG Raphael


----------



## Terrance & Philipp (7. Februar 2003)

Ich nehme an das user nicht dein richtiger Username und YES nicht dein richtiges Passwort sind, und du sie hier ausgetauscht hast?


----------



## raphk (7. Februar 2003)

*Acces Denied*

also die Meldung kommt so wie sie da steht bloß anstatt user halt mein richtiger user-Name. Das YES steht auch in der Fehlermeldung so.


----------



## melmager (8. Februar 2003)

> Bin bei Kontent gehostet. Hab also keinen eigenen Server.



das erklärt einiges :
a) für den load data braucht man spezielle rechte
b) die datei die man einliest muss schon vor ort sein (auf dem sql server) und ich denke das ist sie nicht


da hilft nur ein eigenes script in php


----------



## raphk (8. Februar 2003)

*aha*

Also die Datei liegt aufm Server (also auf meinem Webserver wo auch das PHP Script liegt).

Wie kann ich denn diese Rechte erhalten? Wenn ich diese Rechte nicht bekommen kann (bin bei bei Kontent gehostet) wie kann ich dann meinen Upload vollbringen? Du sagtest was von nem PHP Script? Wie geht das denn ungefähr?


Danke für die Hilfe!

Mfg Raphael


----------



## raphk (8. Februar 2003)

*Telnet / SSH*

Kann es sein, das ich für den Befehl LOAD DATA INFILE einen Telnet bzw SSH Zugang brauche?

Das würde einiges erklären!


----------



## melmager (9. Februar 2003)

telnet würde nicht wirklich weiterhelfen :-(

bei ettlichen hostern ist php server <> sql server 


```
# verbindungsaufbau zum mysqlserver lasse ich mal weg
$zeile = file("datei.cvs");
for ($lo=0;$lo<sizeof($zeile);$lo++) {
 $tmp = str_replace("\"","\'",$zeile[$lo]);
 $tmp = str_replace(";",",",$tmp);
 $erg = mysql_query("insert ignore into dbtabelle values($tmp)",$link);
}
```


----------



## raphk (9. Februar 2003)

*hmm*

hmm klappt immer noch nicht! 

also anstatt dbtabelle kommt doch meine Tabelle? Ansonsten brauche ich doch nix zu ändern?

Man man man! Das muss doch irgendwann mal klappen!


Wenn ich den 

or die ("Upload fehlgeschlagen! Grund: ". mysql_error ());

dran hänge kommt zwar Upload fehlgechlagen aber kein error. 

Komisch komisch


Gruß Raphael


----------



## melmager (9. Februar 2003)

mach doch mal bitte vor dem query

ein 

echo "$tmp<br>";

der browser solle dann deine daten anzeigen in der form
bla,'bla bla',usw,'noch ein text'

macht er das?


----------



## raphk (14. Februar 2003)

Nein  macht er nicht! Er macht nur eine Leerzeile und dann kommt "Upload fehlgeschlagen! Grund: "

Hier ist nochmal der Code so wie ich den hab:

$zeile = file("goalies.cvs");
for ($lo=0;$lo<sizeof($zeile);$lo++) {
 $tmp = str_replace("\"","'",$zeile[$lo]);
 $tmp = str_replace(";",",",$tmp);

 echo "$tmp<br>";

 $erg = mysql_query("insert ignore into $goalies values($tmp)",$link) or die ("Upload fehlgeschlagen! Grund: ". mysql_error ());
}



Hab eben von meinem Host die Bestätigung bekommen das ich den Befehl LOAD DATA INFILE nicht verwenden kann da dieser aufgrund von Sicherheitslücken deaktiviert wurde.


Sorry das ich erst jetzt antworte aber ich bin zur Zeit nur am WE online!


----------



## melmager (14. Februar 2003)

sollte eigendlich gehen ...

$zeile = file("goalies.cvs");
for ($lo=0;$lo<sizeof($zeile);$lo++) {
$tmp = str_replace("\"","'",$zeile[$lo]);
$tmp = str_replace(";",",",$tmp);
echo "zeile[$lo]<br>"
echo "$tmp<br>"; 

}

so sollte er die datei auflisten
und die änderungen

" wird ersetzt durch '
; wird ersetzt durch ,

(ich hoffe die cvs datei ist wirlich so aufgebaut
; als trennzeichen " um text einzugrenzen


----------



## raphk (14. Februar 2003)

Also wenn ich das so eingebe kommt nur:

zeile[0]

Upload fehlgeschlagen! Grund: 

??? Also hab gerade nochmal in der CSV Datei nachgeschaut. Die einzelnen Datensätze sind durch ; getrennt


----------



## raphk (14. Februar 2003)

```
$erg = mysql_query("insert ignore into $goalies values($tmp)",$link) or die ("Upload fehlgeschlagen! Grund: ". mysql_error ());
```

wofür steht eigentlich die Variable $link ?


----------



## melmager (15. Februar 2003)

echo "zeile[$lo]<br>" 

da habe ich was vergessen :-(

echo "$zeile[$lo]<br>";



> wofür steht eigentlich die Variable $link ?





> # verbindungsaufbau zum mysqlserver lasse ich mal weg



das hätte ich doch noch schreiben sollen 

am anfang der php seite muss sowas sein
$link = mysql_connect("serveradresse","user","passwd") or die("keine datenbank");
$err = mysql_select_db("datenbankname",$link) or die("keine datenbank");

-----

was mich nicht gefällt ist das beim echo befehl nichtz angezeigt wird - das sollte man zu erst beheben


----------



## raphk (15. Februar 2003)

Also Verbindungsaufbau hatte ich! 

Das ist echt komisch mit dem error! Da kommt gar nix. Früher kam da wenigstens noch "Acces denied" und´man wusste wo der Fehler lag aber so kann ja alles falsch sein!

Naja! Thx for help! ;-) 

Mfg Raphael


----------



## raphk (15. Februar 2003)

Ok keine Fehlermeldung mehr da aber der Bildschirm bleibt jetzt komplett weiss!


----------



## raphk (15. Februar 2003)

Nenenene wat is man doch blöde!!!!!  



```
$zeile = file("goalies.cvs");
```

Was fällt uns daran auf? Richtig! Es sind keine cVS Dateien sondern cSV Dateien!    

lustig lustig!

Jetzt kommt die erste Zeile der CSV Datei 2 Mal hintereinander und beim 3. Mal schreibt er mir nen Error in Zeile 1 der CSV Datei.

Wieder komisch!


----------



## raphk (15. Februar 2003)

```
$zeile = file("goalies.csv"); 
for ($lo=0;$lo<sizeof($zeile);$lo++) 
{ 
  $tmp = str_replace("\"","'",$zeile[$lo]); 
  $tmp = str_replace(";",",",$tmp); 
  echo "$zeile[$lo]<br>"; 
  echo "$tmp<br>"; 
  $erg = mysql_query("insert ignore into $goalies values($tmp)",$link) or die ("Upload fehlgeschlagen! Grund: ". mysql_error ());
}
```


----------



## melmager (17. Februar 2003)

Jetzt kommt die erste Zeile der CSV Datei 2 Mal hintereinander und beim 3. Mal schreibt er mir nen Error in Zeile 1 der CSV Datei.


das was so gewollt

die erste zeile sollte so aussehen:
"daten";"noch mehr daten" .... usw..
die zweite so:
'daten','noch mehr daten ... usw ...

sprich die zweite echo ausgabe ist nur zur sichtkontrolle ob der umbau von ; zu ,
und von " zu ' richtig geht 

wie sieht denn die fehlermeldung aus?

zu not machste mal ein copy von der bildschirmausgabe


----------



## raphk (21. Februar 2003)

Also als Error gibt der mir:


```
You have an error in your SQL syntax near Line 1
```


----------



## raphk (21. Februar 2003)

Wie schaff ich es denn das der die ganze datei in die Datenbank importiert?


----------



## melmager (21. Februar 2003)

mir würde mal weiter helfen
wie die zeilen aussehen im browserfensten
die echo rauswirf 

-ich gehe mal davon aus das die datenbank schon erzeugt wurde und die felder genauso aufgebaut sind wie die ursprügliche datenbank die du per cvs
gesichert hast


----------



## raphk (21. Februar 2003)

ANA;G;30;Ilja Bryzgalov;1;0;1;0;60;4;4.00;28;0;85.8;0;0;0;0;0;0;R;L;72;80;84;92;74;80;75;75;72;72;72;65;65;60;70;1;1;0;1;1;0;3;1;7;4;0;0;0;Togliatti, Russia;1980.06.22;5672;5003;603;196;2000;44;1;Y;2;0;1;0;92;5;3.26;40;0;87.5;0;0;0;0;0;N;123;GO-2 

ANA,G,30,Ilja Bryzgalov,1,0,1,0,60,4,4.00,28,0,85.8,0,0,0,0,0,0,R,L,72,80,84,92,74,80,75,75,72,72,72,65,65,60,70,1,1,0,1,1,0,3,1,7,4,0,0,0,Togliatti, Russia,1980.06.22,5672,5003,603,196,2000,44,1,Y,2,0,1,0,92,5,3.26,40,0,87.5,0,0,0,0,0,N,123,GO-2 

Upload fehlgeschlagen! Grund: You have an error in your SQL syntax near 'Bryzgalov,1,0,1,0,60,4,4.00,28,0,85.8,0,0,0,0,0,0,R,L,72,80,84,92,74,80,75,75,72' at line 1

So schauts aus! Nicht erschrecken! Ist ne DB die 72 Spalten hat und mindestens 100 Zeilen! Ist also ziemlich groß das ganze!

MFG Raphael


----------



## melmager (21. Februar 2003)

da ist das problem:

ANA;G;30;Ilja Bryzgalov;.....

das 4 feld ist ein textfeld und es fehlen die "" zur kennzeichnung 



---------------------

```
$zeile = file("goalies.csv"); 

for ($lo=0;$lo<sizeof($zeile);$lo++) 

{ 

  $tmp ="$zeile[$lo];
  echo "$tmp<br>"; 
  $row = explode(";",$tmp); 

  $erg = mysql_query("insert ignore into $goalies values('$row[0]',... siehe text ... )",$link) or die ("Upload fehlgeschlagen! Grund: ". mysql_error ());

}
```

in die klammer müss dann in deinem fall 
von '$row[0]' bis '$row[71]' stehen
bitte auf die kommas zur trennung achten und auf die ' 

viel schreibarbeit aber denn sollte es funzen


----------



## raphk (21. Februar 2003)

Thx a lot! Ich versuche das dann mal!

Könnte man da keine Schleife einbauen? Das würde das ganze '$row[0]' ersparen?


MFG Raphael


----------



## raphk (21. Februar 2003)

Column count doesn't match value count at row 1

kommt jetzt da als error. Was bedeutet das? Fehler in der tabelle oder im Script?


```
$zeile = file("goalies.csv"); 

for ($lo=1;$lo<sizeof($zeile);$lo++) 

{ 

  $tmp ="$zeile[$lo]";
  echo "$tmp<br>"; 
  $row = explode(";",$tmp); 

  $erg = mysql_query("insert ignore into $goalies values('$row[0]','$row[1]','$row[2]','$row[3]','$row[4]','$row[5]','$row[5]','$row[6]','$row[7]','$row[8]','$row[9]','$row[10]','$row[11]','$row[12]','$row[13]','$row[14]','$row[15]','$row[16]','$row[17]','$row[18]','$row[19]','$row[20]','$row[21]','$row[22]','$row[23]','$row[24]','$row[25]','$row[26]','$row[27]','$row[28]','$row[29]','$row[30]','$row[31]','$row[32]','$row[33]','$row[34]','$row[35]','$row[36]','$row[37]','$row[38]','$row[39]','$row[40]','$row[41]','$row[42]','$row[43]','$row[44]','$row[45]','$row[46]','$row[47]','$row[48]','$row[49]','$row[50]','$row[51]','$row[52]','$row[53]','$row[54]','$row[55]','$row[56]','$row[57]','$row[58]','$row[59]','$row[60]','$row[61]','$row[62]','$row[63]','$row[64]','$row[65]','$row[66]','$row[67]','$row[68]','$row[69]','$row[70]','$row[71]')",$link) or die ("Upload fehlgeschlagen! Grund: ". mysql_error ());

}
```


----------



## raphk (22. Februar 2003)

*Danke!*

Ok hat sich erledigt! Hatte mich verzähltt! Waren 77 reihen!

Jetzt gehts wunderbar!

Thx a lot 4 all!

MFG Raphael


----------

