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 :

Tester requête préparée [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut Tester requête préparée
    Bonjour,

    je débute avec PDO ainsi qu'avec php tout court et je n'arrive pas à tester si une requête s'est correctement exécutée :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // connexion
    $connexion = new PDO('mysql:host='.DB_serveur.';port='.DB_port.';dbname='.DB_base, DB_user, DB_mdp);
     
    // requete preparee
    $prepare = $connexion->prepare('SELECT id, titre
    	                                     FROM categorie
    					     WHERE niveau = :niveau
    					     AND actif = 1 
    					     AND lien = :categorie');
     
    $prepare->execute(array(':niveau' => $niveau, ':categorie' => $categorie)); // execution

    La si j'affiche ce que l'exécution renvoie et que la requête soit bonne ou mauvaise, ça fait toujours 1

    Pourtant dans la doc, il est écrit :

    Valeurs de retour

    Cette fonction retourne TRUE en cas de succès, FALSE en cas d'échec.
    Bon soit, passons . Je n'ai pas vraiment trop d'autre choix que de continuer. Retournement d'un résultat improbable sous forme d'objet.

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $lignes = $prepare->fetch(PDO::FETCH_OBJ);

    La si j'affiche $lignes ça me renvoie soit l'objet, soit rien du tout (false ?) que je peux tester comme ceci :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ($lignes !== FALSE) {
     
      echo 'tadam';
     
    }

    Ça reste moche mais ça marche. Ce que je ne parviens pas à saisir, c'est :

    -pourquoi il n'est pas possible de tester si execute() renvoie un résultat et de même pour query()?

    J'ai vu qu'il y avait un mode erreur PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING. ainsi qu'un mode exception PDO::ERRMODE_EXCEPTION. Est ce que ça peut me permette de tester plus proprement?

    Bref, comment vous faites?

  2. #2
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut

    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ($row = $prepare->fetch()) {
        var_dump($row);
    }
    et normalement ton $row devrait contenir un résultat à chaque fois. Il te suffit alors de pointer sur l'attribut de la ligne que tu souhaites récupérer.

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    La si j'affiche ce que l'exécution renvoie et que la requête soit bonne ou mauvaise, ça fait toujours 1
    Je viens de faire le test est execute renvoit bien FALSE si la requete n'a pas pu s'executer.
    De quelle maniere controles-tu le résultat ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Je fais un var_dump comme ceci :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $test = $prepare->execute(array(':niveau' => $niveau, ':categorie' => $categorie)); // execution
     
    var_dump($test);

    et je reçois toujours bool(true)

    Ma configuration serveur est :

    Version de Apache : 2.2.11
    Version de PHP : 5.2.8

    si ça peut aider. Je comprend vraiment pas le soucis.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    D'un autre côté, pourquoi veux-tu gérer une mauvaise requete par condition ?

    Je veux dire, il ne devrait y avoir aucun cas dans ton code qui produise une mauvaise requête
    A moins que tu n'écrives un exécuteur de requête, une requete erronée sanctionne une erreur majeure dans ton code et dois donc provoquer l'arret de celui-ci.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Je fais cette requête pour récupérer une catégorie dans ma table. Les paramètres présent dans ma requête sont récupérés depuis une URL ce qui peut forcément entrainer des erreurs.

    J'aimerai bien provoquer l'arrêt du code ou même afficher une 404 si la requête est mauvaise.

    <edit>
    Je reçois bien false lorsque par exemple un paramètre est mal saisi (nom de la table, champs) mais si ma requête ne renvoie rien, je reçois true.
    </edit>

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ah je comprends mieux.

    Une requête sans résultat n'est pas une requête erronée, elle retourne bien une ressource.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $prepare->execute(array(':niveau' => $niveau, ':categorie' => $categorie));
    $result = $prepare->fetchAll(PDO::FETCH_ASSOC);
    if (count($result) == 0) {
       // aucun resultat
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ah je comprends mieux.

    Une requête sans résultat n'est pas une requête erronée, elle retourne bien une ressource.
    Ben oui, mais quoi? C'est ça que je n'arrive pas à piger.

    Sinon j'ai un peu près saisi pour tester.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Je vais mettre mon grain de sable dans ce post, car j'ai justement ouvert un bug chez PHP a ce sujet.

    Pour info le prepare de PDO sous MySQL ne se comporte pas correctement. En principe le prepare DOIT valider la requete AVANT son execution, donc si il y a une erreur de syntaxe c'est sur le PREPARE que ca doit survenir pas sur l'EXECUTE. La reponse que j'ai recu de PHP a se sujet est que lorsqu'ils ont développer le drivers MySQL pour PDO MySQL ne supportait pas les prepare, et donc par defaut il les emule, il faut donc faire un PDO::ATTR_EMULATE_PREPARES=>false pour qu'il prenne bien le prepare (cest facile a controler il suffit d'activer les logs de MySQL et de les monitorer. On ne voir pas de prepare et d'execute mais seulement des query.

    Maintenant quand j'ai active ce mode, j'ai eu plein d'erreur qui sont des bugs connu de PHP. Du genre que le buffer est plein et qu'il faut utiliser un fetchall a la place de Query. Le probleme chez moi est qu'il me donne cette erreur sur un execute qui a deja ete execute 10 fois avant. (donc rien a voir avec un fetch ou query).

    Bref les prepare ne sont pas tres au point sous MySQL/PDO, il faut mieux utiliser mysqli pour ca.

    Sinon pour info, le prepare effectue le controle syntaxique de la requete et assgne un buffer de stockage, l'execute passe les parametres au query preparer, et s'execute, et le fetch vide le buffer (ou le parcourt) pour permettre de descendre les infos dans l'application. (ceci est evidement une version simplifier des operations :-) )

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ben oui, mais quoi? C'est ça que je n'arrive pas à piger.
    Une requete qui ne retourne pas de resultats c'est une requete reussie quand meme, "execute" retourne donc une ressource.
    Si tu fetch cette ressource, tu n'obtiendras rien.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 11
    Par défaut
    Ok, je commence à comprendre comment ça marche. Mon esprit borné à du mal à entendre qu'un requête qui ne renvoi rien n'est pas pour autant fausse ^^.

    Si je suis bien ce que tu dis Chromo, une requête préparée avec mysql revient à effectuer une requête disons normale.

    J'ai aussi lu qu'il y avait des soucis avec certains drivers si on ne récupérait pas entièrement le jeu de résultat.
    http://fr.php.net/manual/fr/pdostate...losecursor.php
    Mais tu dois surement connaitre.

    Je passe le sujet en résolu mais la discution reste ouverte. Merci pour vos retours intéressants.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 28
    Par défaut
    Oui je connais et ca n'apporte pas de solution a mon probleme. De tout maniere je ne fais jamais un seul fetch et quitte ensuite, si je fais un select sans LIMIT c'est que je veux tous les records, donc je dois les lire tous.

    Merci quand meme.

  13. #13
    Candidat au Club
    Inscrit en
    Septembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2
    Par défaut
    Cette fonctions que j'ai envoyer ne retourne pas résultat qu'est ce que je doit faire
    MERCI

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

Discussions similaires

  1. [PDO] Requête préparée
    Par Yoshio dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2007, 12h07
  2. [PDO] Requête préparée, retour d'erreur à masquer
    Par speedev dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/06/2007, 10h39
  3. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53
  4. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07
  5. [MySQL] Tester requête nulle ?
    Par Kotik dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 18/04/2006, 14h32

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