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 :

SELECT COUNT au lieu d'un while ? [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut SELECT COUNT au lieu d'un while ?
    Bonjour

    Je suis en train de coder un petit forum pour un ami en php.
    Il m'a demandé un petit compteur des topics sur lesquels il y a eu des réponses depuis la dernière visite d'un membre. Pour se faire, je me suis inspité d'un tuto trouvé sur le net qui montrait une façon de procéder. Après quelques tests, j'ai un code fonctionnel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    $query=$bdd->prepare('
    SELECT forum_topic.topic_last_post, Mb.membre_pseudo AS post_createur, tv_id, tv_post_id, tv_poste, Ma.membre_pseudo FROM forum_topic
    LEFT JOIN general_membres Mb ON Mb.membre_id = forum_topic.topic_createur
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN general_membres Ma ON Ma.membre_id = forum_post.post_createur
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id
    ');
    $query->bindValue(':id',$_SESSION['id'],PDO::PARAM_INT);
    $query->execute();
     
    $nbrposts = 0;
     
    while ($data = $query->fetch()) {
      if ($data['tv_id'] == $_SESSION['id']) {
        if ($data['tv_poste'] == '0') {
          if ($data['tv_post_id'] != $data['topic_last_post']) {
            $nbrposts++;
          }
        }
        else {
          if ($data['tv_post_id'] != $data['topic_last_post']) {
            $nbrposts++;
          }
        }
      }
      else {
        $nbrposts++;
      }
    }
     
    $query->CloseCursor();
    echo $nbrposts;
    ?>
    Ma question est la suivante, le while n'est-il pas plus lourd qu'un SELECT COUNT ? Sachant que ce compteur sera rappelé via AJAX toutes les X secondes. Et dans le cas où ce serait préférable de n'utiliser qu'un SELECT COUNT, quelqu'un pourrait-il m'aiguiller, parce que je ne suis pas le meilleur en syntaxe SQL. Je me doute qu'il faut utiliser des WHERE mais à chaque tentative, j'échoue :/

    Merci bien

  2. #2
    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
    Montre nous ta meilleure tentative, on te dira ce que tu as mal fait.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Je n'ai plus mon bout de code (m'étant rabattu sur le if par dépit) mais ça devait donner quelque chose comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT COUNT(*) forum_topic.topic_last_post, Mb.membre_pseudo AS post_createur, tv_id, tv_post_id, tv_poste, Ma.membre_pseudo FROM forum_topic
    LEFT JOIN general_membres Mb ON Mb.membre_id = forum_topic.topic_createur
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN general_membres Ma ON Ma.membre_id = forum_post.post_createur
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id
    WHERE tv_id <> :id 
    OR (tv_id = :id 
      AND (tv_poste = 0 
        AND (tv_post_id = topic_last_post)
      ) 
      OR tv_poste <> 0 
        AND (tv_post_id = topic_last_post)
    )

    Saignez pas trop des yeux, je suis débutant et absolument pas dans des études de ce type (je suis en médecine), j'apprends sur le fil par moi même donc soyez un peu indulgents ^^

  4. #4
    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
    Je ne comprends ton cas $data['tv_id'] != $_SESSION['id'] puisque dans ta requête il y a une égalité entre les deux valeurs.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Tu parles du dernier else je présume (dans mon while) ? celui qui ajoute 1 à $nbrposts lorsque la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($data['tv_id'] == $_SESSION['id'])
    n'est pas validée c'est ça ?
    J'ajoute des commentaires pour que tu comprennes le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    while ($data = $query->fetch()) {
      if ($data['tv_id'] == $_SESSION['id']) { // Si le membre $id a lu le topic...
        if ($data['tv_poste'] == '0') {  // Et que le membre n'a pas posté dans le topic...
          if ($data['tv_post_id'] != $data['topic_last_post']) {  // Mais qu'il y a un nouveau message posté par un autre
            $nbrposts++;  // Alors on ajoute 1 au compteur
          }
        }
        else {  // Et si le membre $id a posté dans le topic
          if ($data['tv_post_id'] != $data['topic_last_post']) {  // Et qu'il y a un nouveau message
            $nbrposts++;  // Alors, de même, on ajoute +1 au compteur
          }
        }
      }
      else {  //Enfin, s'il n'a même pas daigné lire le topic
        $nbrposts++;  // Aors, rebelotte, on ajoute +1 au conteur.
      }
    }
    Dans le SQL, ca reste flou, mais j'ai essayé de refaire le même schéma.

  6. #6
    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éjà tu as deuxs scénarios identiques : que le membre ait posté ou non, tu fais la même chose.
    Tu peux donc réduire d'une condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ($data = $query->fetch()) {
      if ($data['tv_id'] == $_SESSION['id'] && $data['tv_post_id'] != $data['topic_last_post'] ) { // Si le membre $id a lu le topic et qu'il y a un nouveau message posté par un autre
            $nbrposts++;
      }
      else {
        $nbrposts++; 
      }
    j'ai bon ?

    Attention pour le passage à la requête préparée : tu ne peux pas utiliser plusieurs fois ":id" il faut donner un nom différent à chaque fois.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Pour raccourcir la requête, j'y ai pensé aussi, mais à l'issue des tests, ce qui semble quand même logique et compactable (sans développer les deux scénarios donc), le code me sort une valeur erronée. Concrètement, il compte juste le nombre de topics..
    Ici : while long : http://imgur.com/FDPD4xR
    Ici : le while compacté : http://imgur.com/3oxwx0Z

    Edit : le compteur qui retourne $nbrposts est fur fond bleu en haut à droite

  8. #8
    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
    Bizarre, comme ça je ne vois pas.
    Pour debuguer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($data = $query->fetch()) {
        echo '************ session ' . $_SESSION['id'] . '<br/>';
        print_r ($data);
      .......
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Pour le debug voilà ce que ça donne

    ************ session 1
    Array ( [topic_last_post] => 4 [0] => 4 [post_createur] => Albartros98 [1] => Albartros98 [tv_id] => 1 [2] => 1 [tv_post_id] => 4 [3] => 4 [tv_poste] => 1 [4] => 1 [membre_pseudo] => Albartros98 [5] => Albartros98 )
    ************ session 1
    Array ( [topic_last_post] => 18 [0] => 18 [post_createur] => test [1] => test [tv_id] => 1 [2] => 1 [tv_post_id] => 18 [3] => 18 [tv_poste] => 1 [4] => 1 [membre_pseudo] => Albartros98 [5] => Albartros98 )
    ************ session 1
    Array ( [topic_last_post] => 7 [0] => 7 [post_createur] => Albartros98 [1] => Albartros98 [tv_id] => 1 [2] => 1 [tv_post_id] => 7 [3] => 7 [tv_poste] => 1 [4] => 1 [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 8 [0] => 8 [post_createur] => Albartros98 [1] => Albartros98 [tv_id] => 1 [2] => 1 [tv_post_id] => 6 [3] => 6 [tv_poste] => 1 [4] => 1 [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 23 [0] => 23 [post_createur] => test [1] => test [tv_id] => 1 [2] => 1 [tv_post_id] => 23 [3] => 23 [tv_poste] => 1 [4] => 1 [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 24 [0] => 24 [post_createur] => test [1] => test [tv_id] => 1 [2] => 1 [tv_post_id] => 20 [3] => 20 [tv_poste] => 1 [4] => 1 [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 12 [0] => 12 [post_createur] => test [1] => test [tv_id] => [2] => [tv_post_id] => [3] => [tv_poste] => [4] => [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 14 [0] => 14 [post_createur] => test [1] => test [tv_id] => [2] => [tv_post_id] => [3] => [tv_poste] => [4] => [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 15 [0] => 15 [post_createur] => test [1] => test [tv_id] => 1 [2] => 1 [tv_post_id] => 15 [3] => 15 [tv_poste] => 0 [4] => 0 [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 21 [0] => 21 [post_createur] => test [1] => test [tv_id] => 1 [2] => 1 [tv_post_id] => 16 [3] => 16 [tv_poste] => 0 [4] => 0 [membre_pseudo] => test [5] => test )
    ************ session 1
    Array ( [topic_last_post] => 22 [0] => 22 [post_createur] => test [1] => test [tv_id] => 1 [2] => 1 [tv_post_id] => 22 [3] => 22 [tv_poste] => 0 [4] => 0 [membre_pseudo] => test [5] => test )

  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
    Pour la ligne 1,2, 3, 5, 9 et 11 $data['tv_post_id'] == $data['topic_last_post'], donc on ne les compte pas.
    Il n'y a donc pas 11 mais bien 5.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

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

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Je sais bien mais le script me redonne bel et bien 11...
    Chose étrange, pour tester, j'ai juste fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while ($data = $query->fetch()) {
      if ($data['tv_post_id'] != $data['topic_last_post']) {  // Qui équivaut au "Mais qu'il y a un nouveau message posté par un autre" mais sans vérifier si $id a lu le topic.
        $nbrposts++;
      }
    }
    Et bien j'ai bien 5 (logique) en soi. Dois-je considérer que c'est ok dans ce cas ou est-ce que mon php a décidé d’interpréter les fichiers comme il le souhaitais ?
    Dans ce cas, ma requète peut se résumer ainsi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT forum_topic.topic_last_post, tv_post_id FROM forum_topic
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id

    Et tant que j'y suis à supposer que cette version fonctionne (j'ai essayé sur 3 comptes, ça marche bien..)
    voilà une tentative échouée de requete SQL en COUNT, j'ai besois de cours de SQL je pense bien
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COUNT(*) FROM forum_topic WHERE forum_topic.topic_last_post <> tv_post_id
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id

  12. #12
    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
    Il faudrait que tu dois plus clair, tu me disais que mon code ne fonctionnait pas, maintenant tu me dis que si.

    Bref
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) FROM forum_topic
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id
    WHERE forum_topic_view.tv_id = :id AND tv_post_id <> topic_last_post
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Je n'ai pas été clair dans ma dernière réponse, ton code ne fonctionnait bel et bien pas (ça se dit ?). J'ai enlevé la condition de vérification avec l'id du membre pour que ça marche.
    Désolé pour la confusion, c'est ma faute

    Je teste la requete de ce pas.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Bonjour, Après une phase de dépression, j'ai trouvé une solution à mon problème

    Cependant j'ai dû apporter une modification à ton code pour qu'il marche, le voilà
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(*) FROM forum_topic
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id
    WHERE forum_topic.topic_last_post <> tv_post_id OR tv_post_id IS NULL

    J'attend une confirmation que c'est fonctionnel et je met résolu

    Merci mille fois

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

Discussions similaires

  1. [Java][debutant]select count(*) ne retourne rien !!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/01/2007, 11h39
  2. [Oracle] select count(..) et Oracle 10G
    Par onclebob dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/09/2005, 15h04
  3. mon select count(*) marche pas
    Par zorba49 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 05/08/2005, 08h28
  4. [Performance] RecordCount ou select Count(champ) ?
    Par shwin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/09/2004, 17h37
  5. résultat de " select count "
    Par marie253 dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2004, 12h07

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