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

Résolu/Fermé
informatique790
Messages postés
8
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
8 juillet 2020
- Modifié le 12 juin 2017 à 22:34
jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
- 13 juin 2017 à 00:27
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

jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
4 194
Modifié le 12 juin 2017 à 23:24
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
informatique790
Messages postés
8
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
8 juillet 2020

12 juin 2017 à 22:52
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
jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
4 194 > informatique790
Messages postés
8
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
8 juillet 2020

12 juin 2017 à 22:56
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
jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
4 194
12 juin 2017 à 22:57
Au passage .... je te conseille de faire du POST au lieu du GET .....
0
jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
4 194
Modifié le 12 juin 2017 à 23:24
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
informatique790
Messages postés
8
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
8 juillet 2020

12 juin 2017 à 23:18
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
jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
4 194
12 juin 2017 à 23:23
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
informatique790
Messages postés
8
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
8 juillet 2020

12 juin 2017 à 23:53
C'est bon ça marche, merci infiniment pour ton aide ! :)
0
jordane45
Messages postés
35712
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
26 juin 2022
4 194 > informatique790
Messages postés
8
Date d'inscription
lundi 12 juin 2017
Statut
Membre
Dernière intervention
8 juillet 2020

13 juin 2017 à 00:27
N'oublie pas de mettre le sujet en résolu (lien sous le titre de ta question)
0