Barre de recherche n'affiche rien

Fermé
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 19 nov. 2021 à 02:42
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 22 nov. 2021 à 09:32
Bonjour,
J'ai des messages d'erreurs qui apparaissent au niveau de la barre de recherche. Je souhaite que lorsqu'on recherche une annonce en bdd selon son titre ou sa description, qu'elle s'affiche.

Les erreurs qui apparaissent

Premièrement: Undefined variable: search; alors que je pense que je l'ai bien définie
Deuxièmement: Uncaught Error: Call to a member function rowCount() on null

Page accueil.php:
<?php
 include 'cnx.php';
 include 'cmdaffichage.php';
 $anouncement= afficherAnnonce();

if(isset($_GET['q']) AND !empty($_GET['q'])) {
   $q= htmlspecialchars($_GET['q']);

   $search = $bdd->query('SELECT titre FROM annonces WHERE titre LIKE "%'.$q.'%" ORDER BY id DESC');

   if($search->rowCount() == 0) {
    $search = $bdd->query('SELECT titre FROM annonces WHERE CONCAT(titre, presentation) LIKE "%'.$q.'%" ORDER BY id DESC');
 }
}



?>


<html lang="fr">
<head>
  <meta charset="utf-8">
  <title>Titre de la page</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
<header>


<br> <br> <br> <br>
<div id="searchbar">
<form method="GET">
                
   <h1>Que recherchez-vous?</h1>
   <input type="search" name="q" placeholder="maison, voiture..." />
   <input type="submit" value="Rechercher" />
</form>
</div>

<?php
if ($search->rowCount() > 0){
  while ($search = $s ->fetch()) {

    echo'
    <div class="annoncepub">
      <input type="radio" name="slides" id="i1" checked>
      <input type="radio" name="slides" id="i2" checked>
      <input type="radio" name="slides" id="i3" checked>
      <input type="radio" name="slides" id="i4" checked>
      <input type="radio" name="slides" id="i5" checked>';
  
  
      $images = !empty($anouncement['images']) ? $anouncement['images'] : NULL;
      if($images){
        //boucle sur les images
       echo ' <div class="" id="">';
        foreach( $images as $img ){
  
          echo '<img style="width:150px; height:150px;border-radius:500px; margin-bottom: 60px;" src="'.$img.'">';
  
      
         echo '<label for="i1" class="pre"><</label>
                 <label for="i2" class="nxt">></label>';
      
        }
       echo "</div>";
      }
  
  
        echo  ($anouncement['titre']); 
          echo ($anouncement['presentation']);
         echo($anouncement['prix']);
       echo ($anouncement['ville']);
  
    }
    
  }
else{
  ?>
  Aucun résultat trouvé...
  <?php

}
?>



<br> <br> <br> <br>

<p>Toutes les annonces</p> <br>
<div class="">

<?php foreach($anouncement as $anounce){
  

echo'
  <div class="annoncepub">
    <input type="radio" name="slides" id="i1" checked>
    <input type="radio" name="slides" id="i2" checked>
    <input type="radio" name="slides" id="i3" checked>
    <input type="radio" name="slides" id="i4" checked>
    <input type="radio" name="slides" id="i5" checked>';


    $images = !empty($anounce['images']) ? $anounce['images'] : NULL;
    if($images){
      //boucle sur les images
     echo ' <div class="" id="">';
      foreach( $images as $img ){

        echo '<img style="width:150px; height:150px;border-radius:500px; margin-bottom: 60px;" src="'.$img.'">';

    
       echo '<label for="i1" class="pre"><</label>
               <label for="i2" class="nxt">></label>';
    
      }
     echo "</div>";
    }


      echo  ($anounce['titre']); 
        echo ($anounce['presentation']);
       echo($anounce['prix']);
     echo ($anounce['ville']);

  }
?>


</div>

</body>
</html>



page cmdaffichage.php:
<?php

