Barre de recherche n'affiche rien
max30_3775
Messages postés
185
Statut
Membre
-
max30_3775 Messages postés 185 Statut Membre -
max30_3775 Messages postés 185 Statut Membre -
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:
page cmdaffichage.php:
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;
}
?>
A voir également:
- Barre de recherche n'affiche rien
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Windows 11 barre des taches a gauche - Guide
- Rechercher ou entrer l'adresse mm - recherche google - Guide
- Barre de défilement - Guide
- Barré whatsapp - Guide
5 réponses
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..
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..
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:
Ensuite dans la page accueil.php, en 1ère ligne, tout en haut:
et finalement à côté de la barre de recherche:
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']);
}
?>
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
}
Bonjour Jordane,
Mais ici ( if(!empty($search))), on ne GET pas le "q" qui est le name de la barre de rechereche :
Et d'ailleurs si on ajoute dans la fonction rechercheAnnonce, ça nous met Notice: Undefined index: q in C:\wamp64\:
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
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
Alors perso, je n'aime pas gérer les variables GET ou POST .. dans les fonctions...
Donc :
PS: la fonction htmlspecialchars sert uniquement pour l'affichage.. en aucun cas pour le "traitement" des variables avant une requête sql.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ç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:
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';