Discussion:
LOAD DATA LOCAL INFILE
(trop ancien pour répondre)
Edwin Vancleef
2009-06-03 21:13:37 UTC
Permalink
Bonjour, j'en ai marre :

The used command is not allowed with this MySQL version

Code :

mysql_connect( "localhost", "login", "pass", false, 128 ) or die(
"Perdu !\n" );
mysql_select_db( "base" );
mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" ) or
die( mysql_error() . "\n" );

Ce serveur MySQL autorise pourtant bien cette commande. La preuve :

mysql --local-infile=1 -h localhost -u login -p
use base;
LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`
Query OK, 5 rows affected (0.02 sec)
Records: 5 Deleted: 0 Skipped: 0 Warnings: 0

Test à partir d'une autre machine :

- Code PHP identique
- Connexion au même serveur SQL, avec le même utilisateur, avec les
mêmes privilèges

Résultat : Ca marche.

Le seul truc différent entre les 2 machines : PHP4 contre PHP5, et
peut-être le php.ini. Pourtant, je n'ai rien vu de spécial : Safe Mode
SQL désactivé dans les 2 cas.

sql.safe_mode = Off

Question : Avez-vous une idée de ce mystère ?
Olivier Miakinen
2009-06-03 22:12:46 UTC
Permalink
Bonjour,
Post by Edwin Vancleef
[...]
Le seul truc différent entre les 2 machines : PHP4 contre PHP5, et
peut-être le php.ini. [...]
Cela semble bien indiquer un problème de PHP, si vraiment il n'y a que
ça qui diffère, mais je ne vois pas comment la version de PHP pourrait à
elle seule provoquer une erreur SQL. Je te suggère d'aller d'abord poser
ta question dans fr.comp.applications.sgbd si tu ne l'as pas déjà fait,
j'ai l'impression que tu aurais plus de chances d'y trouver la réponse
que tu cherches.
--
Olivier Miakinen
Edwin Vancleef
2009-06-04 09:52:31 UTC
Permalink
Post by Olivier Miakinen
Cela semble bien indiquer un problème de PHP, si vraiment il n'y a que
ça qui diffère, mais je ne vois pas comment la version de PHP pourrait à
elle seule provoquer une erreur SQL. Je te suggère d'aller d'abord poser
ta question dans fr.comp.applications.sgbd si tu ne l'as pas déjà fait,
j'ai l'impression que tu aurais plus de chances d'y trouver la réponse
que tu cherches.
J'ai déjà fouillé sur tout le réseau Internet du système solaire. Les
experts du SGBD qui connaissent MySQL sur le bout des doigts répondront
tous la même chose :

Pour que la commande LOAD DATA LOCAL INFILE fonctionne, il faut que le
serveur autorise la commande, mais il faut aussi que le client autorise
la commande (c'est dans la doc de MySQL).

Pour ce qui est du serveur, on sait qu'il l'autorise, puisque ça marche
pour le client mysql en ligne de commande. Il faut toutefois utiliser
l'option --local-infile=1 pour que le client autorise également la
commande.

En ce qui concerne PHP, pour autoriser la commande, il faut mettre le
flag 128. Ca marche sur mon PHP4. En ce qui concerne PHP5, il y a un
autre verrou magique qui m'échappe, qui bloque la commande, ou
peut-être, qui refuse le 128.

D'après la doc de PHP, le paramètre 128 est refusé en Safe Mode SQL. Or,
j'ai bien vérifié que le Safe Mode SQL était désactivé. D'ailleurs, j'ai
carrément désactivé tout le Safe Mode, et le serveur continue à
m'insulter :

The used command is not allowed with this MySQL version
Edwin Vancleef
2009-06-04 09:52:31 UTC
Permalink
Post by Olivier Miakinen
Cela semble bien indiquer un problème de PHP, si vraiment il n'y a que
ça qui diffère, mais je ne vois pas comment la version de PHP pourrait à
elle seule provoquer une erreur SQL. Je te suggère d'aller d'abord poser
ta question dans fr.comp.applications.sgbd si tu ne l'as pas déjà fait,
j'ai l'impression que tu aurais plus de chances d'y trouver la réponse
que tu cherches.
J'ai déjà fouillé sur tout le réseau Internet du système solaire. Les
experts du SGBD qui connaissent MySQL sur le bout des doigts répondront
tous la même chose :

Pour que la commande LOAD DATA LOCAL INFILE fonctionne, il faut que le
serveur autorise la commande, mais il faut aussi que le client autorise
la commande (c'est dans la doc de MySQL).

Pour ce qui est du serveur, on sait qu'il l'autorise, puisque ça marche
pour le client mysql en ligne de commande. Il faut toutefois utiliser
l'option --local-infile=1 pour que le client autorise également la
commande.

En ce qui concerne PHP, pour autoriser la commande, il faut mettre le
flag 128. Ca marche sur mon PHP4. En ce qui concerne PHP5, il y a un
autre verrou magique qui m'échappe, qui bloque la commande, ou
peut-être, qui refuse le 128.

D'après la doc de PHP, le paramètre 128 est refusé en Safe Mode SQL. Or,
j'ai bien vérifié que le Safe Mode SQL était désactivé. D'ailleurs, j'ai
carrément désactivé tout le Safe Mode, et le serveur continue à
m'insulter :

The used command is not allowed with this MySQL version
Denis Beauregard
2009-06-03 22:29:39 UTC
Permalink
Post by Edwin Vancleef
mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" ) or
Chez moi, il faut enlever le "LOCAL" pour que cela marche.

Par ailleurs, pourquoi ne pas indiquer le chemin complet du fichier,
au cas où cela aurait une influence ?


Denis
Edwin Vancleef
2009-06-04 09:52:31 UTC
Permalink
Post by Denis Beauregard
Chez moi, il faut enlever le "LOCAL" pour que cela marche.
Oh... Ca marche chez moi aussi... Il me semble pourtant être déjà tombé
sur cette piste, mais je ne me souviens plus pourquoi je ne l'avais pas
suivie...

Merci, et excusez-moi d'avoir été aussi con...
Edwin Vancleef
2009-06-04 13:52:40 UTC
Permalink
J'ai encore un problème :( LOAD DATA INFILE (sans LOCAL) me donne accès
à n'importe quel fichier du disque dur. C'est dangereux. J'en reviens
donc à vouloir faire marcher LOAD DATA LOCAL INFILE... :(
Denis Beauregard
2009-06-04 21:57:24 UTC
Permalink
Post by Edwin Vancleef
J'ai encore un problème :( LOAD DATA INFILE (sans LOCAL) me donne accès
à n'importe quel fichier du disque dur. C'est dangereux. J'en reviens
donc à vouloir faire marcher LOAD DATA LOCAL INFILE... :(
Pourquoi ne pas valider le nom du fichier avant d'appeler cette
fonction ? Si un visiteur peut appeler directement la fonction sans
validation, alors il peut aussi l'appeler sans LOCAL...

Validation simple : il doit y avoir un seul point, ou bien il doit n'y
avoir aucune oblique ni contre-oblique.

Ceci dit, en phpmyadmin, on peut faire pratiquement ce qu'on veut de
toutes façons.


Denis
Edwin Vancleef
2009-06-05 08:15:55 UTC
Permalink
Post by Denis Beauregard
Pourquoi ne pas valider le nom du fichier avant d'appeler cette
fonction ?
Je ne peux pas. L'une des exigeances de mon programme est de permettre
au visiteur d'exécuter n'importe quelle requête SQL, sans aucune
limitation au niveau de la requête. C'est seulement au niveau des
privilèges que j'ai le droit de le limiter.
Post by Denis Beauregard
Si un visiteur peut appeler directement la fonction sans
validation, alors il peut aussi l'appeler sans LOCAL...
Non. Pour pouvoir utiliser la fonction sans LOCAL, il doit avoir le
privilège FILE, privilège que j'aurais parfaitement été disposé à lui
fournir si ça ne lui donnait pas accès à tous les fichiers.
Edwin Vancleef
2009-06-04 13:52:40 UTC
Permalink
J'ai encore un problème :( LOAD DATA INFILE (sans LOCAL) me donne accès
à n'importe quel fichier du disque dur. C'est dangereux. J'en reviens
donc à vouloir faire marcher LOAD DATA LOCAL INFILE... :(

Edwin Vancleef
2009-06-04 09:52:31 UTC
Permalink
Post by Denis Beauregard
Chez moi, il faut enlever le "LOCAL" pour que cela marche.
Oh... Ca marche chez moi aussi... Il me semble pourtant être déjà tombé
sur cette piste, mais je ne me souviens plus pourquoi je ne l'avais pas
suivie...

Merci, et excusez-moi d'avoir été aussi con...
Nico D\.
2009-06-04 16:03:30 UTC
Permalink
Post by Edwin Vancleef
mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" )
Le seul truc différent entre les 2 machines : PHP4 contre PHP5
Donc (à priori) Mysql 4 contre 5

J'ai déjà eu ce problème qui est lié à une différence de configuration
des droits -> voir dans la doc l'utilisation de LOCAL (de mémoire sur
une config standard Mysql5 il ne faut pas utiliser LOCAL).
--
Nico D.
Olivier Miakinen
2009-06-03 22:12:46 UTC
Permalink
Bonjour,
Post by Edwin Vancleef
[...]
Le seul truc différent entre les 2 machines : PHP4 contre PHP5, et
peut-être le php.ini. [...]
Cela semble bien indiquer un problème de PHP, si vraiment il n'y a que
ça qui diffère, mais je ne vois pas comment la version de PHP pourrait à
elle seule provoquer une erreur SQL. Je te suggère d'aller d'abord poser
ta question dans fr.comp.applications.sgbd si tu ne l'as pas déjà fait,
j'ai l'impression que tu aurais plus de chances d'y trouver la réponse
que tu cherches.
--
Olivier Miakinen
Denis Beauregard
2009-06-03 22:29:39 UTC
Permalink
Post by Edwin Vancleef
mysql_query( "LOAD DATA LOCAL INFILE 'fichier.csv' INTO TABLE `machin`" ) or
Chez moi, il faut enlever le "LOCAL" pour que cela marche.

Par ailleurs, pourquoi ne pas indiquer le chemin complet du fichier,
au cas où cela aurait une influence ?


Denis
Loading...