sql >> Databasteknik >  >> RDS >> Mysql

PHP-skript för att importera csv-data till mysql

Flera tips:

  • Använd inte den utfasade ext/mysql , när du kan använda ext/mysqli eller PDO.

  • Läs inte hela csv-filen till en PHP-variabel. Vad händer när filen är 500 MB?

  • Skriv inte anpassad PHP-kod för att analysera csv-data, när du kan använda den inbyggda funktionen fgetcsv() .

  • Skapa inte en ny SQL-sats för varje rad i data, när du kan använda förberedda uttalanden .

  • Interpolera inte data från en extern fil till SQL-satser. Detta riskerar SQL-injektion sårbarheter, precis som när du interpolerar opålitlig användarinmatning.

  • Analysera och infoga inte csv-data rad för rad när du kan använda MySQL:s LADDA DATAINFIL kommando. Det är 20 gånger snabbare än att infoga rad för rad.

Här är en enklare lösning:

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

?>

Jag testade detta med PHP 5.3.26 på en Mac och ansluter till MySQL 5.6.14 på Linux.



  1. JDBC-anslutningsfel:okänd tidszon

  2. Få kolumnnamn som har maxvärdet i en rad sql

  3. Transformera ODBC-data i CloverDX

  4. Varning:mysql_real_escape_string():Åtkomst nekad för användaren 'root'@'localhost' (med lösenord:NO) .../public_html/checklogin.php