sql >> Database >  >> RDS >> Mysql

PHP-script om csv-gegevens in mysql te importeren

Enkele tips:

  • Gebruik niet de verouderde ext/mysql , wanneer u ext/mysqli of PDO kunt gebruiken.

  • Lees niet het hele csv-bestand in een PHP-variabele. Wat gebeurt er als het bestand 500 MB is?

  • Schrijf geen aangepaste PHP-code om csv-gegevens te ontleden, wanneer u de ingebouwde functie fgetcsv() .

  • Maak geen nieuwe SQL-instructie voor elke rij in de gegevens, wanneer u voorbereide verklaringen .

  • Interpoleer geen gegevens uit een extern bestand in SQL-instructies. Dit riskeert SQL-injectie kwetsbaarheden, net zoals wanneer u niet-vertrouwde gebruikersinvoer interpoleert.

  • Ontleden en voeg geen csv-gegevens rij voor rij in, wanneer u MySQL's LAAD DATA INFILE opdracht. Het is 20x sneller dan rij voor rij invoegen.

Hier is een eenvoudigere oplossing:

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

?>

Ik heb dit getest met PHP 5.3.26 op een Mac, verbinding makend met MySQL 5.6.14 op Linux.



  1. Onze nieuwe SQLPerformance.com nieuwsbrief

  2. SQL Server:moet ik information_schema-tabellen gebruiken in plaats van sys-tabellen?

  3. Waarom is IS NOT NULL false bij het controleren van een rijtype?

  4. Is er een manier om de weergavedefinitie van een SQL Server op te halen met behulp van gewone ADO?