sql >> Databáze >  >> RDS >> Mysql

PHP skript pro import dat csv do mysql

Několik tipů:

  • Nepoužívejte zastaralé ext/mysql , kdy můžete použít ext/mysqli nebo PDO.

  • Nečtěte celý soubor csv do proměnné PHP. Co se stane, když má soubor 500 MB?

  • Nepište vlastní kód PHP pro analýzu dat csv, když můžete použít vestavěnou funkci fgetcsv() .

  • Nevytvářejte nový příkaz SQL pro každý řádek v datech, když můžete použít připravené výpisy .

  • Neinterpolujte data z externího souboru do příkazů SQL. Hrozí tím vložení SQL zranitelnosti, stejně jako když interpolujete nedůvěryhodný uživatelský vstup.

  • Neanalyzujte a nevkládejte data csv řádek po řádku, když můžete použít NAČÍST DATOVÝ VSTUPNÍ SOUBOR příkaz. Je to 20x rychlejší než vkládání řádek po řádku.

Zde je jednodušší řešení:

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

?>

Testoval jsem to s PHP 5.3.26 na Macu, připojením k MySQL 5.6.14 na Linuxu.



  1. Jak vrátit pouze datum z datového typu SQL Server DateTime

  2. Jak vytvořím alias tabulky v MySQL

  3. Odstraňte příspěvky a komentáře z Plánovače akcí

  4. Vícerozměrné pole PHP MYSQL