Moteur de recherche en php et concaténation requête SQL

Résolu
informatique790 Messages postés 9 Statut Membre -  
jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   -
Salut à tous,

J'essaie de faire un moteur de recherche pour mon site mais j'ai une erreur dans mon code que je n'ai pas su résoudre :

<?php
 
$bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
 
//$articles = $bdd->query('SELECT nomDomaine FROM domaine ORDER BY id DESC');
 
 
 
if(isset($_GET['q']) AND !empty($GET['q'])){
    //$q = htmlspecialchars($GET['q']);
    //$articles = $bdd->query('SELECT * FROM domaine WHERE keywords LIKE "%'.$q.'%"ORDER BY id DESC');
    $q = $_GET['q'];
    $s = explode(" ", $q);
    $sql = $bdd->query('SELECT * FROM domaine');
    $i = 0;
    foreach($s as $mot){
        if(strlen($mot) > 3){
            if($i==0){
                $sql.=(' WHERE ');
            }
            else{
                $sql.('" OR ');
            }
            $sql.=('keywords LIKE  "%'.$mot.'%"');
            $i++;
                 
        }
    }
     
     
    }
?>
 
<form method="GET">
<input type="search" name="q" placeholder="Recherche..."/>
<input type="submit" value="valider"/>
</form>
 
<ul>
<?php while($a = $sql->fetch()) { ?>
    <li><?= $a['nomDomaine'] ?></li>
<?php }?>
</ul>


Apparemment l'erreur se trouve à la ligne 40 qui me dit que la variable "$sql" n'est pas défini pourtant je l'ai bien déclaré plus haut...

Quel peut être le problème à votre avis ?
Et est-ce cette façon de concaténer les requêtes est juste ?

PS : je débute à pein en PHP alors soyez indulgent

