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 :

Comptage des lignes de la réponse à un select : cas où count(*) ne marche pas [PDO]


Sujet :

PHP & Base de données

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut Comptage des lignes de la réponse à un select : cas où count(*) ne marche pas
    Bonsoir,

    dans le cas d'une requête select simple, c'est facile :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql = "SELECT COUNT(*) AS compte FROM `nom_table`";
    $qid = $pdo->query($sql);
    $row=$qid->fetch(PDO::FETCH_OBJ);
    $num=$row->compte;

    mais dans le cas où on ne lit que certains champs $sql="SELECT champ1,champ2,COUNT(*) AS compte FROM `nom_table`";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $qid = $pdo->query($sql);
    $row=$qid->fetch(PDO::FETCH_OBJ);
    $nrows=$row->compte;
    retourne un résultat différent de
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $sql="SELECT champ1,champ2 FROM `nom_table`";
    $num=0;
    $qid = $pdo->query($sql);
    while( $ligne=$qid->fetch(PDO::FETCH_OBJ) ) $num++;
    y a-t-il mieux que la 2e solution ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut
    Pour un select, je crois qu'il faut éviter rowcount :
    Si la dernière requête SQL exécutée par l'objet PDOStatement associé est une requête de type SELECT, quelques bases de données retourneront le nombre de lignes retournées par cette requête. Néanmoins, ce comportement n'est pas garanti pour toutes les bases de données et ne devrait pas être exécuté pour des applications portables.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Invité
    Invité(e)
    Par défaut
    Utilise rowCount.


    C'est toujours mieux que ta 2ème solution... ridiculement fausse.

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut
    Qu'est-ce qu'elle a de fausse ? En fait, dans mon code, dès qu'il y a une boucle avec des fetch, je l'utilise (en plus du cas cité ci-dessus), donc si elle n'est pas bonne, j'aimerais savoir pourquoi...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je résume :

    COMPTER ou LISTER, il faut choisir.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut
    et si ça donne le même résultat ?

    Je viens de faire un essai :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $sql="SELECT * FROM `machines`";
    $num=0;
    $qid = $bdd->query($sql);
    $num2=$qid->rowCount();
    while( $ligne=$qid->fetch(PDO::FETCH_OBJ) ) $num++;
    echo "num=".$num."/num2=".$num2;
    ?>
    et num=num2...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Ce qui est important dans le comptage, ce sont les tables et les conditions. Donc compter les lignes de SELECT champ1,champ2 FROM `nom_table`, c'est pareil que celles de SELECT * FROM `nom_table`, ça se fait par SELECT count(*) AS compte FROM `nom_table`.

    En fait, il a 3 possibilités :
    1. compter les lignes par une requête select count indépendante
    2. compter les lignes de la requête de sélection via rowCount
    3. compter les lignes de la requête de sélection via un compteur dans la boucle fetch

    Les 2eres solutions sont utiles si tu veux faire un traitement différent dans le cas où il n'y a pas de résultat, ou au contraire si tu ne veux pas faire le traitement de récupération si il y a trop de résultats.
    La 3e sert plutôt dans des cas où tu faire le traitement des lignes récupérés et récupérer le nombre de lignes traitées (par exemple, afficher le nombre de lignes en-dessous d'un tableau) Elle peut être combiner avec une condition pour ne compter qu'une partie des lignes traitées.

    En aucun cas, on ne met le compteur de lignes dans la requête de sélection.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse. Ta remarque comme quoi y a que les tables et les conditions qui importent a beau être évidente, je n'en avais pas conscience jusque là...

    Comme tu dis qu'il y a 3 possibilités, je les ai comparées sur une table que j'ai sous la main et la 3e ne donne pas le même résultat que les 2 premières :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $sql="select distinct os,count(name) from infotech group by os";
    $qid = $bdd->query($sql) or die ($str[7]);
    $num2=$qid->rowCount();
     
    $sql="select distinct os,count(name) from infotech group by os";
    $qid = $bdd->query($sql) or die ($str[7]);
    $num_rows=0;
    while ($ligne=$qid->fetch(PDO::FETCH_ASSOC) ) $num_rows++;
     
    $sql="select count(*) AS compte from infotech group by os";
    $qid = $bdd->query($sql) or die ($str[7]);
    $num1=$qid->fetch(PDO::FETCH_OBJ);
    $num3 =$num1->compte;
     
    echo "num_rows=".$num_rows."/num2=".$num2."/num3=".$num3."<br/>";
    donne :
    num_rows=81/num2=81/num3=102
    pourquoi ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Quand tu fais "distinct" il ne compte pas ceux en double, alors que count(*) lui prend tout.

  11. #11
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Bon, petite rectification : Ce qui est important dans le comptage, ce sont les tables et les conditions, sous réserve qu'il n'y ait de regroupements dans l'histoire. Si tu as des regroupements, il faut en tenir compte.
    D'une certaine manière, le GROUP BY fait partie de la sélection, c'est ce qui te permet d'utiliser le count(name).

    Dans ton cas, tu vas avoir une ligne par élément du group by, autrement dit pour chaque valeur distincte de os.
    La bonne requête de comptage pour
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct os,count(name) from infotech group by os
    serait en fait
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(distinct os) from infotech
    .
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    Invité
    Invité(e)
    Par défaut
    Houla... doucement...
    vous allez nous perturber Laurent...


    Laurent, puisque rowCount donne le BON résultat, UTILISE-LE !

    Point.barre.

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut
    Merci pour vos réponses, notamment celle de MaitrePylos qui m'explique la différence des résultats. Merci aussi pour l'explication technique de Celira. Comme je préfère la simplicité, comme le recommande jreaux62, je vais tout faire avec rowCount.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 339
    Points : 5 724
    Points
    5 724
    Billets dans le blog
    1
    Par défaut
    Je reviens sur cette discussion : si c'est sûr qu'il est plus simple d'utiliser rowCount, ce que je compte faire dorénavant, dans mon code, il est déjà souvent utilisé la 3e solution de Celira (compter les lignes de la requête de sélection via un compteur dans la boucle fetch) Est-ce qu'il suffit de la laisser ou est-ce qu'il faut la remplacer partout par l'emploi de rowCount ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Demande-toi à quel moment tu as besoin d'afficher le comteur et tu auras ta réponse.

    autre question : est-il utile de remplacer une méthode qui fonctionne déjà ?

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

Discussions similaires

  1. [PDO] comptage des lignes retournées par une requête SELECT un peu complexe
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/02/2015, 22h37
  2. requete select count ne marche pas
    Par serna dans le forum Langage
    Réponses: 2
    Dernier message: 11/03/2013, 13h07
  3. Tri et comptage des lignes
    Par kimikou dans le forum Langage
    Réponses: 9
    Dernier message: 17/07/2012, 17h18
  4. l'ordre des lignes dans un Select
    Par comment_ca dans le forum Oracle
    Réponses: 15
    Dernier message: 05/10/2006, 12h08
  5. [VBA]comptage de lignes en fonction du contenu des cellules
    Par calimero91 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 22/12/2005, 12h38

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