Mysql
 sql >> Base de données >  >> RDS >> Mysql

Script PHP pour importer des données csv dans mysql

Plusieurs astuces :

  • N'utilisez pas l'ext/mysql obsolète , quand vous pouvez utiliser ext/mysqli ou PDO.

  • Ne lisez pas l'intégralité du fichier csv dans une variable PHP. Que se passe-t-il lorsque le fichier fait 500 Mo ?

  • N'écrivez pas de code PHP personnalisé pour analyser les données csv, lorsque vous pouvez utiliser la fonction intégrée fgetcsv() .

  • Ne créez pas une nouvelle instruction SQL pour chaque ligne des données, alors que vous pouvez utiliser déclarations préparées .

  • N'interpolez pas les données d'un fichier externe dans des instructions SQL. Cela risque d'd'injection SQL vulnérabilités, tout comme lorsque vous interpolez une entrée utilisateur non fiable.

  • N'analysez pas et n'insérez pas de données csv ligne par ligne, alors que vous pouvez utiliser MySQL CHARGER LE FICHIER DE DONNEES commande. C'est 20 fois plus rapide que d'insérer ligne par ligne.

Voici une solution plus simple :

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

?>

J'ai testé cela avec PHP 5.3.26 sur un Mac, en me connectant à MySQL 5.6.14 sur Linux.