Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaire de recherche, champs multiples, PHP

    22 janvier 2020 à 10:44:37

    Bonjour,

    Mes meilleurs voeux à tous pour commencer! (On a tous le mois de janvier pour le souhaiter à ce qu'il parait! :D)

    Rentrons maintenant dans le vif du sujet.

    Comme le titre l'indique, je cherche à faire un formulaire de recherche avec plusieurs champs et en PHP.

    Je tiens à préciser que j'ai déjà fait des recherches (aussi bien sur des forums français qu'anglais) et que je n'ai pas encore trouvé le moyen de résoudre mon problème malgré plusieurs essais infructueux.

    Je précise également que mon niveau en PHP est très bas, je me base sur des tutos. Je ne connais donc pas tous les termes et je suis incapable d'écrire un code moi même. En général je copie/colle, décortique pour essayer de comprendre et effectue des tests.

    Pour commencer, j'utilise un code qui me permet de faire une recherche sur un seul champs et qui fonctionne parfaitement. Le voici : 

    PHP :

    $bdd = new PDO("mysql:host=localhost;dbname=rubbber_data;charset=utf8", "root", "");
    
    
      $get = $bdd->query("SELECT * FROM upcoming_events order by event_date asc");
    
      if(isset($_GET['keyword']) AND !empty($_GET['keyword'])) {
          $q = htmlspecialchars($_GET['keyword']);
          $q = $_GET['keyword'];
          $q = trim($q); //pour supprimer les espaces dans la requête de l'internaute
          $q = strip_tags($q); //pour supprimer les balises html dans la requête
          $get = $bdd->query('SELECT event_name, event_date, event_day, event_month, event_category, event_city, event_country, event_url, event_website, event_facebook, event_instagram, event_register, event_banner, event_info, event_event, event_rules, event_track, event_trackimage, event_address, event_googlemap FROM upcoming_events WHERE event_name LIKE "%'.$q.'%" ORDER BY id ASC');
          if($get->rowCount() == 0) {
            $get = $bdd->query('SELECT event_name, event_date, event_day, event_month, event_category, event_city, event_country, event_url, event_website, event_facebook, event_instagram, event_register, event_banner, event_info, event_event, event_rules, event_track, event_trackimage, event_address, event_googlemap FROM upcoming_events WHERE CONCAT(event_name, event_date, event_day, event_month, event_category, event_city, event_country, event_url, event_website, event_facebook, event_instagram, event_register, event_banner, event_info, event_event, event_rules, event_track, event_trackimage, event_address, event_googlemap) LIKE "%'.$q.'%" ORDER BY id ASC');
          }
    }

    HTML du formulaire de recherche :

    <form class="searchbox" method="GET">
       <input type="search" name="keyword" placeholder="" />
          <select id="category" name="keyword">
             <option value="<?php ("SELECT columns6 from upcoming_events") ?>">All categories</option>
             <option value="Fixed Gear Criterium">Fixed Gear Criterium</option>
             <option value="Fixed Gear Uncategorized">Fixed Gear Uncategorized</option>
             <option value="Alleycat">Alleycat</option>
             <option value="Tracklocross/SSX">Tracklocross/SSX</option>
             <option value="Stage Ride">Stage Ride</option>
          </select>
       <input type="submit" value="Go" />

    HTML des résultats :

    <?php
       if($get->rowCount() > 0) {
        while($show = $get->fetch())
        {
    ?>
    
    <tr>
      <td>
        <ul class="date">
          <li class="day"><?php echo $show['event_day']?></li>
          <li class="month"><?php echo $show['event_month']?></li>
        </ul>
      </td>
      <td>
       <a href="<?php echo $show['event_url']?>" target="_self">
         <ul class="place">
            <li class="category_list">
               <ul>
                 <li><?php echo $show['event_category']?></li>
               </ul>
            </li>                 
            <li class="eventname"><?php echo $show['event_name']?></li>
            <li class="eventplace"><?php echo $show['event_city']?>, <?php echo $show['event_country']?></li>               
         </ul>
        </a>
       </td>
    </tr>
    <?php
       }
     }
     else {
     ?>
     <br />
     <br />
     <p class="nothingfound">It looks like there's no race for what you're looking for...</p>
     <?php
     }
     ?>

    Actuellement, seul le deuxième champs fonctionne (la liste déroulante), mais le premier champs n'est apparemment pas pris en compte.

    J'ai essayé avec cette méthode :

    $get = "SELECT * FROM upcoming_events order by event_date asc";
    
            if(isset($_GET['keyword']) AND !empty($_GET['keyword'])){
                $keyword = htmlspecialchars($_GET['keyword']);
                $keyword = $_GET['keyword'];
                $keyword = trim($keyword); //pour supprimer les espaces dans la requête de l'internaute
                $keyword = strip_tags($keyword); //pour supprimer les balises html dans la requête
                $sql .= " AND (`event_name` LIKE '%".$keyword."%' OR `event_month` LIKE '%".$keyword."%' OR `event_category` LIKE '%".$keyword."%' OR `event_city` LIKE '%".$keyword."%' OR `event_country` LIKE '%".$keyword."%')";
            }
            if(isset($_GET['category']) AND !empty($_GET['category'])){
                $category = $_GET['category'];
                $sql .= " AND `event_category`='$category'";
            }
                $sql = $bdd->query($get);
                if($sql->rowCount() == 0) {
                    $sql = $bdd->query($get);
            }

    Mais j'avais cette erreur : Fatal error: Uncaught Error: Call to a member function rowCount() on string in D:\wamp\www\rubbber\index.php on line371

    Afin de garder une bonne humeur sur ce sujet et parce que j'en vois trop, je demanderais aux personnes qui fréquentent ce forum et qui se reconnaîtront dans le descriptif ci-dessous de ne pas prendre part à ce sujet, merci.

    - Si tu estimes que je n'ai pas fait assez de recherche à ton goût et que tu ne souhaites me répondre que par un lien me redirigeant vers un sujet similaire, que j'ai surement déjà consulté et qui ne m'aidera pas plus.

    - Si tu es là pour étaler tes connaissances et me bourrer le crâne avec des termes et des manipulations dont je ne comprendrais absolument rien.

    - Si tu es simplement de mauvaise humeur ou de mauvaise foi.

    A tous les autres, merci d'avance pour votre empathie et votre aide!





    -
    Edité par bwEEn 23 janvier 2020 à 7:54:13

    • Partager sur Facebook
    • Partager sur Twitter
      22 janvier 2020 à 12:26:49

      Bonjour,

      Peut-être que tu vas me mettre dans le panier de ceux que tu n'aimes pas, mais je t'invite tout de même à jeter un oeil du côté des requêtes préparées en PDO/PHP (je te laisse chercher, y'a un tuto sur OC) car tu es vulnérable avec ta requête.

      Ensuite, dans un second temps, fait ta requête en dehors du select et ne mets que la valeur retourné par ta requête dans ton forum?

      Enfin, tu dis vouloir faire une recherche sur plusieurs champs mais dans ton formulaire de recherche, je ne vois qu'un seul champ, où sont les autres ? =/

      EDIT : pardon il y a bien de champs c'est ton indentation qui m'a perturbée. Ta recherche ne fonctionnera pas car tes 2 input on le même name donc il prendra la dernière valeur envoyée. Pour ton select, je t'invite à faire le premier <option> avec une valeur à nulle afin de vérifié si tu utilises ou non ce champ pour la recherche

      Après il faut construire ta requête d'abord au format string en ajoutant les clauses where suivant les champs remplis.

      -
      Edité par lindadu01 22 janvier 2020 à 12:28:43

      • Partager sur Facebook
      • Partager sur Twitter

      Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

        23 janvier 2020 à 8:14:05

        Bonjour Linda, merci pour ton message!

        Ensuite, dans un second temps, fait ta requête en dehors du select et ne mets que la valeur retourné par ta requête dans ton forum?

        Je n'ai pas très bien saisi ce que tu entends par faire la requête en dehors du select.

        Ta recherche ne fonctionnera pas car tes 2 input on le même name donc il prendra la dernière valeur envoyée.

        Lorsque je test avec les deux champs, le name de chacun est différent (j'utilise "keyword" et "category" dans ce cas)

        Pour ton select, je t'invite à faire le premier <option> avec une valeur à nulle afin de vérifié si tu utilises ou non ce champ pour la recherche

        Pour ce qui est de l'utilisation de "null", le "category" (donc le deuxième champs, qui est une liste déroulante), la première valeur par défaut les sélectionne et les affiche toutes. Je ne comprends donc pas trop l'intérêt du null dans ce cas?

        EDIT : Je crois avoir saisi ce que tu voulais dire.

        Par exemple, si une personne tape un mot clé pour sa recherche sans sélectionner de catégorie, le résultat affiché sera en fait toutes les entrées de la DB car il ira chercher toutes les entrées de toutes les catégories et donc le mot clé ne servira à rien au final.

        Je sais pas si j'ai été assez clair mais c'est bien ça?

        Après il faut construire ta requête d'abord au format string en ajoutant les clauses where suivant les champs remplis.

        Quelque chose comme ceci tu veux dire?

        "SELECT * FROM upcoming_events WHERE '%".keyword."%' LIKE 'event_name' OR '%".keyword."%' LIKE 'event_country' AND '%".category."%' LIKE 'event_category' ORDER BY event_date ASC"




        -
        Edité par bwEEn 23 janvier 2020 à 11:21:27

        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2020 à 16:48:00

          Bonjour,

          J'insiste vraiment sur le fait qu'il faut te documenter sur les requêtes préparées en PHP... Ca t'aidera grandement

          Pour ton premier point, tu fais une requête dans ta balise SELECT, il faut la faire en dehors ce sera plus propre, genre tu la fais avant la création de ta balise select et dans ton select tu n'affiche que le résultat de ta requête (peut-être as-tu confondu le select du HTML avec le select du SQL, je n'ai pas été très claire sur ce point)

          Pour le second point, Je n'avais pas compris ca comme ca, excuse moi. Avec le null, cela voudra dire que toi, en base il faudra que tu recherches dans toutes les catégories le mot recherché. Le mot clé aura servi a qqch s'il n'existe pas dans une catagorie. 

          Pour le troisième point, grosso modo même si je ne sais pas de quel keyword tu parle... Et ta colonne, c'est le keyword ou c'est event_name ? Si c'est event_name, regarde comment on construit la clause where en SQL du coup...

          En général quand on test un code on mets exactement le meme ici car tu dis renommer l'un de tes champs input quand tu tests avec les  mais tu nous donne le code avec les  memes noms, ce qui ne nous aide pas :/

          • Partager sur Facebook
          • Partager sur Twitter

          Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

            25 janvier 2020 à 10:40:04

            Bonjour Linda,

            J'ai un peu du mal à comprendre le principe de la requête préparée ainsi que la requête en dehors du SELECT...

            En fait, le premier input porte le name "keyword" (vu que c'est un champs de recherche textuel par mot clé) et le second porte le name "category" étant donné qu'il permet de choisir un catégorie parmis une liste.

            les noms des différentes lignes de ma table "upcoming_events" commencent tous par "event_..." donc j'avais écris ma requête pour que le mot clé saisi dans le champs (de recherche) recherche un résultat par mis certaines lignes (event_name, event_country, event_category, ...)

            Le champs de recherche (select) avec les catégories permettant de n'afficher que la catégorie sélectionnée. Donc $category LIKE event_category

            • Partager sur Facebook
            • Partager sur Twitter
              27 janvier 2020 à 9:30:55

              Bonjour,

              Regarde ceci pour la requête préparée:

              https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1971264-requetes-preparees

              Enfin, après relecture, je me suis trompée et vient de comprendre ^^ mets je ne comprends pas pourquoi tu le mets entre balise <?php ?> car il s'agit d'une simple string dans laquelle tu n'inclus pas de valeur PHP.

              Regarde ici pour construire correctement une requête car la clause WHERE ne se construit pas n'importe comment :

              https://openclassrooms.com/fr/courses/4449026-initiez-vous-a-lalgebre-relationnelle-avec-le-langage-sql/4519421-executez-une-requete-avec-select-from-et-where

              Pour ton bien, je pense qu'il faut que tu revois les bases SQL/PHP et HTML car ce n'est pas l'ID que tu récupères dans la balises HTML mais bien le name ;) car de ce que je vois, le premier input porte bien le name "keyword" mais le second aussi, bien qu'il porte l'id "category"

              • Partager sur Facebook
              • Partager sur Twitter

              Parfois, arrêter 5 minutes son développement permet de mieux repartir face à un problème ;)

              Formulaire de recherche, champs multiples, PHP

              × 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