CSV Datei mit Hilfe von PHP in eine SQL-DB schreiben..

Fruitgum

Erfahrenes Mitglied
Hallo,

ich hatte schonmal ein Beitrag verfasst zum selben Thema aber ich kamm dort nicht weiter.

Ich möchte in eine sql-Tabelle eine CSV-Datei aus Excel importieren. Die Tabelle soll vorher nicht gelöscht werden, sondern die Einträge einfach nur ersetzen, ohne einen neuen Eintrag anzulegen. Mir wäre es wichtig, dass ich die CSV-Datei über den Browser wählen kann, ohne sie vorher auf den Server hochzuladen.

Ich bin mit PHP noch nicht so per Du und bräuchte intensive Hilfe :rolleyes:

Liebe Grüße, Fruit...
 
Wenn die CSV und die Datenbank die gleiche Struktur haben kannst du das ganze sehr einfach über "LOAD DATA INFILE" machen. Findeste in der MySQL Dokumentation inkl. beschreibung wie zu verwenden. Das ganze ist auch superschnell.

Wenn nicht dann kann man fgetcsv http://de.php.net/fgetcsv zum einfachen einlesen verwenden. Und dann "REPLACE" als MySQL Befehl, so werden doppelte Primärschlüssel ersetzt.

Wie das mit den Uploads funktioniert findest du hier: http://de2.php.net/features.file-upload
 
Gut, danke für deine Hilfe... ich bräuchte irgendwie ein Codeansatz, Schnipsel oder ein Tutorial. Die CSV ist in Zeilen und jede Anweisung durch ein Komma getrennt.
 
CSV import per Formular

Hallo,

ich habe jetzt ein Script was eine CSV-Datei richtig in die Tabell einträgt.

Nun möchte ich aber, dass ich die Datei von meinem Computer auswähle und sie per Post an mein Script übertrage und das Script sie in die Datenbank schreibt.



Hier mein Formular:

PHP:
<form action="eintragen.php" enctype="multipart/form-data" method="POST"> 
<input name="csvfile" type="file" /> 
<input type="submit" value="Submit" /> 
</form>

Und jetzt das Script zum eintragen in die Datenbank:

PHP:
<?php
$db_MenuTitle[0]  = "";         // Bezeichnung des Eintrags 
$db_Hostname[0]   = "";   // Datenbank-Host           
$db_UserName[0]   = "";           // Benutzername           
$db_Password[0]   = "";          // Zugehoeriges Passwort
$db_Database[0]   = "";          // Datenbank
$db_Table[0]      = "tx_cal_event";      // Table, in den die CSV
$db_File[0]       = "";        // Verzeichnispfad 
$select_db = 0;

mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], 
$db_Password[$select_db]) || 
die("Keine Verbindung zur Datenbank möglich: ".mysql_error());
            mysql_select_db($db_Database[$select_db]);

            //$fp = fopen ("tx_cal.csv","r");
			
$fp = $_POST["csvfile"];
 			
            $sql2 = 
	'LOAD DATA LOCAL INFILE \'$fp\' 
	REPLACE INTO TABLE `tx_cal_event` 
	FIELDS TERMINATED BY \';\' 
	ENCLOSED BY \'"\' 
	ESCAPED BY \'\\\\\' 
	LINES TERMINATED BY \'\\r\\n\'';
           
		    $result = mysql_query($sql2);
            echo  mysql_error();
            echo "Einträge hinzugefügt bzw. ersetzt: ",$result; 


?>

Bloß das geht nicht so wie ich mir das gedacht habe!?
Wer hat ne Idee? :rolleyes:

Grüße
 
Ja habe das $_POST durch $_FILES ausgetauscht.

da kommt aber diese Fehlermeldung:

File '$fp' not found (Errcode: 2)Einträge hinzugefügt bzw. ersetzt:

Ich verstehe das nicht so, bin Anfänger in PHP.


Ich habe es jetzt so gemacht:

PHP:
mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], 
$db_Password[$select_db]) || 
die("Keine Verbindung zur Datenbank möglich: ".mysql_error());
            mysql_select_db($db_Database[$select_db]);

            
			$fpfile = $_FILES["csvfile"];
			$fp = fopen ($fpfile,"r");
			$sql2 = 
	'LOAD DATA LOCAL INFILE \'$fp\' 
	REPLACE INTO TABLE `tx_cal_event` 
	FIELDS TERMINATED BY \';\' 
	ENCLOSED BY \'"\' 
	ESCAPED BY \'\\\\\' 
	LINES TERMINATED BY \'\\r\\n\'';
           
		    $result = mysql_query($sql2);
            echo  mysql_error();
            echo "Einträge hinzugefügt bzw. ersetzt: ",$result; 


?>

Aber da kommt folgender Fehler:

Warning: fopen() expects parameter 1 to be string, array given in /mnt/web1/11/20/51641420/xxxx/xxxx/xxxxx/eintragen.php on line 18
File '$fp' not found (Errcode: 2)Einträge hinzugefügt bzw. ersetzt:


?
 
$_FILES['userfile']['tmp_name'] sollte die Lösung sein.