function afficherAnnonce(){
    global $bdd;
    $res = [];
    $sql = 'SELECT * FROM annonces
      INNER JOIN image_products
      ON annonces.id= image_products.id_product';
      
      
    try{
      $req = $bdd->prepare($sql);
      $req->execute();
      $data = $req->fetchAll(PDO::FETCH_ASSOC);
      //on reconstruit un array mieux organisé pour avoir les photos
      
      foreach($data as $R){
        if(!isset($res[$R['id']])){
         $res[$R['id']] = $R;
         unset($res[$R['id']]['filename_product']);
        }
         $res[$R['id']]['images'][] = $R['filename_product'];                                               
      }
      
    }catch(Exception $e){
        echo "Erreur dans la requête " . $sql;
    }
 // le temps des tests pour voir le résultat
    return $res;
      
  }


?> 

5 réponses

jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705
19 nov. 2021 à 06:55
Bonjour
Commence donc par créer une fonction de recherche sur le même modèle que la fonction : "afficherAnnonce()"

Nb: !empty fait deja le isset.. donc pas besoin d'utiliser les deux

Nb2:. Comme le dit la documentation, il faut éviter d'utiliser la méthode rowcount pour les requêtes de type select

Reviens nous voir avec ta nouvelle fonction si tu as encore des erreurs..
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
19 nov. 2021 à 07:54
Bonjour Jordane,
Les erreurs disparaissent petit à petit. J'ai enlevé le rowcount et le isset. Mais s' il n'y a pas de if rowcount dans ce cas je ne pourrai pas ajouté un else aucun résultat trouvé.

Les erreurs qui apparaissent sont les suivantes:
Notice: Undefined variable: s in C
Fatal error: Uncaught Error: Call to a member function fetch() on null in

dans la page cmdaffichage.php j'ai donc ajouté une autre fonction:
<?php

function afficherAnnonce(){
    global $bdd;
    $res = [];
    $sql = 'SELECT * FROM annonces
      INNER JOIN image_products
      ON annonces.id= image_products.id_product';
      
      
    try{
      $req = $bdd->prepare($sql);
      $req->execute();
      $data = $req->fetchAll(PDO::FETCH_ASSOC);
      //on reconstruit un array mieux organisé pour avoir les photos
      
      foreach($data as $R){
        if(!isset($res[$R['id']])){
         $res[$R['id']] = $R;
         unset($res[$R['id']]['filename_product']);
        }
         $res[$R['id']]['images'][] = $R['filename_product'];                                               
      }
      
    }catch(Exception $e){
        echo "Erreur dans la requête " . $sql;
    }
 // le temps des tests pour voir le résultat
    return $res;
      
  }
  function rechercheAnnonce(){
    global $bdd;
    $q= htmlspecialchars($_GET['q']);
    $res = [];
    $sql = 'SELECT * FROM annonces
      INNER JOIN image_products
      ON annonces.id= image_products.id_product
      WHERE annonces.titre AND annonce.presentation LIKE "%'.$q.'%" ORDER BY id DESC';
      
      
    try{
      $req = $bdd->prepare($sql);
      $req->execute();
      $data = $req->fetchAll(PDO::FETCH_ASSOC);
      //on reconstruit un array mieux organisé pour avoir les photos
      
      foreach($data as $R){
        if(!isset($res[$R['id']])){
         $res[$R['id']] = $R;
         unset($res[$R['id']]['filename_product']);
        }
         $res[$R['id']]['images'][] = $R['filename_product'];                                               
      }
      
    }catch(Exception $e){
        echo "Erreur dans la requête " . $sql;
    }
 // le temps des tests pour voir le résultat
    return $res;
      
  }


?> 



Ensuite dans la page accueil.php, en 1ère ligne, tout en haut:
<?php
 include 'cnx.php';
 include 'cmdaffichage.php';
 $anouncement= afficherAnnonce();
 

if(!empty($_GET['q'])) {
   $q= htmlspecialchars($_GET['q']);
   $search= rechercheAnnonce();

}



?>



et finalement à côté de la barre de recherche:

 <h1>Que recherchez-vous?</h1>
   <input type="search" name="q" placeholder="maison, voiture..." />
   <input type="submit" value="Rechercher" />
</form>
</div>

