Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon code est-il "propre" ?

code requête SELECT qui me parait louche ...

Sujet résolu
    6 avril 2020 à 20:36:20

    Bonjour/ bonsoir,

    Alors, une fois n'est pas coutume, je viens vers vous avec un code qui marche, par contre, je comprends pas trop comment ^^.

    Je vous explique:

    J'ai une table SQL qui contient les champs relatifs aux entrées d'un formulaire de publication d'annonces (id, titre, categories etc...)

    (Juste une petite parenthèse ici, c'est une mauvaise pratique d'écrire les noms de ses champs/tables/bdd avec des accents non ?)

    Je voulais sur ma page index, afficher le nombre d'annonces par catégories. Pour obtenir quelque chose du genre:

                                                                                           Chaussures (3000)

                                                                                            Sweat-shirt (500)

                                                                                             Jogging (447)

    Du coup, j'ai créé une fonction dont le seul but serait de compter le nombre d'éléments dans les champs en BDD, dont les noms lui seront passés en paramètres:

    [CODE PHP]

    <?php
    
    function countByCategory($category){
    
    $host = 'localhost';
    $port = 3308;
    $user = 'root';
    $dbname = 'mabdd';
    
    try{
    
    $bdd = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$dbname, $user, '',
        array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    
    }
    
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
    
    
    $req = 'SELECT count(*) FROM annonces WHERE categorie = :myCategory';
    
    $prepared=$bdd->prepare($req);
    
    $prepared->execute([":myCategory"=>$category]);
    
    
     $xCategoryCounted = $prepared->fetch(PDO::FETCH_ASSOC);
    
    
    return $xCategoryCounted['count(*)'];
    
    }
    
    ?>


    [CODE HTML]

     <?php 
    include('count-by-category.func.php');
          ?>
    <ul class="list-group">
      <li class="list-group-item d-flex justify-content-between align-items-center" >
        Rémunéré   
        <span class="badge badge-primary badge-pill"><?php echo(countByCategory('Pantalon')); ?></span>
      </li>
      <li class="list-group-item d-flex justify-content-between align-items-center">
        Bénévolat 
        <span class="badge badge-primary badge-pill"><?php echo(countByCategory('Chaussure')); ?></span>
      </li>
      <li class="list-group-item d-flex justify-content-between align-items-center">
        Paiement en nature 
        <span class="badge badge-primary badge-pill"><?php echo(countByCategory('tShirt')); ?></span>
      </li>
    </ul>


    Le "problème" viens de ce que j'ai du faire dans la fonction PHP, pour qu'elle affiche le résultat attendu

    $xCategoryCounted['count(*)'];

     J'aurais cru qu'avec un count(*) dans mon SELECT, le résultat de l’exécution de la requête serait un nombre, mais en faisant un print_r sur la variable

    $xCategoryCounted

    je me suis rendu compte que c'était un tableau associatif, avec une unique clé 'count(*)' dont la valeur était la variable que je voulais atteindre.

    Dans mes recherches sur le sujet, après un count(*) les gens utilisaient le résultat de l’exécution de la requête, tel quel: où est-ce que j'ai merdé ? (pardon pour l'expression et merci à tous ceux et toutes celles qui me liront)

    • Partager sur Facebook
    • Partager sur Twitter
    You are now about to witness the strength of street knowledge
      7 avril 2020 à 7:49:29

      Bonjour,

      1) oui c'est à proscrire de mettre des accents dans des dénominations de table, de colonne, ... ainsi que des mots réservés.

      2) ton problème vient du 

      $xCategoryCounted = $prepared->fetch(PDO::FETCH_ASSOC);

      Voir la doc : https://www.php.net/manual/fr/pdostatement.fetch.php

      PDO::FETCH_ASSOC: retourne un tableau indexé par le nom de la colonne comme retourné dans le jeu de résultats

      A+

      -
      Edité par monkey3d 7 avril 2020 à 7:49:59

      • Partager sur Facebook
      • Partager sur Twitter
        7 avril 2020 à 11:38:35

        Yep, fetch renvoie les valeurs des colonnes de la ligne courante sous forme de tableau ou objet.

        Si tu veux directement un scalaire (un entier ici), c'est un fetchColumn qu'il aurait fallu faire (return $prepared->fetchColumn();)

        Mais au final, ça ne change rien au code : fetchColumn te fait gagner une ligne (encore que tu pourrais écrire return $prepared->fetch(PDO::FETCH_ASSOC)['count(*)'];). Pas de quoi qualifier ce code de crade pour autant.

        > les gens utilisaient le résultat de l’exécution de la requête, tel quel

        Euh, non, à moins qu'ils n'aient utilisé fetchColumn (voire même bindColumn éventuellement d'ailleurs), tu as dû mal lire leur code. Ou alors c'était des codes mysqli avec un bind_result (c'est l'équivalent du bindColumn de PDO).

        Par contre, tu pourrais éventuellement optimiser ton code pour ne faire qu'une requête (SELECT categorie, count(*) FROM annonces /*WHERE categorie IN('Pantalon', 'Chaussure', 'tShirt')*/ GROUP BY categorie). Tu renvoies le résultat d'un fetchAll(PDO::FETCH_KEY_PAIR) pour remplacer les countByCategory('X') par $resultat['X']. Et en profiter pour déplacer le(s) appel(s) de countByCategory de la vue au contrôleur.

        $count_by_cat = $bdd-&gt;query('SELECT categorie, count(*) FROM annonces /*WHERE categorie IN('Pantalon', 'Chaussure',  'tShirt')*/ GROUP BY categorie')-&gt;fetchAll(PDO::FETCH_KEY_PAIR);
        
        echo $count_by_cat['tShirt'];
        echo $count_by_cat['Chaussure'];
        

        -
        Edité par julp 7 avril 2020 à 12:09:46

        • Partager sur Facebook
        • Partager sur Twitter
          7 avril 2020 à 16:27:44

          Bonjour vous deux!

          Merci pour votre participation et pour les indications pour optimiser mon code julp :)

          J'aurais encore 2/3 questions à vous poser svp. Est-ce que vous connaitriez des tutoriels grâce auxquels je pourrai actualiser le nombre d'annonces par catégories sans avoir à recharger la page ? Je suppose que c'est possible de le faire avec de l'Ajax . Et quel est l'impact d'un tel procédé sur les performances de la page ? (Est-ce que la page en est ralenti? Si oui, suffisamment pour que ça puisse causer une gêne à l'utilisateur ?)

          • Partager sur Facebook
          • Partager sur Twitter
          You are now about to witness the strength of street knowledge
            7 avril 2020 à 16:52:35

            > Est-ce que vous connaitriez des tutoriels grâce auxquels je pourrai actualiser le nombre d'annonces par catégories sans avoir à recharger la page ?

            Pas en PHP, non.

            > Je suppose que c'est possible de le faire avec de l'Ajax

            L'idéal serait par websocket ou si c'est unidirectionnel (serveur => client) via SSE (Server Sent Event)

            > Et quel est l'impact d'un tel procédé sur les performances de la page ?

            Pour le client ou le serveur ? Si c'est bien fait, ça pourrait même profiter au serveur par rapport à un spam de F5 de la part des clients et l'impact pour le client serait négligeable. C'est tout de même difficilement estimable/quantifiable, ça dépend du besoin, si c'est bien implémenté/conçu et surtout en adéquation avec ce besoin.

            -
            Edité par julp 7 avril 2020 à 17:01:09

            • Partager sur Facebook
            • Partager sur Twitter
              7 avril 2020 à 16:53:01

              Sans recharger la page, effectivement ajax est tout indiqué.

              Autre solution possible le Server Sent Event : https://www.w3schools.com/html/html5_serversentevents.asp

              Cela permet de pousser du contenu à interval régulier du serveur vers les navigateurs.Il y a plein de tutos sur le sujet et c'est simple à mettre en oeuvre.

              Enfin le websocket ... plus complexe.

              Pour tous ces procédés que j'utilise sur mon site, je ne vois pas d'impacts sur les performances mais plus sur la complexité à faire.

              A+

              -
              Edité par monkey3d 7 avril 2020 à 16:53:50

              • Partager sur Facebook
              • Partager sur Twitter
                7 avril 2020 à 18:13:56

                monkey3d a écrit:

                Il y a plein de tutos sur le sujet et c'est simple à mettre en oeuvre.

                Enfin le websocket ... plus complexe.


                Va pour SSE alors :) . Par contre d'après ce que dit w3schools, la techno ne serait pas supportée par Edge ?

                • Partager sur Facebook
                • Partager sur Twitter
                You are now about to witness the strength of street knowledge
                  7 avril 2020 à 18:32:34

                  Exact ... ! Il y a des gens qui utilisent Edge ? ;)

                  Même MS semble vouloir l'abandonner ..

                  A+

                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 avril 2020 à 19:20:47

                    Bonjour,

                    w3schools n'est pas à jour apparemment : https://caniuse.com/#feat=eventsource 

                    Internet Explorer est en effet abandonné, mais pas Edge, c'est justement leur nouveau navigateur (enfin, nouveau… la première version date de 2015).


                    -
                    Edité par Lamecarlate 7 avril 2020 à 19:21:41

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Pas d'aide concernant le code par MP, le forum est là pour ça :)

                      7 avril 2020 à 19:54:11

                      monkey3d a écrit:

                      Exact ... ! Il y a des gens qui utilisent Edge ? ;)

                      Même MS semble vouloir l'abandonner ..

                      A+


                      :lol:Bah écoute, je me suis posé la même question sur le coup

                      Lamecarlate a écrit:

                      Bonjour,

                      w3schools n'est pas à jour apparemment : https://caniuse.com/#feat=eventsource 

                      Internet Explorer est en effet abandonné, mais pas Edge, c'est justement leur nouveau navigateur (enfin, nouveau… la première version date de 2015).


                      -
                      Edité par Lamecarlate il y a moins de 30s

                      .D'accord , no soucis alors du côté compatibilité.

                      J'ai adapté le code de w3schools et, ça marche!!

                      Merci encore vous tous!!

                      -
                      Edité par Dr_strange 7 avril 2020 à 23:21:07

                      • Partager sur Facebook
                      • Partager sur Twitter
                      You are now about to witness the strength of street knowledge

                      Mon code est-il "propre" ?

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown