EXECUTER UNE REQUÊTE CONTENANT PLUSIEURS SOUS-REQUÊTES

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 5 févr. 2008 à 08:09
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010 - 6 févr. 2008 à 10:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/45628-executer-une-requete-contenant-plusieurs-sous-requetes

cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
6 févr. 2008 à 10:24
Je suis d'accord avec toi coucou747 mis à part sur un point.

Je ne trouve pas que les notes servent à rien, je m'explique : Parfois je suis à la recherche d'un code permettant une fonctionnalité précise. Si je vois que ce code a une note de 1, je sais que je ne pourrais pas l'utiliser sans apporter des changements majeurs... donc je préfère ne pas l'utiliser.

MadM@tt => Je suis désolé, je ne me permet pas de juger tes capacités de programmeur, j'ai simplement donné mon avis sur ce code
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
6 févr. 2008 à 10:05
t'es pas le premier a critiquer les notes, perso, je trouve qu'on devrait pourvoir reporter :

une liste de bugs
une liste d'ameliorations
une liste de defauts dans le code
des felicitations

les fond d'ecrans des commentaires seraient classes selon leur utilite

et les notes ne servent tout simplement a rien...

la, si j'ai mis 1 c'est parce-que je trouve ca pretentieux de parler de partage pour 9 lignes de code... Le code ne vaut pas plus et l'auteur n'en a pas conscience, alors...
LaurentKOogar Messages postés 369 Date d'inscription samedi 4 septembre 2004 Statut Membre Dernière intervention 20 octobre 2013
6 févr. 2008 à 09:45
Niveau : Débutant
Note: 1/10

Je plussoie avec vous cher MadM@tt, c'est infame comme note!! beaucoup d'égo de la part des votants... L'administrateur devrait laisser la liberté aux débutants d'accepter d'être noté ou pas par les membres.
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
6 févr. 2008 à 09:31
Personnellement je te déconseille cette solution : ça va être beaucoup trop complexe ! !
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 févr. 2008 à 21:15
Je n'ai pas trop eu le choix sur l'export...

Et je n'ai pas de shell mysql sur mon hébergeur.

Je ne peux pas "fuire" le problème, le fait de parser la requête serait une solution.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 21:01
le script d'export est mauvais d'une part :

INSERT INTO table (...) VALUES (...), (...) ;

t'as un seul insert

ensuite, si t'as un ; dans une data ca merde donc bon...

ce que je ferais pour ce cas : je decouperais selon les ; qui ne sont pas dans des chaines, ou mieux, j'ouvrirais une pipe vers le programme shell mysql... et il ferait tout le travail a ma place
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 févr. 2008 à 20:53
Super solution. Tu remarqueras qu'elle peut s'appliquer à peu près à n'importe quel problème.
Si je veux faire un script qui va insérer des lignes dans un table exportés préalablement d'une autre table (donc sous forme de requetes INSERT), et que j'ai 50 lignes à insérer, je vais pas me les décomposer à la main une à une. (sachant que je ne peux pas faire la copie des lignes "à la main")
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 20:49
je ne ferais pas... tout simplement...

si t'as plusieurs requetes a effectuer, tu fais plusieurs query, c'est tout...
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 févr. 2008 à 20:43
Ben alors comment tu ferais ?
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 20:41
ca aurait fait classe....

/**
* @bug si les ; servent a autre chose que separer les requettes, ca fout la merde et renvoie false en executant la moitie des requetes
*/

pour contourner ca, t'aurais du parser les requetes, je te laisse imaginer la fiabilite du systeme et la consomation de ressources...

bref, non ca n'aurait pas servi...
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 févr. 2008 à 20:37
Mais j'ai rien contre refondre complètement le code, je l'ai déjà fait sur d'autres codes. C'est comme ça qu'on apprend. Je vois pas où est le problème, et au final comme tu le dis ça serait devenu un vrai code source fiable et complet.

Et je sais d'expérience qu'il n'est pas évident de savoir qu'on ne peut pas exécuter plusieurs requête dans une seule en php, et comment faire pour contourner ça, donc je pense que ça aurait pu servir à quelques uns.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 20:14
j'ai mis 1 quand j'ai vu que tu parlais de partage... partager 9 lignes de code simples, c'est pas ce que j'appelle du partage... surtout quand t'as un bug dans ces neuf lignes...

l'amelioration ici se resumerait a :
- faire un vrai parsing de la requete sql pour savoir ou couper
- faire une gestion des requetes avec echappement anti XSS
- faire une gestion des erreurs avec des Exceptions
- faire une gestion des retours avec des ArrayItterators (un pour les requetes, un pour les results)