<?php
  while ($search = $s ->fetch()) {

    echo'
    <div class="annoncepub">
      <input type="radio" name="slides" id="i1" checked>
      <input type="radio" name="slides" id="i2" checked>
      <input type="radio" name="slides" id="i3" checked>
      <input type="radio" name="slides" id="i4" checked>
      <input type="radio" name="slides" id="i5" checked>';
  
  
      $images = !empty($s['images']) ? $s['images'] : NULL;
      if($images){
        //boucle sur les images
       echo ' <div class="" id="">';
        foreach( $images as $img ){
  
          echo '<img style="width:150px; height:150px;border-radius:500px; margin-bottom: 60px;" src="'.$img.'">';
  
      
         echo '<label for="i1" class="pre"><</label>
                 <label for="i2" class="nxt">></label>';
      
        }
       echo "</div>";
      }
  
  
        echo  ($s['titre']); 
          echo ($s['presentation']);
         echo($s['prix']);
       echo ($s['ville']);
  
    }
    
?>
0
jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705
21 nov. 2021 à 22:21

Mais s' il n'y a pas de if rowcount dans ce cas je ne pourrai pas ajouté un else aucun résultat trouvé.


Ta fonction retourne un array avec les résultats.
Si ton array est vide.. c'est qu'il n'y a pas de résultats...

Donc, tu peux toujours faire un IF et utiliser !empty pour vérifier qu'il n'est pas vide.
 $search= rechercheAnnonce();
 if(!empty($search)){
  // boucle pour afficher tes résultats..
   foreach($search as $res){
     // echo ...
   }
}else{
  // aucun résultat
}
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
22 nov. 2021 à 03:49
Bonjour Jordane,
Mais ici ( if(!empty($search))), on ne GET pas le "q" qui est le name de la barre de rechereche :
<h1>Que recherchez-vous?</h1>
   <input type="search" name="q" placeholder="maison, voiture..." />
   <input type="submit" value="Rechercher" />


Et d'ailleurs si on ajoute dans la fonction rechercheAnnonce, ça nous met Notice: Undefined index: q in C:\wamp64\:

function rechercheAnnonce(){
    global $bdd;
    $q= htmlspecialchars($_GET['q']);
    $res = [];
    $sql = 'SELECT * FROM annonces
      INNER JOIN image_products
      ON annonces.id= image_products.id_product
      WHERE annonces.titre LIKE "%'.$q.'%" ORDER BY id DESC';



L'objectif c'est lorsqu'on écrit par exemple "maison" sur la barre de recherche, uniquement les annonces contenant dans leur titre, ou leur description" maison" , celles-ci s'affichent
0
jordane45 Messages postés 38304 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 23 novembre 2024 4 705
22 nov. 2021 à 08:09
Alors perso, je n'aime pas gérer les variables GET ou POST .. dans les fonctions...

Donc :

function rechercheAnnonce($q){
    global $bdd;





$q = !empty($_GET['q']) ? trim($_GET['q']) : null;

if($q){
   $search= rechercheAnnonce($q);
   if(!empty($search)){
    // boucle pour afficher tes résultats..
     foreach($search as $res){
       // echo ...
     }
  }else{
    // aucun résultat
  }
}


PS: la fonction htmlspecialchars sert uniquement pour l'affichage.. en aucun cas pour le "traitement" des variables avant une requête sql.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
22 nov. 2021 à 09:32
ça fonctionne, mais c'est précis. Je veux dire que lorsqu'on tape par exemple "vélos" comme écrit dans un formulaire ça l'affiche, mais si on écrit "velo" ou "velos", ça n'affiche aucun résultat. Y a-t-il un moyen pour les rendre équivalents ?

Et pour insérer la description dans la variable sql qui se trouve dans la fonction rechercheannonce, il ya également une erreur dans la requete, notamment dans la dernière ligne:
$sql = 'SELECT * FROM annonces
      INNER JOIN image_products
      ON annonces.id= image_products.id_product
      WHERE annonces.titre  AND titre.presentation LIKE "%'.$q.'%" ORDER BY id.annonces DESC';
      
0