Mysql
 sql >> Database >  >> RDS >> Mysql

Script PHP per importare dati csv in mysql

Diversi suggerimenti:

  • Non utilizzare ext/mysql deprecato , quando puoi usare ext/mysqli o PDO.

  • Non leggere l'intero file CSV in una variabile PHP. Cosa succede quando il file è di 500 MB?

  • Non scrivere codice PHP personalizzato per analizzare i dati CSV, quando puoi utilizzare la funzione integrata fgetcsv() .

  • Non creare una nuova istruzione SQL per ogni riga dei dati, quando puoi utilizzare dichiarazioni preparate .

  • Non interpolare i dati da un file esterno in istruzioni SQL. Ciò rischia SQL injection vulnerabilità, proprio come quando interpoli l'input di utenti non attendibili.

  • Non analizzare e inserire i dati CSV riga per riga, quando puoi utilizzare CARICA FILE DATI comando. È 20 volte più veloce dell'inserimento riga per riga.

Ecco una soluzione più semplice:

<?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";

?>

L'ho testato con PHP 5.3.26 su un Mac, collegandomi a MySQL 5.6.14 su Linux.