si je conclue : t'en as pour au moins 100 fois plus de lignes pour faire un truc correct... t'aurais poste 100 lignes, j'aurais pu penser qu'une amelioration fut possible, mais la : t'as poste 9 lignes, c'est pas une amelioration qu'il faudrait... c'est une refonte complete du code...

tu postes 9 lignes mal documentes, bugges et qui ne servent a rien... c'est gentil, mais tu t'attendais vraiment a recevoir plus de 3/10 ?
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 févr. 2008 à 19:59
Eh ben c'est la fête ce soir !

Je sais pas trop comment ça se passe sur PHPCS, mais je vais vous expliquer comment ça se passe sur d'autres site de Codes sources (vbfrance par exemple).

Si un code est mauvais, on explique pourquoi et on laisse le temps à l'auteur d'améliorer son code. Je ne cours pas après les bonnes notes, au contraire je part du principe que ce genre de site est la pour aider à progresser et partager des éléments intéressants plutôt que de juger en soi les codes sources de chacun. Mais recevoir 3 notes comme ça ça motive vraiment PAS DU TOUT pour modifier ce code source.

Donc plomber quelqu'un en lui balançant des notes de merde le jour même il poste ce code (et je rappelle que ce code je le met car j'ai passé assez longtemps sur google à chercher pourquoi on pouvait pas exécuter plusieurs requête en un seul mysql_query() et comment faire pour contourner ça facilement, donc j'ai posté ça uniquement dans le but d'aider), ben c'est pas constructif du tout (même si vos commentaires contiennent bien des idées d'améliorations).

Alors ce codes sources j'en ai plus rien à faire, je vais faire l'égoïste de base : pour moi il me convient bien. J'ai plus la motiv du tout

Bonne soirée
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
5 févr. 2008 à 15:38
Ben écoutes je suis désolé de t'avoir mis 1.... mais ce n'est que mon opinion. Maintenant c'est vrai qu'il y a un bug et personnellement je n'aurais jamais le courage d'utiliser ta source dans un environnement de production pour les raisons cités plus haut. Cependant, je pensais mes commentaires constructifs.... mais bon, apparemment je me suis trompé.
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 14:01
une sous requete SELECT, pas un insert
cs_depression Messages postés 100 Date d'inscription mardi 7 novembre 2000 Statut Membre Dernière intervention 13 juillet 2009
5 févr. 2008 à 13:53
Et puis, si c'est pour faire ça, t'as autant envoyer un array() contenant tes requêtes...

Je vais peut être dire une connerie, mais en SQL, IN() permet d'effectuer une sous requête non?
C'est déja ça...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 13:22
ta source est composee uniquement d'une fonction de 9 lignes...
ta fonction n'est meme pas documente aux normes doxygen ou autreelle est mal codee (utilisation des et pas)
elle n'utilise pas les exceptions alors que les requetes sql sont des endroits ou les exceptions sont tres tres pratiques...
tu ne verifies rien de special (connexion a la db, XSS, ...), et ta fonction est buggee

bref, je mets moi aussi 1/10
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
5 févr. 2008 à 13:10
coucou747 > effectivement je n'y avais pas pensé.

morpheus57 > Erreur de frappe de ma part. Effectivement je peux ajouter des amélioration, mais bon merci pour le 1, ça fait toujours plaisir de vouloir partager des codes sources

yoman64 > Tu as raison, si un admin passe par la merci de supprimer la source.
cs_yoman64 Messages postés 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 4 décembre 2008
5 févr. 2008 à 11:55
Mis à part le très vilain bug découvert par coucou, ce n'est qu'un bête explode, ça a plus sa place sur codyx.org il me semble.

Savoir à quel requête ça a planté serait interessant aussi...
cs_morpheus57 Messages postés 121 Date d'inscription vendredi 31 mars 2006 Statut Membre Dernière intervention 30 décembre 2010
5 févr. 2008 à 09:13
Hello,

Dans la description, tu mets "La fonction renvoie false si un erreur s'est produite." et dans les commentaires tu mets "renvoie l'erreur SQL dans le cas contraire ".

En fait cela renvoi bien false -> donc impossible de savoir quelle est la requête qui a planté.
Je prends un exemple : tu as 25 requêtes et une erreur à la 12ème... il y aura donc 13 requêtes non exécutés et aucun moyen de le savoir ! ! !

Je pense que c'est clairement le genre de script qui doit utiliser les transactions...
De plus, il faut corriger le bug relevé par coucou747.

Bonne chance ! ! !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
5 févr. 2008 à 08:09
select * from ma_table where chaine=";"

ca fait planter ton code