Systeme de recherche

Résolu
Salut chers tous,
Cela fait plusieurs jours que je tente de créer un système de recherche sur mon site web mais en vain. Après avoir regardé plusieurs tuto et après plusieurs essais; je viens solliciter votre aide.
En effet le dernier essai me semble mieux mais ce message d'erreur s'affiche
.
Voici le code php:
<?php
$resultats = "";
//Traitement de la requete recherche

if (isset($_POST['query']) && !empty($_POST['query'])){
 // si utilisateur a entre quelque chose, on traite sa requete
 $query = preg_replace("#[^a-zA-Z ?0-9]#i", "", $_POST['query']);

  if($_POST['filtre'] == "nomAuteur"){
   $sql = "SELECT * FROM bibliotheque_num WHERE nom_auteur LIKE ?";
  }else if ($_POST['filtre'] == "typeOeuvre"){
   $sql = "SELECT * FROM bibliotheque_num WHERE type_oeuvre LIKE ?";
  }else if ($_POST['filtre'] == "nomOeuvre"){
   $sql = "SELECT * FROM bibliotheque_num WHERE nom_oeuvre LIKE ?";
  }

  //connexion à la base de données
  include ("inclu/connexionMysql.inc.php");

  $req = $db->prepare($sql);
  $req->execute(array('%'.$query.'%'));

  $count = $req->rowCount();

   if($count >=1){
   echo $count." résultat(s) trouvé(s) pour <strong>$query</strong><hr/>";
   while($data = $req->fetch(PDO::FETCH_OBJ)){
    echo '#'.$data->ref.' - Nom : '.$data->nom_oeuvre.' - Auteur: '.$data->nom_auteur.' - Type: '.$data->type_oeuvre.'<br/>';

   } else {
    echo "0 résultat trouvé pour <strong>$query</strong><hr/>";
   }

?>

Merci de m'aider.

EDIT : Ajout de la coloration syntaxique !

Cordialement

1 réponse

  1. Modérateur
    Bonjour,

    Tu as oublié l'accolade fermante de ton while.

    Mais tiens, essaye ça :
    
    
    <?php
    
    //connexion à la base de données
    require_once ("inclu/connexionMysql.inc.php");
    
    
    //Traitement de la requete recherche
    
    //-------------------------------------------------------------//
    //récupération PROPRE des variables AVANT de les utiliser
    //-------------------------------------------------------------//
    $query = !empty($_POST['query']) ? $_POST['query'] : NULL;
    $filtre = !empty($_POST['filtre']) ? $_POST['filtre'] : NULL;
    
    if ($query){
      // si utilisateur a entre quelque chose, on traite sa requete
      $query = preg_replace("#[^a-zA-Z ?0-9]#i", "", $query);
    
      
        switch($filtre){
      case "nomAuteur":
       $strWhere = "WHERE  nom_auteur LIKE ?";
      break;
      case "typeOeuvre":
       $strWhere = "WHERE  type_oeuvre LIKE ?";
      break;
      case "nomOeuvre":
       $strWhere = "WHERE  nom_oeuvre LIKE ?";
      break;
      default:
       $strWhere = "";
      break;
        }
     
     $sql = $sql = "SELECT * FROM bibliotheque_num " . $strWhere;
     $datas = array('%'.$query.'%');
     
     try{
      $req = $db->prepare($sql);
      $req->execute($datas);
      // on stocke le resultat dans un array
      $resultat = $req->fetchAll(PDO::FETCH_OBJ); 
     }catch(Exception $e){
      echo 'Erreur ! ' .$e->getMessage();
     }
    
      //$count = $req->rowCount(); NE PAS UTILISER POUR UNE REQUETE SELECT COMME INDIQUE DANS LA DOCUMENTATION OFFICIELLE DE PHP PDO !!
      // A la place, on peut faire : $count = !empty($resultat) ? count($resultat) : 0;
     
       if(!empty($resultat)){
      echo count($resultat)." résultat(s) trouvé(s) pour <strong>".$query."</strong><hr/>";
      foreach($resultat as $data){
       echo '#'.$data->ref.' - Nom : '.$data->nom_oeuvre.' - Auteur: '.$data->nom_auteur.' - Type: '.$data->type_oeuvre.'<br/>';
      }
       } else {
      echo "0 résultat trouvé pour <strong>$query</strong><hr/>";
       }
    }
    
    ?>
    

    Au passage, je t'invite à lire (et à appliquer) ceci :
    https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
    et ça : https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

    1. Ok bien noté, merci de l'aide.
      Cordialement