IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Simuler l'exécution d'une requête (my)sql [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Simuler l'exécution d'une requête (my)sql
    Bonjour à tous,

    Quelqu'un connait-il une fonction qui permet de simuler l'éxécution d'une requête sql? En gros, j'aimerai faire un mysql.query(requête sql) sans que la requête soit éxécuter réellement, pour pouvoir vérifier si y'a une erreur de syntaxe dans la requête ou non.

    Si quelqu'un pouvait m'aider...

    Merci d'avance.

    A+

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 99
    Points : 60
    Points
    60
    Par défaut
    Si ta requete est bien preparée tu ne devrais pas avoir d'erreur de syntaxe. Un exemple ?

  3. #3
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    Si tu utilises un PHP >= 4.0.6, tu as le mysql_unbuffered_query qui te permet de faire une requête qui ne monopolise pas les résultats.

    Ainsi, tu peux tester la validité de ta requête comme tu le ferais habituellement avec un mysql_query.
    A+
    K

  4. #4
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    à part tester ta requête dans phpmyadmin, je voit pas trop ....
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Une idée comme ca :

    Si tu rajoute (eventuellement de maniere automatique) une clause WHERE du genre :

    WHERE 0=1

    de maniere a ce que ce soit toujours faux, la requete sera "parsée" par mysql (donc provoquera une erreur de syntaxe s'il y en a une), mais ne s'executera jamais.

    Cela ne permet evidemment pas de tester les eventuelles contraintes que tu peux avoir mis entre tes tables lors d'un INSERT/UPDATE/DELETE... ca ne fonctionne que pour les erreurs de syntaxes.

    Maintenant, mon avis c'est que tu ne devrais jamais avoir d'erreur de syntaxe... et si ta requete vient de l'utilisateur : soit c'est un super utilisateur qui peut faire ce qu'il veux de maniere interactive, et dans ce cas là, tu execute la requete et lui renvoi le resultat (y compris si c'est une erreur !) , soit c'est une requete construite dynamiquement par un utilisateur lambda : Si tu arrive a avoir une erreur de syntaxe sur une telle requete, c'est que tu ne fait pas assez de controles sur les saisies utilisateurs en amont.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Je suis plutôt de l'avis de Gwipi, je pense qu'il vaut mieu vérifier et bien construire la requête en amont pour éviter les erreurs :o

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Re bonjour à tous

    Mon but est en fait de vérifier la syntaxe des requêtes qu'un utilisateur pourrait saisir. Je ne sais donc pas à l'avance ce que l'utilisateur va saisir. Aussi, j'aimerai déterminer si il y a une erreur de syntaxe dans ce qu'il a écrit, avant même de décider de l'éxécution de la requête.
    Par exemple, si il fait une requête genre DELETE blabla from TABLE, je voudrais pouvoir détecter s'il y a une erreur de syntaxe, mais bien entendu je ne veux pas que la requête s'éxécute

    Je n'ai pas eu le temps encore de tester vos différentes solutions, en tout cas merci d'avoir répondu si rapidement.

    Si vous avez d'autres idées n'hésitez pas surtout

    Merci.

    A+

  8. #8
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    tu peux utiliser mysqli je pense, en particulier le commit et le rollback

    Tu met l'autocommit à false, tu fait ta requête, tu teste la valeur de retour, si ce n'est pas une erreur, tu commit, sinon, tu laisse couler ?
    Globalement inoffensif
    Merci de respecter les règles du forum.
    Aucune question technique par MP !
    _______________________________________________________________________
    Cours Ruby et Ruby on Rails (RoR) - Cours PHP - FAQ Ruby / Rails - Livres Ruby / Rails
    Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
    Tutoriaux HTML/CSS et PHP

  9. #9
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Ah donc oublie l'idée du unbuffered query, car dans le cas d'un DELETE, ça executera la requête.. Je pensais qu'il s'agissait uniquement de SELECT..

    Je ne connais pas de fonction mysql sous php te permettant ce genre de "test". Pourquoi ne propose-tu pas une liste de requête à préremplir par exemple, comme ça tu es presque sûr qu'il n'y aura pas d'erreur, à moins que l'utilisateur soit mancho.. Juste une idée comme ça..

    Et puis je ne comprend toujours pas l'interet fonctionnel que ça a, à moins que tu sois prof de SQL
    K

  10. #10
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Citation Envoyé par titoumimi
    tu peux utiliser mysqli je pense, en particulier le commit et le rollback

    Tu met l'autocommit à false, tu fait ta requête, tu teste la valeur de retour, si ce n'est pas une erreur, tu commit, sinon, tu laisse couler ?
    L'idée de faire une transaction est bonne je n'y avais pas pensé.. Bien vu titoumimi
    K

  11. #11
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    L'interet me parait limité puisque que va tu faire si la requete n'est pas valide ? afficher l'erreur venant de mysql je suppose...
    Mais si la requete est valide tu fais quoi ?? Tu l'execute ?

    Dans ce cas là, quelle est la différence entre essayer de l'executer directement, puis renvoyer les erreurs retournées par mysql ?

    Le seul cas ou tu *pourrais* avoir besoin de ca c'est dans le cas ou la requete en question n'ai pas pour vocation d'etre executée (meme si elle est valide). Mais dans ce cas là, tu propose donc a l'utilisateur de *preparer* des requetes pour une execution ulterieure... or la validité d'une requete peut dependre de son moment d'execution (suppression de table entre temps, ajout ou suppression de champs, de contraintes, etc...)

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Fladnag
    Une idée comme ca :

    Si tu rajoute (eventuellement de maniere automatique) une clause WHERE du genre :

    WHERE 0=1

    de maniere a ce que ce soit toujours faux, la requete sera "parsée" par mysql (donc provoquera une erreur de syntaxe s'il y en a une), mais ne s'executera jamais.

    Cela ne permet evidemment pas de tester les eventuelles contraintes que tu peux avoir mis entre tes tables lors d'un INSERT/UPDATE/DELETE... ca ne fonctionne que pour les erreurs de syntaxes.

    Maintenant, mon avis c'est que tu ne devrais jamais avoir d'erreur de syntaxe... et si ta requete vient de l'utilisateur : soit c'est un super utilisateur qui peut faire ce qu'il veux de maniere interactive, et dans ce cas là, tu execute la requete et lui renvoi le resultat (y compris si c'est une erreur !) , soit c'est une requete construite dynamiquement par un utilisateur lambda : Si tu arrive a avoir une erreur de syntaxe sur une telle requete, c'est que tu ne fait pas assez de controles sur les saisies utilisateurs en amont.

    J'ai testé hier une astuce de ce genre (j'ai rajouté "and blabla" à la fin de mes différentes requêtes), mais le potentiel est limitée. En effet, si on fait ça par exemple sur un insert, et que l'on tente d'insérer dans une table inexistante, il détecte d'abord l'erreur de "blabla"

    Mon objectif est en fait de détecter toutes les erreurs de syntaxe qu'un utilisateur pourrait faire, sans pour autant exécuter la requête (surtout si c'est un delete ou un insert )

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Bah alors, personne n'a de solution? Tout le monde sèche...

  14. #14
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Bonjour,

    Vous démarrez une transaction : BEGIN TRANSACTION;
    Vous lancez votre requête : DELETE FROM TOTO;
    Vous annulez votre transaction : ROLLBACK TRANSACTION;

    Voilà
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Je me suis penché de plus près sur cet histoire du rollback et je pense que ca va pouvoir m'aider un peu. Merci de votre aide. A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécution d'une requête SQL qui affiche un message
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 29/11/2006, 16h15
  2. [SQL] Différence d'exécution d'une requête entre phpmyadmin et php
    Par lodan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/08/2006, 15h56
  3. Assurer l'exécution d'une requête SQL
    Par condor_01 dans le forum JDBC
    Réponses: 4
    Dernier message: 11/08/2006, 11h23
  4. Erreur d'exécution d'une requête sql
    Par marceline dans le forum Oracle
    Réponses: 2
    Dernier message: 11/07/2006, 13h12
  5. [SQL] Pb exécution d'une requête
    Par baillador dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 03/05/2006, 10h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo