Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP-Skript zum Importieren von CSV-Daten in MySQL

Einige Tipps:

  • Verwenden Sie nicht das veraltete ext/mysql , wenn Sie ext/mysqli oder PDO verwenden können.

  • Lesen Sie nicht die gesamte CSV-Datei in eine PHP-Variable ein. Was passiert, wenn die Datei 500 MB groß ist?

  • Schreiben Sie keinen benutzerdefinierten PHP-Code, um CSV-Daten zu parsen, wenn Sie die eingebaute Funktion fgetcsv() .

  • Erstellen Sie nicht für jede Zeile in den Daten eine neue SQL-Anweisung, wenn Sie vorbereitete Erklärungen .

  • Interpolieren Sie keine Daten aus einer externen Datei in SQL-Anweisungen. Dies riskiert SQL-Injection Schwachstellen, genau wie wenn Sie nicht vertrauenswürdige Benutzereingaben interpolieren.

  • Analysieren und fügen Sie CSV-Daten nicht Zeile für Zeile ein, wenn Sie MySQLs DATEN INFILE LADEN Befehl. Das ist 20-mal schneller als das zeilenweise Einfügen.

Hier ist eine einfachere Lösung:

<?php
$databasehost = "localhost"; 
$databasename = "test"; 
$databasetable = "sample"; 
$databaseusername="test"; 
$databasepassword = ""; 
$fieldseparator = ","; 
$lineseparator = "\n";
$csvfile = "filename.csv";

if(!file_exists($csvfile)) {
    die("File not found. Make sure you specified the correct path.");
}

try {
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", 
        $databaseusername, $databasepassword,
        array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );
} catch (PDOException $e) {
    die("database connection failed: ".$e->getMessage());
}

$affectedRows = $pdo->exec("
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
      FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
      LINES TERMINATED BY ".$pdo->quote($lineseparator));

echo "Loaded a total of $affectedRows records from this csv file.\n";

?>

Ich habe dies mit PHP 5.3.26 auf einem Mac getestet und eine Verbindung zu MySQL 5.6.14 unter Linux hergestellt.