Moteur de recherche en php et concaténation requête SQL [Résolu/Fermé]

Signaler
Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018
-
Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
-
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

Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
2 458
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                                                                 
Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018

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>
Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
2 458 >
Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018

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>
Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
2 458
Au passage .... je te conseille de faire du POST au lieu du GET .....
Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
2 458
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                                                                 
Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018

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é
Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
2 458
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>

Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018

C'est bon ça marche, merci infiniment pour ton aide ! :)
Messages postés
28897
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 mai 2020
2 458 >
Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018

N'oublie pas de mettre le sujet en résolu (lien sous le titre de ta question)