3 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    Tu fais le QUERY ..; AVANT d'avoir construit ton WHERE...

    Essaye ça :
    <?php
    
    //activation des erreurs php
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //connexion à la bdd en activant les erreurs PDO
    try{
      $bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
      // Activation des erreurs PDO
       $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
       $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch (Exception $e){
      echo "Erreur : ".$e->getMessage();
    }
    
    
    //récupération PROPRE des variables AVANT de les utiliser
    $q = !empty($_GET['q']) ? $_GET['q'] : NULL; 
     
    if($q){
      $s = explode(" ", $q);
      $sql = 'SELECT * FROM domaine ';
      $i = 0;
      foreach($s as $mot){
          if(strlen($mot) > 3){
              if($i==0){
                  $sql.=(' WHERE ');
              }
              else{
                  $sql.('" OR ');
              }
              $sql.=('keywords LIKE  "%'.$mot.'%"');
              $i++;
                   
          }
      }
       
      //execution "propre" d'une requête 
      try{
        $result = $bdd->query($sql);
      }catch(Exception $e){
        echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
      }
    }
    ?>
     
    <form method="GET">
    <input type="search" name="q" placeholder="Recherche..."/>
    <input type="submit" value="valider"/>
    </form>
     
    <ul>
    <?php 
      while($a = $result->fetch()) { 
        echo "<li>" .$a['nomDomaine'] ."</li>";
      }?>
    </ul>

    edit: correction du $GET en $_GET
    Cordialement, 
    Jordane                                                                 
    0
    1. informatique790 Messages postés 9 Statut Membre
       
      Merci pour ta réponse,
      j'ai essayé ce code mais maintenant j'ai l'erreur suivante :
      Notice: Undefined variable: result in C:\Program Files (x86)\EasyPHP-12.1\www\ccm.php on line 56

      Fatal error: Call to a member function fetch() on a non-object in C:\Program Files (x86)\EasyPHP-12.1\www\ccm.php on line 56
      <?php
      
      //activation des erreurs php
      error_reporting(E_ALL);
      ini_set('display-errors','on');
      
      //connexion à la bdd en activant les erreurs PDO
      try{
        $bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
        // Activation des erreurs PDO
         $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
         $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
      } catch (Exception $e){
        echo "Erreur : ".$e->getMessage();
      }
      
      
      //récupération PROPRE des variables AVANT de les utiliser
      $q = !empty($GET['q']) ? $GET['q'] : NULL; 
       
      if($q){
        $s = explode(" ", $q);
        $sql = ('SELECT * FROM domaine ');
        $i = 0;
        foreach($s as $mot){
            if(strlen($mot) > 3){
                if($i==0){
                    $sql.=(' WHERE ');
                }
                else{
                    $sql.('" OR ');
                }
                $sql.=('keywords LIKE  "%'.$mot.'%"');
                $i++;
                     
            }
        }
         
        //execution "propre" d'une requête 
        try{
          $result = $bdd->query($sql);
        }catch(Exception $e){
          echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
        }
      }
      ?>
       
      <form method="GET">
      <input type="search" name="q" placeholder="Recherche..."/>
      <input type="submit" value="valider"/>
      </form>
       
      <ul>
      <?php 
        while($a = $result->fetch()) { 
          echo "<li>" .$a['nomDomaine'] ."</li>";
        }?>
      </ul>
      
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > informatique790 Messages postés 9 Statut Membre
         
        Tu n'as pas envoyé de recherche je suppose ....

        Pour remédier à ça essaye :
        
        <ul>
        <?php 
        if(!empty($result)){
          while($a = $result->fetch()) { 
            echo "<li>" .$a['nomDomaine'] ."</li>";
          }
        }
        ?>
        </ul>
        
        0
    2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Au passage .... je te conseille de faire du POST au lieu du GET .....
      0
  2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Ou une autre version utilisant un JOIN et un ARRAY temporaire

    <?php
    
    //activation des erreurs php
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //connexion à la bdd en activant les erreurs PDO
    try{
      $bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
      // Activation des erreurs PDO
       $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
       $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch (Exception $e){
      echo "Erreur : ".$e->getMessage();
    }
    
    
    //récupération PROPRE des variables AVANT de les utiliser
    $q = !empty($_GET['q']) ? $_GET['q'] : NULL; 
    $strWhere  ="";
    
     if($q){
      $s = explode(" ", $q);
    
      if(count($s)>0){
        $array_tmp = array();
        foreach($s as $word){
          $array_tmp[] = " keywords LIKE '%".$word."%'";
        }
         $strWhere = " WHERE " . join(' OR ',$array_tmp) ;
      }  
     
     $sql = 'SELECT * FROM domaine strWhere';  
     //execution "propre" d'une requête 
     try{
      $result = $bdd->query($sql);
     }catch(Exception $e){
      echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
     }
    }
    ?>
     
    <form method="GET">
    <input type="search" name="q" placeholder="Recherche..."/>
    <input type="submit" value="valider"/>
    </form>
     
    <ul>
    <?php 
    if(!empty($result)){
      while($a = $result->fetch()) { 
        echo "<li>" .$a['nomDomaine'] ."</li>";
      }
    }
    ?>
    </ul>
    


    edit: correction du $GET en $_GET

    Cordialement, 
    Jordane                                                                 
    0
    1. informatique790 Messages postés 9 Statut Membre
       
      La recherche ne me donne aucun résultat, je crois que c'est explode qui ne marche pas car quand j'ai fais print_r($s); rien ne s'est affiché
      0
  3. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    En fait ... pour récupérer une variable GET .. c'est $_GET qu'il faut utiliser ( et non $GET ) que j'avais mal écrit....

    Mais bon..
    On va passer en ton code en $_POST.
    Ensuite, on va ajouter l'action dans le FORM.
    Et on va ajouter un peu de débugage.

    Essaye ça :
    <?php
    
    //activation des erreurs php
    error_reporting(E_ALL);
    ini_set('display-errors','on');
    
    //connexion à la bdd en activant les erreurs PDO
    try{
      $bdd=new PDO('mysql:host=127.0.0.1;dbname=domaineexpertise','root','');
      // Activation des erreurs PDO
       $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      // mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
       $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch (Exception $e){
      echo "Erreur : ".$e->getMessage();
    }
    
    
    print_r($_POST);//le temps des tests 
    
    //récupération PROPRE des variables AVANT de les utiliser
    $q = !empty($_POST['q']) ? $_POST['q'] : NULL; 
    
    print_r($q);//le temps des tests 
     
    if($q){
      $s = explode(" ", $q);
      print_r($s); //le temps des tests 
      
      $sql = ('SELECT * FROM domaine ');
      $i = 0;
      foreach($s as $mot){
          if(strlen($mot) > 3){
              if($i==0){
                  $sql.=(' WHERE ');
              }
              else{
                  $sql.('" OR ');
              }
              $sql.=('keywords LIKE  "%'.$mot.'%"');
              $i++;
                   
          }
      }
       
      //execution "propre" d'une requête 
      try{
        echo $sql; //le temps des tests 
        $result = $bdd->query($sql);
      }catch(Exception $e){
        echo "Erreur dans la requête :" .$sql ." <br>".$e->getMessage();
      }
    }
    ?>
     
    <form method="GET" action="">
    <input type="search" name="q" placeholder="Recherche..."/>
    <input type="submit" value="valider"/>
    </form>
     
    <ul>
    <?php 
     if(!empty($result)){
      while($a = $result->fetch()) { 
        echo "<li>" .$a['nomDomaine'] ."</li>";
      }
     } 
    ?>
    </ul>
    

    0
    1. informatique790 Messages postés 9 Statut Membre
       
      C'est bon ça marche, merci infiniment pour ton aide ! :)
      0
      1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > informatique790 Messages postés 9 Statut Membre
         
        N'oublie pas de mettre le sujet en résolu (lien sous le titre de ta question)
        0