PHP:
mysql_connect($db_Hostname[$select_db], $db_UserName[$select_db], 
$db_Password[$select_db]) || 
die("Keine Verbindung zur Datenbank möglich: ".mysql_error());
            mysql_select_db($db_Database[$select_db]);

            
            $fpfile = $_FILES["csvfile"]['tmp_name'];
            $fp = fopen ($fpfile,"r");
            $sql2 = 
    'LOAD DATA LOCAL INFILE \'$fp\' 
    REPLACE INTO TABLE `tx_cal_event` 
    FIELDS TERMINATED BY \';\' 
    ENCLOSED BY \'"\' 
    ESCAPED BY \'\\\\\' 
    LINES TERMINATED BY \'\\r\\n\'';
           
            $result = mysql_query($sql2);
            echo  mysql_error();
            echo "Einträge hinzugefügt bzw. ersetzt: ",$result; 


?>

Das stand übrigens auch auf der Seite die ich oben verlinkt habe.

Und benutze bitte den "Editieren" Button, statt eine neue Antwort zu erstellen (wenn du zwei mal hintereinander schreibst).
 
Gut, ich werde es in Zukunft berücksichtigen.


Ich habe es jetzt so:

PHP:
$fpfile = $_FILES["csvfile"]['tmp_name'];
			$fp = fopen ($fpfile,"r");
			$sql2 = 
	'LOAD DATA LOCAL INFILE \'tmp_name\' 
	REPLACE INTO TABLE `tx_cal_event` 
	FIELDS TERMINATED BY \';\' 
	ENCLOSED BY \'"\' 
	ESCAPED BY \'\\\\\' 
	LINES TERMINATED BY \'\\r\\n\'';
           
		    $result = mysql_query($sql2);
            echo  mysql_error();
            echo "Einträge hinzugefügt bzw. ersetzt: ",$result;

Fehler:

File 'tmp_name' not found (Errcode: 2)Einträge hinzugefügt bzw. ersetzt:



Ich denke es liegt hier drine:

PHP:
	$sql2 = 
	'LOAD DATA LOCAL INFILE \'tmp_name\' 
	REPLACE INTO TABLE `tx_cal_event` 
	FIELDS TERMINATED BY \';\' 
	ENCLOSED BY \'"\' 
	ESCAPED BY \'\\\\\' 
	LINES TERMINATED BY \'\\r\\n\'';

falsch formatiert?
tmp_name kommt dort gar nicht hin?
kann ich den tablename auch mit einer Variablen ein tragen?

:rolleyes:
 
CSV to MYSQL

Hallo,

ich muss fertig werden finde aber keine Lösung:

Meine Eingabe- PHP:

PHP:
<form action="eintragen.php" enctype="multipart/form-data" method="POST">  
<input name="csvfile" type="file" />  
<input type="submit" value="Submit" />  
</form


Meine send to Datenbank- PHP:

PHP:
$fpfile = $_FILES["csvfile"]['tmp_name']; 
            $fp = fopen ($fpfile,"r"); 
            $sql2 =  
    'LOAD DATA LOCAL INFILE \'tmp_name\'  
    REPLACE INTO TABLE `tx_cal_event`  
    FIELDS TERMINATED BY \';\'  
    ENCLOSED BY \'"\'  
    ESCAPED BY \'\\\\\'  
    LINES TERMINATED BY \'\\r\\n\''; 
            
            $result = mysql_query($sql2); 
            echo  mysql_error(); 
            echo "Einträge hinzugefügt bzw. ersetzt: ",$result;

Fehler:

File 'tmp_name' not found (Errcode: 2)Einträge hinzugefügt bzw. ersetzt:



Ich denke es liegt hier drine:

PHP:
$sql2 =  
    'LOAD DATA LOCAL INFILE \'tmp_name\'  
    REPLACE INTO TABLE `tx_cal_event`  
    FIELDS TERMINATED BY \';\'  
    ENCLOSED BY \'"\'  
    ESCAPED BY \'\\\\\'  
    LINES TERMINATED BY \'\\r\\n\'';

falsch formatiert?
tmp_name kommt dort gar nicht hin?
kann ich den tablename auch mit einer Variablen ein tragen?

Help, ich muss fertig werden...

:rolleyes:
 
Du sagst ihm hiermit: \'tmp_name\'

das die Datei tmp_name heißt und im gleichen verzeichniss liegt wie die PHP Datei.
Möglich das du $_FILES["csvfile"]['tmp_name'] als File stattdessen angeben kannst. Ansonsten musst du die Datei erst mit move_uploaded_file() und anschließendem chmod() so verschieben das MySQL Zugriff darauf hat. Aufgrund der Zugriffsrechte kann es sehr gut sein das MySQL keinen zugriff hätte.

http://de3.php.net/manual/de/function.chmod.php
http://de3.php.net/manual/de/function.move-uploaded-file.php

Also beispielsweise:
PHP:
move_uploaded_file ($_FILES["csvfile"]['tmp_name'],'tmp_name');
chmod('tmp_name', 0644)
// Query ausführen

unlink('tmp_name');
 
Zurück