Signaler

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

Posez votre question informatique790 4Messages postés lundi 12 juin 2017Date d'inscription 12 juin 2017 Dernière intervention - Dernière réponse le 13 juin 2017 à 00:27 par jordane45
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 
Utile
+0
plus moins
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 4Messages postés lundi 12 juin 2017Date d'inscription 12 juin 2017 Dernière intervention - 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>
Répondre
jordane45 18020Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 9 août 2017 Dernière intervention - 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>
Répondre
jordane45 18020Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 9 août 2017 Dernière intervention - 12 juin 2017 à 22:57
Au passage .... je te conseille de faire du POST au lieu du GET .....
Répondre
Donnez votre avis
Utile
+0
plus moins
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 4Messages postés lundi 12 juin 2017Date d'inscription 12 juin 2017 Dernière intervention - 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é
Répondre
Donnez votre avis
Utile
+0
plus moins
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 4Messages postés lundi 12 juin 2017Date d'inscription 12 juin 2017 Dernière intervention - 12 juin 2017 à 23:53
C'est bon ça marche, merci infiniment pour ton aide ! :)
Répondre
jordane45 18020Messages postés mercredi 22 octobre 2003Date d'inscription ModérateurStatut 9 août 2017 Dernière intervention - 13 juin 2017 à 00:27
N'oublie pas de mettre le sujet en résolu (lien sous le titre de ta question)
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !