Menu

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

Messages postés
7
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
15 décembre 2018
-
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
Afficher la suite 

3 réponses

Messages postés
25760
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2019
1658
0
Merci
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                                                                 
informatique790
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>
jordane45
Messages postés
25760
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2019
1658 > informatique790
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>
jordane45
Messages postés
25760
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2019
1658 -
Au passage .... je te conseille de faire du POST au lieu du GET .....
Messages postés
25760
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2019
1658
0
Merci
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                                                                 
informatique790
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
25760
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2019
1658
0
Merci
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>

informatique790
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 ! :)
jordane45
Messages postés
25760
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 juin 2019
1658 > informatique790
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)