OVH Cloud OVH Cloud

lecture mySQL d'une table chez free

7 réponses
Avatar
Boris
Bonjour à tous,
je cherche à faire une interface php pour qu'un utilisateur soumette un
fichier contenant des données formattées pour une table mySQL.
je n'arrive pas chez free à utiliser un LOAD DATA LOCAL INFILE, quand je
recopie l'instruction dans phpMyAdmin, il me dit Load data disabled, et
pourtant il arrive à le faire avec l'interface manuelle d'insertion de
données provenant d'un fichier texte (ce que je veux éviter pour mes
utilisateurs). Quand je tape directement l'instruction en php dans mes
fichiers php, et que je les charge, il me renvoie "can't do that on your
script". Si je mets le fichier sur le compte et que je lance un LOAD
DATA INFILE, il ne fait pas non plus l'insertion.
Ma (double) question est donc :
- Savez-vous si une astuce est utilisée par phpMyAdmin pour contourner
le load data disabled, est-ce que free l'aurait un peu modifié pour
qu'on ne puisse faire un load data que depuis leur phpmyadmin ?
- Sachant que tout cela est très dépendant de free, et que je veux au
maximum faire du LOCAL pour éviter que chaque fichier qu'un utilisateur
lui soumet soit transféré sur le compte (ce qui, à terme, prendrait de
la place), savez-vous s'il existe un moyen en php de lire chaque ligne
d'un fichier texte, les champs étant séparés par un caractère spécial
(disons @) ? Cette solution, si elle existe, n'est-elle pas trop lente ?
Merci à tous par avance
--
Boris
http://www.pi314.net

7 réponses

Avatar
Nicolas
Ma (double) question est donc :
- Savez-vous si une astuce est utilisée par phpMyAdmin pour contourner
le load data disabled, est-ce que free l'aurait un peu modifié pour
qu'on ne puisse faire un load data que depuis leur phpmyadmin ?


Aucune idée, à part de regarder dans le code (très instructif) de
phpMyAdmin...

- Sachant que tout cela est très dépendant de free, et que je veux au
maximum faire du LOCAL pour éviter que chaque fichier qu'un utilisateur
lui soumet soit transféré sur le compte (ce qui, à terme, prendrait de
la place), savez-vous s'il existe un moyen en php de lire chaque ligne
d'un fichier texte, les champs étant séparés par un caractère spécial
(disons @) ? Cette solution, si elle existe, n'est-elle pas trop lente ?


Pour lire un fichier ligne à ligne et extraire de chaque ligne des données
séparée par un caractère spécial :

// CHARGE LE FICHIER DANS UN TABLEAU
$lines = file($file);

// BOUCLE SUR LES LIGNES
for ($i=0; $i < count($lines); $i++) {
$lines[$i] = trim($lines[$i]);
$infos = explode(';', $lines[$i]); // champs séparés par des ';'

// $info[0] contient le premier champ de la ligne $i
// $info[1] contient le deuxième champ de la ligne $i etc...

// UNTAINT
// pas une mauvaise idée de faire ici quelques vérifications sur les
données
// ou sur leur format

// ON FAIT CE QU'ON VEUT AVEC NOS $infos
// (insertion dans une base ou n'importe quoi d'autre).

}

Je ne pense pas que ce soit un script particulièrement lent : c'est plutôt
direct, une seule boucle. Evidemment, si tu manipules des fichiers de 100
000 lignes, il faudra peut-être ajouter un set_time_limit pour te donner un
peu de temps (mais phpMyAdmin aurait lui aussi besoin d'un peu de temps).

N.

Avatar
Boris Gourevitch
Nicolas a écrit:
Ma (double) question est donc :
- Savez-vous si une astuce est utilisée par phpMyAdmin pour contourner
le load data disabled, est-ce que free l'aurait un peu modifié pour
qu'on ne puisse faire un load data que depuis leur phpmyadmin ?



Aucune idée, à part de regarder dans le code (très instructif) de
phpMyAdmin...

moi je le trouve plutôt compliqué ;o) mais bon je débute en php.

Avec leurs optimisations successives, pas facile de suivre.


[snip]

Pour lire un fichier ligne à ligne et extraire de chaque ligne des
données

séparée par un caractère spécial :

// CHARGE LE FICHIER DANS UN TABLEAU
$lines = file($file);

// BOUCLE SUR LES LIGNES
for ($i=0; $i < count($lines); $i++) {
$lines[$i] = trim($lines[$i]);
$infos = explode(';', $lines[$i]); // champs séparés par des ';'

[snip]

}

[snip]


eh ben c'est exactement ce que j'ai fait hier soir finalement, mais par
contre j'ai utilisé fopen et fgets
ça marche, mais je n'ai aucune idée de la stabilité du truc et de sa
rapidité. Ce qui m'agace, c'est que j'ai dû le faire en plus en php3
façon free, au lieu de php 4, car impossible de poster un formulaire
fichier chez eux, le $userfile[0] n'est pas récupéré, c'est bizarre....
merci d'avoir pris le temps de me répondre
--
Boris
http://www.pi314.net


Avatar
Geoffrey Bachelet
"Boris Gourevitch" a écrit
fichier chez eux, le $userfile[0] n'est pas récupéré, c'est bizarre....
merci d'avoir pris le temps de me répondre


tu as essayé avec $_FILES ?

Avatar
Jedi121
Boris wrote:
- Savez-vous si une astuce est utilisée par phpMyAdmin pour contourner
le load data disabled, est-ce que free l'aurait un peu modifié pour
qu'on ne puisse faire un load data que depuis leur phpmyadmin ?


