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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
Bonjour,
Le 03/06/2009 23:13, Edwin Vancleef a écrit :
[...]
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
Bonjour,
Le 03/06/2009 23:13, Edwin Vancleef a écrit :
[...]
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.
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
Le 03 Jun 2009 21:13:37 GMT, Edwin Vancleef écrivait dans fr.comp.lang.php:
Bonjour, j'en ai marre :
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
Le 03 Jun 2009 21:13:37 GMT, Edwin Vancleef <vancleef@nospam.invalid>
écrivait dans fr.comp.lang.php:
Bonjour, j'en ai marre :
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 ?
Le 03 Jun 2009 21:13:37 GMT, Edwin Vancleef écrivait dans fr.comp.lang.php:
Bonjour, j'en ai marre :
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
> 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...
> 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...
> 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
> 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
> 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
> 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
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... :(
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... :(
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... :(
Nico D\.
Edwin Vancleef a écrit :
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.
Edwin Vancleef a écrit :
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).
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.
Denis Beauregard
Le 04 Jun 2009 13:52:40 GMT, Edwin Vancleef écrivait dans fr.comp.lang.php:
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
Le 04 Jun 2009 13:52:40 GMT, Edwin Vancleef <vancleef@nospam.invalid>
écrivait dans fr.comp.lang.php:
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.
Le 04 Jun 2009 13:52:40 GMT, Edwin Vancleef écrivait dans fr.comp.lang.php:
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
> 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.
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.
> 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.
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.
> 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.
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.