Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Script PHP para importar dados csv para o mysql


Várias dicas:

  • Não use o ext/mysql obsoleto , quando você pode usar ext/mysqli ou PDO.

  • Não leia o arquivo csv inteiro em uma variável PHP. O que acontece quando o arquivo tem 500 MB?

  • Não escreva código PHP personalizado para analisar dados csv, quando você pode usar a função interna fgetcsv() .

  • Não crie uma nova instrução SQL para cada linha nos dados, quando você pode usar declarações preparadas .

  • Não interpole dados de um arquivo externo em instruções SQL. Isso corre o risco de injeção de SQL vulnerabilidades, assim como quando você interpolar entradas de usuários não confiáveis.

  • Não analise e insira dados csv linha por linha, quando você pode usar o CARREGAR INFIL DE DADOS comando. É 20x mais rápido do que inserir linha por linha.

Aqui está uma solução mais simples:
<?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";

?>

Eu testei isso com PHP 5.3.26 em um Mac, conectando ao MySQL 5.6.14 no Linux.