Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Skrypt PHP do importowania danych csv do mysql

Kilka wskazówek:

  • Nie używaj przestarzałego ext/mysql , kiedy możesz użyć ext/mysqli lub PDO.

  • Nie wczytuj całego pliku csv do zmiennej PHP. Co się stanie, gdy plik ma 500 MB?

  • Nie pisz niestandardowego kodu PHP do analizowania danych csv, gdy możesz użyć wbudowanej funkcji fgetcsv() .

  • Nie twórz nowej instrukcji SQL dla każdego wiersza w danych, gdy możesz użyć przygotowane zestawienia .

  • Nie interpoluj danych z zewnętrznego pliku do instrukcji SQL. Grozi to wstrzyknięciem SQL luki, tak jak w przypadku interpolacji danych wejściowych niezaufanych użytkowników.

  • Nie analizuj i nie wstawiaj danych csv wiersz po wierszu, jeśli możesz użyć WCZYTAJ PLIK DANYCH Komenda. To 20x szybciej niż wstawianie wiersza po wierszu.

Oto prostsze rozwiązanie:

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

?>

Przetestowałem to z PHP 5.3.26 na Macu, łącząc się z MySQL 5.6.14 na Linuksie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wybrać kolumnę (kolumny) według ich pozycji liczbowej w tabeli?

  2. PHP Foreach w zestawie wyników MySQLi

  3. MySql Count nie może pokazać wartości 0

  4. Problem z porównywaniem dat MySQL

  5. Zapytanie w celu znalezienia kluczy obcych