Il existe une histoire de mysql_options() dans la doc MySQL mais ce n'est pas
accessible chez Free. Je ne vois pas de paliatif.

- Sachant que tout cela est très dépendant de free, et que je veux au
maximum faire du LOCAL pour éviter que chaque fichier qu'un
utilisateur lui soumet soit transféré sur le compte (ce qui, à terme,
prendrait de la place), savez-vous s'il existe un moyen en php de
lire chaque ligne d'un fichier texte, les champs étant séparés par un
caractère spécial (disons @) ? Cette solution, si elle existe,
n'est-elle pas trop lente ? Merci à tous par avance


Tu te mélanges les pinceaux, le LOCAL du script PHP reste le serveur sur lequel
il tourne, pas le client. Donc il faudra toujours uploader le fichier du client
vers le serveur puis utiliser la fonction LOCAL.
Pour lire ton fichier :
file_get_contents() ou readfile() suivant ce qui t'arrange le mieux.
Mais il faut uploader le fichier, le lire puis le détruire ( fonction unlink() )

Le plus simple ne serait-il pas de demander la requête dans un champs texte et
de l'exécuter après vérification du contenu (éviter les DROP TABLE et autres
blagues)?

Avatar
Boris
Jedi121 a écrit:
Boris wrote:

[snip]
Tu te mélanges les pinceaux, le LOCAL du script PHP reste le serveur sur lequel
il tourne, pas le client. Donc il faudra toujours uploader le fichier du client
vers le serveur puis utiliser la fonction LOCAL.


oui mais quand on fait un formulaire fichier, il me semble bien qu'il le
lit directement chez nous, non ? (c recopié dans un fichier temporaire
qui est chez moi en tous les cas, lorsque je lui demande $userfile).
A-t-il vraiment besoin en intermédiaire de le recopier comme un fichier
temporaire chez free ?
En tous els cas, j'ai essayé d'uploader un fichier, puis de faire un
copy dans un répertoire connu de mon compte, puis de le lire, c'est 5
fois plus lent que de lire directement le fichier par une fonction fgets
et fread.

Pour lire ton fichier :
file_get_contents() ou readfile() suivant ce qui t'arrange le mieux.
Mais il faut uploader le fichier, le lire puis le détruire ( fonction unlink() )



ben j'ai pas l'impression d'avoir eu besoin de tout ça avec mon fread et
mon fgets (et mon fclose à la fin) :o/

Le plus simple ne serait-il pas de demander la requête dans un champs texte et
de l'exécuter après vérification du contenu (éviter les DROP TABLE et autres
blagues)?


ça dépend à qui on s'adresse dans l'interface :o)
me sutilisateurs sont peu habitués de l'informatique....
je préfère un fichier formatté par un tableur standard et que les gens
n'aient qu'à soumettre le fichier (c'est un contenu de base de données),
plutôt qu'ils aient à recopier les données dans un champ texte.
Cela dit, ça doit marcher effectivement.
--
Boris
http://www.pi314.net

Avatar
Jedi121
"Boris" a écrit le 24/10/2003 :
oui mais quand on fait un formulaire fichier, il me semble bien qu'il le lit
directement chez nous, non ? (c recopié dans un fichier temporaire qui est
chez moi en tous les cas, lorsque je lui demande $userfile). A-t-il vraiment
besoin en intermédiaire de le recopier comme un fichier temporaire chez free
?


Non... et le terme "chez moi" est ambigue.
Avec un champs file, le fichier est envoyé au serveur où il est créé
avec un nom de fichier temporaire si tu ne le renomme pas il est
détruit à la fin du script. C'est comme ça que cela fonctionne.
Attention quand tu fais tes tests en local tu es à la fois le serveur
et le client et je pense que tu as du mal à faire la différence.

En tous els cas, j'ai essayé d'uploader un fichier, puis de faire un copy
dans un répertoire connu de mon compte, puis de le lire, c'est 5 fois plus
lent que de lire directement le fichier par une fonction fgets et fread.


Oui mais tu ne peux pas faire de fgets() ou fread() depuis le serveur
vers un poste client. Re-mélange du serveur/client.

Avatar
Boris
Jedi121 a écrit:
"Boris" a écrit le 24/10/2003 :

[snip] Attention quand

tu fais tes tests en local tu es à la fois le serveur et le client et je
pense que tu as du mal à faire la différence.


où à l'expliquer....
alors je re-décris le truc
je fais un formulaire fichier sur une page, qui envoie sur une page b.php
sur cette page, j'ai essayé de mettre un LOAD DATA LOCAL INFILE, ça ne
marche pas chez moi, et quand je transfère la page b.php sur mon compte
free, ça ne marche pas non plus sur le net. Il me renvoie "can't do that
on your script". Comme je l'ai dit, ça marche pourtant dans PHPMyAdmin
version free, puisqu'il me dit qu'il utilise lui-même cette instruction
(mais a-t-il alors recopié le fichier soumis sur un répertoiere
temporaire de chez free ?)
par contre j'ai réussi à lire le fichier avec fgets et fread sur la page
b.php (mais en écrivant tout en php3 -> b.php3, ça ne marche pas en php4
chez free.)
donc pour résumer la question :
qu'-a-t-il fait du fichier envoyé par le formulaire fichier ?
si j'ai bien compris ce que tu m'as dit, il a en fait été envoyé dans un
répertoire temporaire de chez free sous un nom barbare comme j'ai pu
l'observer en lisant le $userfile ?
Pourquoi le LOAD DATA LOCAL INFILE n'a pas marché ? ça je ne crois pas
avoir bien compris...
Merci :o)

--
Boris
http://www.pi314.net