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 :

[PDO] Compter résultat d'une requête ayant plusieurs variables en entrée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Boulogne
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Boulogne
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 3
    Points
    3
    Par défaut [PDO] Compter résultat d'une requête ayant plusieurs variables en entrée
    Bonjour,

    Je cherche à obtenir le résultat d'un requête qui effectue une recherche dans une table avec plusieurs variables en entrée.
    J'utilise la fonction rowCount pour obtenir le résultat de ma requête de la manière ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $countreq = $bdd->prepare('SELECT id, xxxxxxxxxx) ;
    $countreq->execute();
    $count = $countreq->rowCount();
    echo $count ;
    J'obtiens les valeurs 2 2 0 2 car la recherche est incrémentée sur plusieurs variables et chacune d'elles renvoie le nombre de résultat trouvé.
    Je bloque sur le résultat total car je ne vois comment faire pour obtenir le total.

    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Bonjour,

    alors d'abord il y a un avertissement dans la doc de rowCount : quand on l'utilise avec SELECT, le résultat n'est pas garanti. Une requête SELECT COUNT(*) est généralement conseillée à la place.

    Ensuite :
    Citation Envoyé par willm_007 Voir le message
    […] la recherche est incrémentée sur plusieurs variables et chacune d'elles renvoie le nombre de résultat trouvé.
    Tu peux essayer de réécrire ça plus clairement ? Parce que là je ne comprends vraiment pas. Surtout le passage « la recherche est incrémentée » en fait.
    D'ailleurs, je ne vois pas coment rowCount peut renvoyer plusieurs valeurs. En réalité tu l'appelles plusieurs fois, pas vrai ? Il y a une boucle que tu ne nous montres pas dans ton code ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Boulogne
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Boulogne
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 3
    Points
    3
    Par défaut
    Bonjour Watilin et merci pour de t'intéresser à mon problème.

    Il y a effectivement une boucle car la requête est effectuée sur une variable qui contient plusieurs résultats. Dans l'exemple que j'ai donné (j'obtiens les valeurs 2 2 0 2), la première interrogation obtient 2 résultats, une nouvelle boucle est lancé et j'ai de nouveau 2 résultats, la troisième 0 et la dernière 2. C'est là qu'est le nœud du problème, j'ai besoin de la somme pour les afficher en y ajoutant une pagination.

    J'ai essayé avec SELECT COUNT(*) mais je ne parviens pas à écrire correctement la requête qui est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT id, formation, ecole, Adresse, Ville, code postal, telephone FROM ecole  WHERE formation LIKE "%'.$mot.'%" OR Resume LIKE "%'.$mot.'%"'
    S'il faut plus d'information j'ajouterai le reste du code.

    Willm

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    C'est pas plus compliqué que ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM ecole WHERE formation LIKE :mot OR Resume LIKE :mot
    Je t'ai mis une version avec marqueur (:mot), puisque tu as l'air de connaître la méthode prepare ça ne devrait pas te poser de problème. Sans parler de sûreté, d'un point de vue purement pratique, ça t'évite les prises de tête avec les guillemets.

    Astuce : avec une requête SQL sécurisée correctement, tu ne devrais jamais avoir besoin du guillemet double ("). La différence entre le guillemet double ou simple (') en PHP est expliquée ici.

    ——
    Pour ta boucle, utilise une variable pour mettre à jour le résultat à chaque itération.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $result = 0;
    for (...) {
        ... // requête SQL
        $result += $count;
    }
    echo $result;
    Plutôt qu'une boucle de ton script PHP, il serait intéressant d'essayer de trouver une requête qui te permette d'obtenir le résultat final en une seule fois. Je suis sûr que c'est possible. Fais des tests avec ta console SQL (si tu ne sais pas où elle est, cherche) ou via une interface type PHPMyAdmin.

  5. #5
    Candidat au Club
    Homme Profil pro
    Boulogne
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Boulogne
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 3
    Points
    3
    Par défaut
    Bonjour Watilin,

    Je vais tester tout cela en rentrant chez moi ce soir et ferai un retour.
    Merci pour les conseils.

    Willm

  6. #6
    Candidat au Club
    Homme Profil pro
    Boulogne
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Boulogne
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 3
    Points
    3
    Par défaut
    Hello,

    Tout ce que j'ai réussi à faire pour le moment c'est supprimer le nombre de ligne de la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $nb = $bdd->query('SELECT COUNT(*) FROM ecole WHERE formation LIKE "%'.$mot.'%" OR Resume LIKE "%'.$mot.'%"')->fetchColumn();
    				echo ($nb);
    J'ai toujours en réponse : 2 0 0 2 1 1 2
    Et si je fais une boucle $result += $count; j'ai le résultat 22 00 00 22 11 11 22

    Il n'y a pas d'addition des résultats mais il sont collés comme s'il s'agissait d'une insertion de texte.

    Pour la modification

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $nb = $bdd->query('SELECT COUNT(*) FROM ecole WHERE formation LIKE :mot OR Resume LIKE :mot')
    Elle ne semble pas supporter fetchColumn();

    La requête directe dans phpmyadmin, comment faire vu qu'elle est effectuée dans une boucle. Elle est exécuter temps qu'il y a des mots dans dans la boucle.
    Il faudrait parvenir à envoyer chaque résultat dans une variable qui n'est pas dans la boucle en additionnant à la volé.

    Merci pour votre aide.

    Je tourne en rond

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    J'ai l'impression que tu n'utilises pas assez les docs. Tu es à l'aise en anglais ? Pour la doc de MySQL c'est presque indispensable. En revanche, la doc de PHP a une version française d'excellente qualité.

    Il n'y a pas d'addition des résultats mais il sont collés comme s'il s'agissait d'une insertion de texte.
    Le terme exact c'est concaténation. C'est normal car toutes les données issues d'une requête MySQL sont considérées comme des chaînes en PHP. Si tu ne veux pas que ça se produise il faut transtyper (caster) tes variables en nombres entiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result += (int) $count;
    Elle ne semble pas supporter fetchColumn();
    Le problème ne vient pas de fetchColumn. Tu n'as pas lié le marqueur :mot en utilisant prepare comme je te l'avais conseillé. Du coup, la requête échoue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $statement = $bdd->prepare('SELECT COUNT(*) FROM ecole WHERE formation LIKE :mot OR Resume LIKE :mot');
    $statement->execute(array( ':mot' => "%$mot%" ));
    $nb = (int) $statement->fetchColumn();
    Lis plus attentivement les réponses des intervenants la prochaine fois
    Et apprends à utiliser la doc :


    NB. Dans l'idéal, ajoute un contrôle sur la variable $mot, ne serait-ce que vérifier qu'elle n'est pas vide, sinon la requête est faite avec LIKE %% et ça te sort la table entière.

  8. #8
    Candidat au Club
    Homme Profil pro
    Boulogne
    Inscrit en
    Mars 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Boulogne
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 22
    Points : 3
    Points
    3
    Par défaut
    Merci Watilin, j'ai tout ce qu'il faut pour trouver la solution.

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

Discussions similaires

  1. Résultat d'une requête sur plusieurs colonnes
    Par manucha dans le forum Oracle
    Réponses: 9
    Dernier message: 19/12/2007, 12h04
  2. [MySQL] Compter résultats d'une requête
    Par jakkihm dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 31/03/2007, 22h26
  3. [MySQL] Affichage des résultats d'une requête sur plusieurs pages
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2006, 13h24
  4. [SQL] Afficher les résultats d'une requête sur plusieurs pages
    Par mealtone dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/09/2006, 13h20

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