<?php
$databasehost = "localhost";
$databasename = "test";
$databasetable = "sample";
$databaseusername ="test";
$databasepassword = "";
$fieldseparator = ",";
$lineseparator = "\n";
$csvfile = "filename.csv";
/********************************/
/* Would you like to add an ampty field at the beginning of these records?
/* This is useful if you have a table with the first field being an auto_increment integer
/* and the csv file does not have such as empty field before the records.
/* Set 1 for yes and 0 for no. ATTENTION: don't set to 1 if you are not sure.
/* This can dump data in the wrong fields if this extra field does not exist in the table
/********************************/
$addauto = 0;
/********************************/
/* Would you like to save the mysql queries in a file? If yes set $save to 1.
/* Permission on the file should be set to 777. Either upload a sample file through ftp and
/* change the permissions, or execute at the prompt: touch output.sql && chmod 777 output.sql
/********************************/
$save = 1;
$outputfile = "output.sql";
/********************************/
if (!file_exists($csvfile)) {
echo "File not found. Make sure you specified the correct path.\n";
exit;
}
$file = fopen($csvfile,"r");
if (!$file) {
echo "Error opening data file.\n";
exit;
}
$size = filesize($csvfile);
if (!$size) {
echo "File is empty.\n";
exit;
}
$csvcontent = fread($file,$size);
fclose($file);
$con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());
@mysql_select_db($databasename) or die(mysql_error());
$lines = 0;
$queries = "";
$linearray = array();
foreach(split($lineseparator,$csvcontent) as $line) {
$lines++;
$line = trim($line," \t");
$line = str_replace("\r","",$line);
/************************************
This line escapes the special character. remove it if entries are already escaped in the csv file
************************************/
$line = str_replace("'","\'",$line);
/*************************************/
$linearray = explode($fieldseparator,$line);
$linemysql = implode("','",$linearray);
if($addauto)
$query = "insert into $databasetable values('','$linemysql');";
else
$query = "insert into $databasetable values('$linemysql');";
$queries .= $query . "\n";
@mysql_query($query);
}
@mysql_close($con);
if ($save) {
if (!is_writable($outputfile)) {
echo "File is not writable, check permissions.\n";
}
else {
$file2 = fopen($outputfile,"w");
if(!$file2) {
echo "Error writing to the output file.\n";
}
else {
fwrite($file2,$queries);
fclose($file2);
}
}
}
echo "Found a total of $lines records in this csv file.\n";
?>
CSV in MySQL importieren
Chris Coyier am
Die einzige Änderung, die ich empfehlen würde, ist die Verwendung von PDO anstelle der MySQL-Funktionen.
Das Erste, was mir beim Lesen in den Sinn kam.
Heutzutage wird mysql_connect so gut wie nicht mehr verwendet. Es gibt viele solide OOP-Lösungen. Insbesondere eine Seite wie diese sollte ihren Benutzern gute Beispiele mit diesen Schnipseln geben :)
Die Funktion split() ist veraltet – ersetzen Sie sie durch explode()
Warum nicht file() in Kombination mit str_getcsv() verwenden? Ich denke, das ist einfacher als fopen(). Was ist Ihre Meinung?
Abhängig davon, woher Sie Ihr CSV haben, hat CSV eine seltsame Syntax, bei der einige Felder möglicherweise nicht in Anführungszeichen eingeschlossen sind und einige schon (abhängig davon, ob Ihr Feld ein Leerzeichen, ein anderer Trenner (Komma usw.) enthält) und es maskiert Anführungszeichen innerhalb von Anführungszeichen, indem es ihnen ein weiteres Anführungszeichen voranstellt usw. Ja, CSV *kann* kompliziert werden, und ich glaube nicht, dass dieser Schnipsel all das behandelt.
All das, um zu sagen, ich stimme skytrips allgemeiner Meinung zu: Es gibt eine Reihe von
getcsv()-ähnlichen Funktionen in PHP, und sie kümmern sich um all diese Funktionssachen für Sie, und die Möglichkeit, dass es so ist oder nicht.Es ist auch sehr empfehlenswert, wenn Sie CSV exportieren, dass Sie die
putcsv()-Variante verwenden, anstatt zu versuchen, alles selbst zu machen.Es gibt die Funktion
fgetcsv, die einen Dateihandle, Ihre Trennzeichen nimmt und ein zweidimensionales Array ausgibt, nachdem sie all die kniffligen CSV-Syntaxfallen behandelt hat.Außerdem wäre eine noch bessere Lösung, einfach etwas wie Adminer (1 Datei auf Ihrem Server zur Bearbeitung der Datenbank) zu verwenden und die Funktion CSV-Datei hochladen zu nutzen. Wenn sie zu groß zum Hochladen ist, können Sie sie auf dem Server neben der Adminer-Datei ablegen, und sie kann von dort importieren.
Ich arbeite für ein Unternehmen, das täglich CSV-Feeds von über 50 Anbietern nutzt. Gibt es einen Grund, warum Sie diese Lösung gegenüber LOAD DATA INFILE verwenden würden?
Bei 200.000 Datensätzen in einer CSV würde dieser Schnipsel 200.000 Abfragen ausführen. LOAD DATA INFILE würde hingegen nur eine verwenden.
Ich versuche nicht, ein Troll zu sein, aber es gibt viele Probleme/Annahmen bei diesem Schnipsel. Einige sind oben aufgeführt. Für eine schnelle und unkomplizierte Lösung sollte er jedoch funktionieren.
Danke für das Teilen.
Ich stimme zu, dass dies im Notfall funktioniert. Für alle, die nach einer polierteren Lösung suchen, aber keine der vielen TOTEN CSV-Bibliotheken verwenden möchten, habe ich dieses Jahr meine eigene Bibliothek erstellt und sie gerade Open Source gemacht. Sie heißt Coseva und Sie finden sie auf Github.
Ich hoffe, jemand findet sie nützlich. :)
Dieser Code gibt mir Fehler wie "Datei ist nicht beschreibbar, Berechtigungen prüfen. Insgesamt 8 Datensätze in dieser CSV-Datei gefunden." ... gibt es eine Lösung?
Hervorragendes Tutorial. Ich habe den Tag damit verbracht, nach der Möglichkeit zu suchen, eine CSV-Datei mit PHP in eine MySQL-Datenbank einzufügen ... und BOOM! Hier ist sie auf meiner Lieblings-CSS-Seite. Tolle Arbeit! (und auch einige gute Vorschläge von den anderen Leuten) Insgesamt ist dies ein GROSSARTIGER Schnipsel zur Verwendung. Danke!
Wenn ich CSV hochlade, werden nur 3 von 10 hochgeladen