Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formulaire de recherche PHP champs pas obligatoire

    21 juillet 2018 à 16:05:26

    Salut :)
    Je suis en ce moment en train de travailler sur un site qui permet de répertorier un très grand nombre de transactions immobilières. L'utilisateur peut accéder à ces transactions en les recherchant par mot clé (nom de l'offreur, surface, type etc...). J'ai donc un système de recherche avec plusieurs filtres (voir image).
    Le problème est que tout les champs sont obligatoires (sans passer par un required dans le formulaire)
    Or je voudrais que seul un champ soit requis et que s'il n y a rien dans les autres champs, on recherche quand meme en fonction du champ obligatoire.
    J'ai essayé en mettant de simple if avec des is_null, ça marche mais il en faut beaucoup. Je voudrais donc savoir s'il existe une méthode plus "propre"
    Merci pour votre aide ;)
    Voici la partie du code que j'ai en attendant (je précise avoir suivi un tuto sur youtube de primfx)
    <form method="GET">
        <table border = 0>
     
    <tr>
    <td>
        <label for="ville">Ville &nbsp;</label>
        <input type="text" name="ville">
    </td>
     
    <td>
        <label for="cp">Code Postal &nbsp;</label>
        <input type="text" name="cp">
    </td>
     
    </tr>
    <tr>
    <td>
        <label for="type"><h3>Type de transaction <font color = "red">* </font></h3> <label>
        <select name="type">
          <option name="type" value = "Location">Location</option>
          <option name="type" value = "Achat">Achat</option>
          <option name="type" value = "Investissement">Investissement</option>
          <option name="type" value = "Vente utilisateur">Vente utilisateur</option>
        </select>
    </td>
    </tr>
       
    <tr>
    <td>
        <label for="nom">Nom du preneur/offreur &nbsp;<label>
        <input type="text" name="nom">
    </td>
     
    </tr>
    <tr>
    <td>
        <label for="type"><h3>Etat des locaux</h3><label>
        <select name="etat">
          <option name="etat" value = "Neuf">Neuf</option>
          <option name="etat" value = "Rénové">Rénové</option>
          <option name="etat" value = "Ancien">Ancien</option>
        </select>
    </td>
    </tr>
     
    <tr>
        <td>
            <label for="surface"><h3>Surface (m²)</h3><label>
        </td>
    </tr>
     
    <tr>
        <td>
            <label for="min">Entre &nbsp;<label>
            <input type="text" name="min">
        </td>
        <td>
            <label for="max">Et &nbsp;<label>
            <input type="text" name="max">
        </td>
    </tr>
    <tr>
        </tr>
    <tr>
        <td>
         
    </td>
    <td>
        <font color = "red">*Champs requis</font>
    </td>
    </tr>
      
     
      <br><br>
       
     
     
    </table>
    <br>
    <input type = "submit" value="Valider" class = "bouton"/>
    </form>
    <br>
    <br>
     
     
     
     
    <texte>
    <?php
        if (isset($_GET['ville']) AND isset($_GET['cp']) AND isset($_GET['nom']) AND isset($_GET['type']) AND isset($_GET['etat']) AND isset($_GET['min']) AND isset($_GET['max']))
        {
     
            $ville = htmlspecialchars($_GET['ville']);
            $cp = htmlspecialchars($_GET['cp']);
            $etat = htmlspecialchars($_GET['etat']);
            $type = htmlspecialchars($_GET['type']);
            $nom = htmlspecialchars($_GET['nom']);
            $min = htmlspecialchars($_GET['min']);
            $max = htmlspecialchars($_GET['max']);
     
            $reponse = $bdd->query ('select *
                 from transaction,type,preneur,offreur,agentpreneur,agentoffreur
                 where offreur.numOffreur = transaction.numOffreur
                 and agentpreneur.numAgentP = transaction.numAgentP
                 and type.numType = transaction.numType
                 and preneur.numPreneur = transaction.numPreneur
                 and agentoffreur.numAgentO = transaction.numAgentO
            and (nomPreneur like "%'.$nom.'%" or nomOffreur like "%'.$nom.'%") and villeT like "%'.$ville.'%" and codePoT like "%'.$cp.'%" and nomType like "%'.$type.'%" and etatLocauxT like "%'.$etat.'%" and surfaceT between '.$min.' and '.$max.'');
     
            
        if($reponse->rowCount(0)>0)
        {
     
     
        // On affiche chaque entrée une à une
        while ($donnees = $reponse->fetch())
        {
     
     
    ?>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
     
        <h2> <strong>Transaction</strong> : <?php echo $donnees['titreT']; ?> </h2>
        <h4><strong>Publiée le </strong> : <?php echo $donnees['datePubliT']; ?> </h4>
     
        <line>
         <h3>  Offreur  </h3>
         <p>
            <strong>Nom </strong> : <?php echo $donnees['nomOffreur']; ?><br />
            <strong>Adresse</strong> : <?php echo $donnees['adresseO']; ?><br />
            <strong>Ville</strong> : <?php echo $donnees['villeO']; ?><br />
            <strong>Code Postal</strong> : <?php echo $donnees['codePoO']; ?><br />
            <strong>Forme Juridique</strong> : <?php echo $donnees['formeJuridiqueO']; ?><br />
            <strong>Objet</strong> : <?php echo $donnees['objetO']; ?><br />
            <strong>Date de Creation</strong> : <?php echo $donnees['dateCreationO']; ?><br />
            <strong>Dirigeant</strong> : <?php echo $donnees['dirigeantO']; ?><br />
            <strong>Telephone</strong> : <?php echo $donnees['telephoneO']; ?><br />
            <strong>Site Web</strong> :  <?php echo $donnees['siteWebO']; ?><br />
        </p>
        </line>
     
     
        <line>
        <h3>  Agent Offreur  </h3>
        <p>
            <strong>Nom</strong> : <?php echo $donnees['nomAgentO']; ?><br />
            <strong>Adresse</strong> : <?php echo $donnees['adresseAgentO']; ?><br />
            <strong>Ville</strong> : <?php echo $donnees['villeAgentO']; ?><br />
            <strong>Code Postal</strong> : <?php echo $donnees['codePoAgentO']; ?><br />
            <strong>Forme Juridique</strong> : <?php echo $donnees['formeJuridiqueAgentO']; ?><br />
            <strong>Objet</strong> : <?php echo $donnees['objetAgentO']; ?><br />
            <strong>Date de Creation</strong> : <?php echo $donnees['dateCreationAgentO']; ?><br />
            <strong>Dirigeant</strong> : <?php echo $donnees['dirigeantAgentO']; ?><br />
            <strong>Telephone</strong> : <?php echo $donnees['telephoneAgentO']; ?><br />
            <strong>Site Web</strong> :  <?php echo $donnees['siteWebAgentO']; ?><br />
        </p>
        </line>
     
        <line>
        <h3>  Agent Preneur </h3>
        <p>
            <strong>Nom</strong> : <?php echo $donnees['nomAgentP']; ?><br />
            <strong>Adresse</strong> : <?php echo $donnees['adresseAgentP']; ?><br />
            <strong>Ville</strong> : <?php echo $donnees['villeAgentP']; ?><br />
            <strong>Code Postal</strong> : <?php echo $donnees['codePoAgentP']; ?><br />
            <strong>Forme Juridique</strong> : <?php echo $donnees['formeJuridiqueAgentP']; ?><br />
            <strong>Objet</strong> : <?php echo $donnees['objetAgentP']; ?><br />
            <strong>Date de Creation</strong> : <?php echo $donnees['dateCreationAgentP']; ?><br />
            <strong>Dirigeant</strong> : <?php echo $donnees['dirigeantAgentP']; ?><br />
            <strong>Telephone</strong> : <?php echo $donnees['telephoneAgentP']; ?><br />
            <strong>Site Web</strong> : <?php echo $donnees['siteWebAgentP']; ?><br />
        </p>
        </line>
     
        <line>
        <h3>  Preneur  </h3>
        <p>
            <strong>Nom</strong> : <?php echo $donnees['nomPreneur']; ?><br />
            <strong>Adresse</strong> : <?php echo $donnees['adresseP']; ?><br />
            <strong>Ville</strong> : <?php echo $donnees['villeP']; ?><br />
            <strong>Code Postal</strong> : <?php echo $donnees['codePoP']; ?><br />
            <strong>Forme Juridique</strong> : <?php echo $donnees['formeJuridiqueP']; ?><br />
            <strong>Objet</strong> : <?php echo $donnees['objetP']; ?><br />
            <strong>Date de Creation</strong> : <?php echo $donnees['dateCreationP']; ?><br />
            <strong>Dirigeant</strong> : <?php echo $donnees['dirigeantP']; ?><br />
            <strong>Telephone</strong> : <?php echo $donnees['telephoneP']; ?><br />
            <strong>Site Web</strong> : <?php echo $donnees['siteWebP']; ?><br />
        </p>
        </line>
     
        <line>
        <h3>  Type  </h3>
        <p>
            <strong>Type</strong> : <?php echo $donnees['nomType']; ?><br />
            <strong>Adresse</strong> : <?php echo $donnees['adresseT']; ?><br />
            <strong>Ville</strong> : <?php echo $donnees['villeT']; ?><br />
            <strong>Code Postal</strong> : <?php echo $donnees['codePoT']; ?><br />
            <strong>Nature Locaux</strong> : <?php echo $donnees['natureLocauxT']; ?><br />
            <strong>Surface</strong> : <?php echo $donnees['surfaceT']; ?><br />
            <strong>Etat des locaux</strong> : <?php echo $donnees['etatLocauxT']; ?><br />
            <strong>Montant</strong> : <?php echo $donnees['montantT']; ?><br />
            <strong>Date d'acquisition</strong> : <?php echo $donnees['dateAcqT']; ?><br />
            <strong>Taux de rendement</strong> : <?php echo $donnees['tauxRendementT']; ?><br />
        </p>
        </line>
        <div class="line"></div>
       
     
     
         
        <?php
        }
    }
    else
    {
        ?> <center><h4><font color = "white">Aucun résultat pour votre recherche</font></h4></center><?php
    }
     
        $reponse->closeCursor(); // Termine le traitement de la requête
     
        }
    }
    • Partager sur Facebook
    • Partager sur Twitter
      21 juillet 2018 à 16:17:09

      Hello, j'imagine qu'il y en à d'autres vu que tu dis 'beaucoup' ?Parce que mon idée est peut-etre un peu lourde si tu n'as que ça comme champs.

      Tu pourrais stocker tous tes input sous forme d'array dans une variable $_POST, après tu n'auras qu'à faire une boucle qui construit ta requete en fonction des inputs présents.

      • Partager sur Facebook
      • Partager sur Twitter
      Google répond à tout, PHP Manual sait (presque) tout, StackOverflow envisage tout !
        21 juillet 2018 à 16:35:55

        Caroline B. a écrit:

        Hello, j'imagine qu'il y en à d'autres vu que tu dis 'beaucoup' ?Parce que mon idée est peut-etre un peu lourde si tu n'as que ça comme champs.

        Tu pourrais stocker tous tes input sous forme d'array dans une variable $_POST, après tu n'auras qu'à faire une boucle qui construit ta requete en fonction des inputs présents.


        Coucou, je précise que mon tuteur de stage m'a seulement demander les filtres que tu vois sur l'image (malgré un très grand nombre de transactions. Environ 50 000)

        Je comprends bien ce que tu me dis, mais je ne sais pas vraiment comment procéder...

        Pourrais-tu très rapidement m'expliquer?

        Merci pour ta réponse :)

        • Partager sur Facebook
        • Partager sur Twitter
          21 juillet 2018 à 16:54:34

          <form action="" method="post">
          	<input type="text" name="fields[type]" />
          	<input type="text" name="fields[preneur]" />
          	<input type="submit" name="submit" value="ok">
          </form>
          
          
          <?php
          
          $sql = "SELECT * FROM table WHERE ";
          
          $a = array();
          
          foreach ($_POST['fields'] as $key => $value) {
          	$a[] = $key." LIKE %".$value."%";
          }
          
          $sql .= implode(' OR ', $a);
          
          var_dump($sql);
          Maintenant, je suis partie de ton code de base. Sache que mon maître de stage m'avait dit "Plusieurs LIKE %% dans une requête, c'est le mal absolu" (performances, ressources etc) :p
          EDIT faut ajouter une vérif pour ne pas prendre les champs vide en compte bien sur ^^ mais ça n'est à faire qu'une fois dans le foreach (je lai zappé sorry)

          -
          Edité par Caroline B. 21 juillet 2018 à 16:55:55

          • Partager sur Facebook
          • Partager sur Twitter
          Google répond à tout, PHP Manual sait (presque) tout, StackOverflow envisage tout !
            21 juillet 2018 à 17:35:19

            Caroline B. a écrit:

            <form action="" method="post">
            	<input type="text" name="fields[type]" />
            	<input type="text" name="fields[preneur]" />
            	<input type="submit" name="submit" value="ok">
            </form>
            
            
            <?php
            
            $sql = "SELECT * FROM table WHERE ";
            
            $a = array();
            
            foreach ($_POST['fields'] as $key => $value) {
            	$a[] = $key." LIKE %".$value."%";
            }
            
            $sql .= implode(' OR ', $a);
            
            var_dump($sql);
            Maintenant, je suis partie de ton code de base. Sache que mon maître de stage m'avait dit "Plusieurs LIKE %% dans une requête, c'est le mal absolu" (performances, ressources etc) :p
            EDIT faut ajouter une vérif pour ne pas prendre les champs vide en compte bien sur ^^ mais ça n'est à faire qu'une fois dans le foreach (je lai zappé sorry)

            -
            Edité par Caroline B. il y a 36 minutes


            Ok merci je vais faire ça :p
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2018 à 19:01:19

              Pitié, prenez au moins en compte les injections SQL !

              $bdd = new PDO(/* ... */);
              
              $conds = [];
              foreach ($_POST['fields'] as $key =&gt; $value) {
                  $conds[] = '`' . str_replace('`', '``', $key) . '` LIKE ' . $bdd-&gt;quote('%' . $value . '%');
              }
              $sql = 'SELECT * FROM table WHERE ' . implode(' OR ', $conds ?: ['1=1']);
              

              -
              Edité par julp 21 juillet 2018 à 19:01:49

              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2018 à 19:05:37

                j'expliquais juste le principe... merci pour l'info supplémentaire.
                • Partager sur Facebook
                • Partager sur Twitter
                Google répond à tout, PHP Manual sait (presque) tout, StackOverflow envisage tout !
                  21 juillet 2018 à 23:27:09

                  julp a écrit:

                  Pitié, prenez au moins en compte les injections SQL !

                  $bdd = new PDO(/* ... */); $conds = []; foreach ($_POST['fields'] as $key =&gt; $value) { $conds[] = '`' . str_replace('`', '``', $key) . '` LIKE ' . $bdd-&gt;quote('%' . $value . '%'); } $sql = 'SELECT * FROM table WHERE ' . implode(' OR ', $conds ?: ['1=1']); 

                  -
                  Edité par julp il y a environ 3 heures


                  Salut merci pour ta réponse, juste une petite question, que signifie le "?:" à la dernière ligne?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 juillet 2018 à 16:10:28

                    Salut, tout d'abord, merci de vos aides, la requête marche impec, le seul soucis est que rien ne s'affiche. Je voudrais savoir si vous avez une petite idée d'où placer mon $bdd -> query

                    En effet quand je fais un echo de cette requête:

                    $reponse = 'select *
                                 from transaction,type,preneur,offreur,agentpreneur,agentoffreur
                                 where offreur.numOffreur = transaction.numOffreur
                                 and agentpreneur.numAgentP = transaction.numAgentP
                                 and type.numType = transaction.numType
                                 and preneur.numPreneur = transaction.numPreneur
                                 and agentoffreur.numAgentO = transaction.numAgentO and' . implode(' OR ', $conds ?: ['1=1']);

                    Ca marche mais comme je l'ai dit rien ne s'affiche sur le site, alors que ce que je voudrais, ce serait quelque chose dans le genre:

                    $reponse = $bdd->query ('select *
                                 from transaction,type,preneur,offreur,agentpreneur,agentoffreur
                                 where offreur.numOffreur = transaction.numOffreur
                                 and agentpreneur.numAgentP = transaction.numAgentP
                                 and type.numType = transaction.numType
                                 and preneur.numPreneur = transaction.numPreneur
                                 and agentoffreur.numAgentO = transaction.numAgentO and' . implode(' OR ', $conds ?: ['1=1']));

                    Ma question peut paraître idiote car mes connaissances en SQL/PHP sont encore assez limitées. ^^

                    EDIT : Ne serait-ce pas un AND à la dernière ligne à la place du OR? 

                    -
                    Edité par PierreBarrere1 22 juillet 2018 à 16:40:45

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Formulaire de recherche PHP champs pas obligatoire

                    × 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