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.