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 ?
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, 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
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 :
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...
> 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.
>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
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.