Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Skrip PHP untuk mengimpor data csv ke mysql

Beberapa kiat:

  • Jangan gunakan ext/mysql yang tidak digunakan lagi , ketika Anda dapat menggunakan ext/mysqli atau PDO.

  • Jangan membaca seluruh file csv menjadi variabel PHP. Apa yang terjadi jika file berukuran 500MB?

  • Jangan menulis kode PHP khusus untuk mengurai data csv, jika Anda dapat menggunakan fungsi bawaan fgetcsv() .

  • Jangan membuat pernyataan SQL baru untuk setiap baris dalam data, jika Anda dapat menggunakan pernyataan yang disiapkan .

  • Jangan menginterpolasi data dari file eksternal ke dalam pernyataan SQL. Ini berisiko injeksi SQL kerentanan, seperti saat Anda menginterpolasi input pengguna yang tidak tepercaya.

  • Jangan mengurai dan menyisipkan data csv baris demi baris, saat Anda dapat menggunakan MUAT INFILE DATA memerintah. Ini 20x lebih cepat daripada menyisipkan baris demi baris.

Inilah solusi yang lebih sederhana:

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

?>

Saya menguji ini dengan PHP 5.3.26 di Mac, menghubungkan ke MySQL 5.6.14 di Linux.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menemukan Kode ASCII untuk Karakter tertentu di MySQL

  2. layanan mysqld berhenti sekali sehari di server EC2

  3. SQL Ganti beberapa variabel dari tabel lain dalam hasil kueri

  4. Apa artinya ketika MySQL dalam keadaan Mengirim data?

  5. Cara Menemukan Collation di MySQL