Saltar al contenido

LOAD DATA LOCAL INFILE falla: de php a mysql (en Amazon rds)

Solución:

He renunciado a esto, ya que creo que es un error en php, en particular el código mysql_connect, que ahora está en desuso. Probablemente podría resolverse compilando php usted mismo con cambios en la fuente utilizando pasos similares a los mencionados en el informe de error que @eggyal mencionó: https://bugs.php.net/bug.php?id=54158

En su lugar, voy a solucionarlo haciendo una llamada al sistema () y usando la línea de comando mysql:

$sql = "LOAD DATA LOCAL INFILE '$csvPathAndFile' INTO TABLE $tableName FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n';";
system("mysql -u $dbUser -h $dbHost --password=$dbPass --local_infile=1 -e "$sql" $dbName");

Eso está funcionando para mí.

Aquí hay una lista de verificación para descartar este desagradable error:


1- Otorgue al usuario privilegios de ARCHIVO en MySQL, phpMyAdmin generalmente no cubre este privilegio:

GRANT FILE ON *.* TO 'db_user'@'localhost';

2- Edite my.cnf en / etc / mysql / o su ruta mysql:

[mysql]
local-infile=1
[mysqld]
local-infile=1

3- En php.ini en / etc / php5 / cli / o similar:

mysql.allow_local_infile = On

Opcionalmente puede ejecutar ini_set en tu guión:

ini_set('mysql.allow_local_infile', 1);

4- La biblioteca del manejador de la base de datos debe usar las opciones correctas.
DOP:

new PDO('mysql:host=".$db_host.".;dbname=".$db_name, $db_user, $db_pass,
array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1));

mysqli:

$conn = mysqli_init();
mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($conn,server,user,code,database);

5- Asegúrese de que el comando INFILE use la ruta absoluta al archivo y que exista:

$sql = "LOAD DATA INFILE "".realpath(is_file($file))."'";

6- Compruebe que el archivo de destino y directorio principal son legibles por PHP y MySQL.

$ sudo chmod 777 file.csv

7- Si está trabajando localmente puede quitar el LOCAL de su SQL:

LOAD DATA INFILE

En lugar de:

LOAD DATA LOCAL INFILE

Nota: Recuerde reiniciar los servicios MySQL y PHP si edita sus archivos de configuración.

Espero que esto ayude a alguien.

Como se menciona en esta publicación, se requiere agregar el tercer y cuarto parámetro a mysql_connect para que LOAD LOCAL DATA INFILE funcione. Me ayudó. Cualquier otra sugerencia (apparmor, local-infile = 1 en my.cnf ampliamente discutida en Internet) no ayudó. ¡Seguir el código PHP funcionó para mí!

mysql_connect(HOST,USER,PASS,false,128);

Es cierto que esto también está en el manual.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *