sql >> Base de Datos >  >> RDS >> Mysql

Script PHP para importar datos csv a mysql

Varios consejos:

  • No use el obsoleto ext/mysql , cuando puede usar ext/mysqli o PDO.

  • No lea todo el archivo csv en una variable de PHP. ¿Qué sucede cuando el archivo tiene 500 MB?

  • No escriba código PHP personalizado para analizar datos csv, cuando puede usar la función integrada fgetcsv() .

  • No cree una nueva instrucción SQL para cada fila de los datos, cuando puede usar declaraciones preparadas .

  • No interpole datos de un archivo externo en sentencias SQL. Esto corre el riesgo de inyección SQL vulnerabilidades, al igual que cuando interpola la entrada de un usuario que no es de confianza.

  • No analice e inserte datos csv fila por fila, cuando puede usar MySQL CARGAR ARCHIVO DE DATOS dominio. Es 20 veces más rápido que insertar fila por fila.

Aquí hay una solución más simple:

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

?>

Probé esto con PHP 5.3.26 en una Mac, conectándome a MySQL 5.6.14 en Linux.