Erreur de requête dans une fonction PHP
Résolu
max30_3775
Messages postés
178
Date d'inscription
Statut
Membre
Dernière intervention
-
max30_3775 Messages postés 178 Date d'inscription Statut Membre Dernière intervention -
max30_3775 Messages postés 178 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai une erreur de requête concernant ma fonction getsearch. L'objectif c'est que la recherche soit effectuée en fonction de l'id de la catégorie et le texte saisi sur la barre de recherche.
nb:
L'erreur qui est affichée est la suivante:
Erreur dans la requête SELECT A.* ,C.id, C.nom_fr AS nom FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE ...
Voici mon code:
Et pour l'affichage:
J'ai une erreur de requête concernant ma fonction getsearch. L'objectif c'est que la recherche soit effectuée en fonction de l'id de la catégorie et le texte saisi sur la barre de recherche.
nb:
$id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null;
L'erreur qui est affichée est la suivante:
Erreur dans la requête SELECT A.* ,C.id, C.nom_fr AS nom FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE ...
Voici mon code:
function getSearch($q, $id_categorie, $villes){ global $bdd; $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; $res = []; $sql = 'SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS nom FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE (A.titre LIKE "%'.$q.'%" OR nom LIKE "%'.$id_categorie.'%" OR A.ville LIKE "%'.$villes.'%" ) ORDER BY created_date DESC'; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { echo "Erreur dans la requête " . $sql; } // le temps des tests pour voir le résultat return $res; }
Et pour l'affichage:
function recherche($q, $id_categorie, $villes){ $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; $annonces =getSearch($q, $id_categorie, $villes); $images = getImagesAnnonces(); $res = []; foreach ($annonces as $R) { $res[$R['id']] = $R; $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL; if(!empty($imgs)){ foreach($imgs as $I){ $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null; } }else{ $res[$R['id']]['images'] = null; } } return $res; }
Configuration: Windows / Chrome 96.0.4664.93
A voir également:
- Erreur de requête dans une fonction PHP
- Fonction si et - Guide
- Excel remplir automatiquement une cellule en fonction d'une autre ✓ - Forum Excel
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
- Excel : Remplir une cellule en fonction d'une autre ✓ - Forum Excel
- Une erreur de communication est détectée dans le module de sécurité ✓ - Forum TNT / Satellite / Réception
19 réponses
Déjà ....
L'id_categorie .. c'est un ID ( un IDENTIFIANT ici.. NUMERIQUE ! )
Ce n'est pas le "nom" de la catégorie...
Ensuite... il faudrait le message d'erreur COMPLET....
On peut supposer que le souci vient des parenthèses après le WHERE qui n'ont rien à faire là.
Et après... (déjà ton souci précédent... ) .. tu utilises un alias "nom".
Sauf que tu as ce champ dans la table Annonces ET dans la table catégories...
Et pour finir tu veux faire une recherche sur l'un des critères ou tous les critères ??
Commence par réaliser/tester la requête sql DIRECTEMENT dans ta bdd ( via phpmyadmin) AVANT d'essayer de la mettre dans ton code PHP ...
Une fois que tu auras une requête fonctionnelle.. on verra pour la mettre en pratique dans ton code php.
L'id_categorie .. c'est un ID ( un IDENTIFIANT ici.. NUMERIQUE ! )
Ce n'est pas le "nom" de la catégorie...
Ensuite... il faudrait le message d'erreur COMPLET....
On peut supposer que le souci vient des parenthèses après le WHERE qui n'ont rien à faire là.
Et après... (déjà ton souci précédent... ) .. tu utilises un alias "nom".
Sauf que tu as ce champ dans la table Annonces ET dans la table catégories...
Et pour finir tu veux faire une recherche sur l'un des critères ou tous les critères ??
Commence par réaliser/tester la requête sql DIRECTEMENT dans ta bdd ( via phpmyadmin) AVANT d'essayer de la mettre dans ton code PHP ...
Une fois que tu auras une requête fonctionnelle.. on verra pour la mettre en pratique dans ton code php.
Bonjour Jordane,
Dans ma table categories j'ai les champs: id, id_categorieprincipale. nom_fr, nom_en_ nom_es. Pour les nom_ c'est histoire de concaténer grace à $sql_lang, si une langue est choisie. Dans la table Annonces, j'ai peudo, et pas nom.
<<Et pour finir tu veux faire une recherche sur l'un des critères ou tous les critères ??>>
==> Pour le q , ie la saisie de texte dans la barre de recherche sans FORCEMENT qu'un utilisateur choisisse la catégorie, que le texte saisi soit LIKE le titre de l'annonce, OU LA CATEGORIE (car on peut penser que les mots-clés du titre change en fonction de la langue). Donc si ce ce n'est pas like $q, donc like $categorie
<<L'id_categorie .. c'est un ID ( un IDENTIFIANT ici.. NUMERIQUE ! )>>
==> Donc par quoi remplacer
Like % id_categorie?
Dans ma table categories j'ai les champs: id, id_categorieprincipale. nom_fr, nom_en_ nom_es. Pour les nom_ c'est histoire de concaténer grace à $sql_lang, si une langue est choisie. Dans la table Annonces, j'ai peudo, et pas nom.
<<Et pour finir tu veux faire une recherche sur l'un des critères ou tous les critères ??>>
==> Pour le q , ie la saisie de texte dans la barre de recherche sans FORCEMENT qu'un utilisateur choisisse la catégorie, que le texte saisi soit LIKE le titre de l'annonce, OU LA CATEGORIE (car on peut penser que les mots-clés du titre change en fonction de la langue). Donc si ce ce n'est pas like $q, donc like $categorie
<<L'id_categorie .. c'est un ID ( un IDENTIFIANT ici.. NUMERIQUE ! )>>
==> Donc par quoi remplacer
Like % id_categorie?
On ne peut pas remplacer par q, car ça nous donne aucun résultat.
nb: je vais enlever id_categorie, mais c'était juste pour te montrer
<input type="search" name="q" placeholder= Que rechercher vous/> <input type="submit" value="<?php echo $lang['rechercher'];?>" /> </form> </div> <?php $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; if($q || $id_categorie || $villes) { $search= recherche($q, $id_categorie, $villes); if(!empty($search)){ // boucle pour afficher tes résultats.. foreach($search as $rec){ echo' <div class="annoncepub">';
nb: je vais enlever id_categorie, mais c'était juste pour te montrer
ça donne ça.
Apparemment ce n'est pas la même syntaxe.
Apparemment ce n'est pas la même syntaxe.
La requête SQL c'est juste
en remplaçant, bien entendu, les variables PHP qui s'y trouvent par de "vraies" valeurs
SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS nom FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE (A.titre LIKE "%'.$q.'%" OR nom LIKE "%'.$id_categorie.'%" OR A.ville LIKE "%'.$villes.'%" ) ORDER BY created_date DESC';
en remplaçant, bien entendu, les variables PHP qui s'y trouvent par de "vraies" valeurs
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
C'est le "AS nom" qui nous embêtait, et en l'enlevant a n'affiche pas d'erreur
MAIS ça se répercute sur notre fonction get annonces alors qu'elle marche:
SELECT A.* ,C.id, C.nom_'.$sql_lang.' FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%'.$q.'%" OR C.nom_'.$sql_lang.' LIKE "%'.$categorie.'%" OR A.ville LIKE "%'.$villes.'%" ORDER BY created_date DESC;
MAIS ça se répercute sur notre fonction get annonces alors qu'elle marche:
function getAnnnonces(){ global $bdd; $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; $sql = ' SELECT A.* ,C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie ORDER BY A.created_date DESC'; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) {
La requête:
Voici le résultat si on remplace les variables

J'ai appris plein de truc grâce à toi, et je continue à le faire ;)
SELECT A.* ,C.id, C.nom_fr FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%'.vendre.'%" OR nom_fr LIKE "%'.1.'%" OR A.ville LIKE "%'.no.'%" ORDER BY created_date DESC
Voici le résultat si on remplace les variables

J'ai appris plein de truc grâce à toi, et je continue à le faire ;)
Tu y es presque ..
Pour que ta requête soit valide il faut l'écrire comme ceci
Et avec ça ( tu remarques que nom_fr utilises bien le "q" (ici vendre" ) pour la recherche .. et non son ID ..
Pour que ta requête soit valide il faut l'écrire comme ceci
SELECT A.* ,C.id, C.nom_fr FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%vendre%" OR nom_fr LIKE "%vendre%" OR A.ville LIKE "%no%" ORDER BY created_date DESC
Et avec ça ( tu remarques que nom_fr utilises bien le "q" (ici vendre" ) pour la recherche .. et non son ID ..
Oui, j'ai vu. mais on besoin que pour <select de categorie ça recherche l'id (surtout s'il y a des langue)
De plus on a besoin d'un alias pour nom_$sql_lang du genre CATEGORIE afin de faire:
"%LIKE $categorie%". Un utilisateur peut choisir une caégorie sans saisir du texte dans la barre de recherche.
De plus on a besoin d'un alias pour nom_$sql_lang du genre CATEGORIE afin de faire:
CATEGORIE LIKE "%vendre%"
Si dans ton formulaire de recherche que tu ne nous as pas montré au passage... Tu as une liste déroulante contenant la liste de tes catégories il faut bien rechercher sur son id et donc par o par rapport au champ id_categorie de ta table annonce et en aucun cas sur son libellé tel que tu as essayé de le faire
Es--ce que a veut dire de passer en méthode POST, on fait
Et par la suite dans notre liste déroulante à laquelle on attribue une variable qui sera aussi égale à
Et à la fin on fait comme ça:
En poste on peut récupérer les images, car en GET, aucune image n'est téléchargée
$id_categorie= trim($_POST['categorie']);
Et par la suite dans notre liste déroulante à laquelle on attribue une variable qui sera aussi égale à
($_POST['categorie']).
Et à la fin on fait comme ça:
<?php $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $variable à donner= trim($_POST['categorie']);; $villes= ($_POST['ville']) ; if($q || $variable à donner || $villes) { $search= recherche($q, $variable à donner, $villes); if(!empty($search)){ // boucle pour afficher tes résultats.. foreach($search as $rec){ echo' <div class="annoncepub">'; //etc....
En poste on peut récupérer les images, car en GET, aucune image n'est téléchargée
POST ou GET sont des méthodes de transmission des données ....
Soit tu envoies les données de ton formulaire en POST ... soit tu les envoies en GET
Pour le reste .. je n'ai rien compris à ton charabia .....
En plus.. que vient faire ici l'envoie de photo dans un formulaire de recherche ???
Pourquoi essayes tu de mélanger du POST et du GET dans la récupération des "variables" ?
Essaye de clarifier les choses dans ta tête avant de revenir nous poser des questions.. car pour l'instant on ne comprend pas ce que tu veux faire ni sur quoi tu bloques... (hormis le fait qu'une formation sur les bases du langages ne serait pas négligeable te concernant... mais ce n'est pas notre rôle...)
Soit tu envoies les données de ton formulaire en POST ... soit tu les envoies en GET
Pour le reste .. je n'ai rien compris à ton charabia .....
En plus.. que vient faire ici l'envoie de photo dans un formulaire de recherche ???
Pourquoi essayes tu de mélanger du POST et du GET dans la récupération des "variables" ?
Essaye de clarifier les choses dans ta tête avant de revenir nous poser des questions.. car pour l'instant on ne comprend pas ce que tu veux faire ni sur quoi tu bloques... (hormis le fait qu'une formation sur les bases du langages ne serait pas négligeable te concernant... mais ce n'est pas notre rôle...)
Je pense être plus clair cette fois-ci. En dehors de l'aspect esthétique.
D'une part nous avons un formulaire dans la page formulaire:


Dont le code que tu connais bien pour INSERER EN BDD est le suivant:
nb: $id_categorie= trim($_POST['categorie']); on n'a aucun problème ici. Le formulaire est soumis correctement
La page du formulaire en POST:
ET D'AUTRE PART Là où nous avons es ERREURS.
Maintenant la page d'accueil en photo, dans laquelle nous avons une barre de recherche où l'utilisateur peut CHOISIR la catégorie sans taper du texte:

Son code dans la page accueil:
La commande qui permet d'afficher les résultats de la recherche. ET DONC ON PEUT PAS FAIRE LA RECHERCHE A PARTIR DE LA LISTE DEROULANTE EN NOUS BASANT SUR L'ID DE LA CATEGORIE : NOTRE PROBLEME.
D'une part nous avons un formulaire dans la page formulaire:


Dont le code que tu connais bien pour INSERER EN BDD est le suivant:
nb: $id_categorie= trim($_POST['categorie']); on n'a aucun problème ici. Le formulaire est soumis correctement
<?php function savePhoto($id_annonce,$file,$location){ if(empty($file)){ echo "<br> ERREUR : Aucune image n'est envoyées pour l'upload"; var_dump($_FILES); // juste pour le debug... return false; //pas d'image } $photo = $file['name']; $photo_tmp = $file['tmp_name']; if(move_uploaded_file($photo_tmp,$location.$photo)){ return insertPhoto($id_annonce,$location.$photo); // tu peux retirer le location si tu ne veux que le nom de l'image et pas son chemin complet } } function insertPhoto($id_annonce,$photo){ global $bdd; $sql= "INSERT INTO images_annonces(id_annonce,filepath) VALUES(?,?)"; $datas= array($id_annonce,$photo); //Execution de la requete try{ //Execution pour la deuxième table $requete2 = $bdd -> prepare($sql) ; return $requete2->execute($datas) ; }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " Les datas : " ; print_r($datas); } } //Requete 1 function insertAnnonce($created_by_member,$id_categorie,$pseudo,$telephone,$email,$villes,$titre,$description,$prix){ global $bdd; $sql= "INSERT INTO annonces(created_by_member,id_categorie,pseudo,telephone,email,ville,titre,description,prix) VALUES(?,?,?,?,?,?,?,?,?)"; $datas= array($created_by_member,$id_categorie,$pseudo,$telephone,$email,$villes,$titre,$description,$prix); //Execution de la requete try{ //requete pour la première tabels $requete = $bdd->prepare($sql); $requete->execute($datas); return $bdd->LastInsertId(); }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); echo " Les datas : " ; print_r($datas); return false; } } function getSouscategories(){ global $bdd; $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; // on s'assure que la langue est correcte $sql= "SELECT id , nom_".$sql_lang." AS nom FROM categories ORDER BY id "; try{ $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_ASSOC); }catch(Exception $e){ echo "Erreur dans la requête " . $sql; $res = false; } return $res; } //----------------------------------------------------------// // CONSTANTES ou variables pour le paramétrage.. //----------------------------------------------------------// $location= "pictures/"; //----------------------------------------------------------// // Traitement du submit //----------------------------------------------------------// if(isset($_POST['formannonce'])) { if(isset($_SESSION['id']) && !empty($_SESSION['id'])){ $created_by_member=1; $pseudo=$_SESSION['pseudo']; $telephone= $_SESSION['telephone']; $email= $_SESSION['email']; } else { $pseudo = trim($_POST['pseudo']); $telephone= intval($_POST['telephone']); $email = trim($_POST['email']); $created_by_member=0; } $villes= trim($_POST['ville']); $titre = trim($_POST['titre']); $prix= intval($_POST['prix']); $description= trim($_POST['description']); $id_categorie= trim($_POST['categorie']); $img1 = ($_FILES['img1']); $img2 = ($_FILES['img2']); $img3 = ($_FILES['img3']); $img4 = ($_FILES['img4']); $img5 = ($_FILES['img5']); //on créé l'annonce $id_annonce = insertAnnonce($created_by_member,$id_categorie,$pseudo,$telephone,$email,$villes,$titre,$description,$prix); // si on a bien un id_product, on upload et insère les images if(!empty($id_annonce)){ savePhoto($id_annonce,$img1,$location); savePhoto($id_annonce,$img2,$location); savePhoto($id_annonce,$img3,$location); savePhoto($id_annonce,$img4,$location); savePhoto($id_annonce,$img5,$location); echo"<h1 style= 'color: green; background-color: white; margin-top: 120px;'>Votre annonce a bien été déposée et sera publiée bientôt. </h1>"; }else{ echo "Erreur : Aucun ID n'a été créé !"; } } ?>
La page du formulaire en POST:
div class= "pub"> <form action="" method="POST" enctype="multipart/form-data"> <fieldset> <p><?php echo $lang['dva'];?></p> <?php if(isset($_SESSION['id'])){ ?> <label for= "pseudo"><?php echo $_SESSION['pseudo'];?></label> <?php } else {?> <label for= "nompseudo"><?php echo $lang['pseudo'];?></label> <input type="text" id="pseudo" name="pseudo"> <?php } ?> <br> <br> <label for="categorieannonce"><?php echo $lang['ca'];?></label> <select name="categorie"> <option value="" disabled selected><?php echo $lang['categorie'];?></option> <?php foreach($categories as $C){ echo "<option value='".$C['id']."'>".$C['nom']."</option>"; } ?> </select> </select> <br> <br> <label for="ville"><?php echo $lang['ville'];?></label> <select name="ville"> <option value="" disabled selected><?php echo $lang['ville'];?></option> <option value= "1"> ville 1</option> <option value= "2"> ville 2</option> </select> <br> <br> <label for= "titre"><?php echo $lang['tva'];?></label> <input type="text" id="titre" name="titre"> <br> <br> <label for= "description"><?php echo $lang['description'];?></label> <textarea id="description" name="description" rows="4" cols="50"> </textarea> <br> <br> <br> <br> <label for= "prix"><?php echo $lang['prix'];?></label> <input type="number" id="prix" name="prix"> <br> <br> <?php if(isset($_SESSION['id'])){ ?> <label for= "telephone"><?php echo $_SESSION['telephone'];?></label><br><br> <?php } else {?> <label for="telephone"><?php echo $lang['phoneclient'];?></label><br><br> <input type="tel" id="phone" name="telephone"> <br> <br> <?php } ?> <?php if(isset($_SESSION['id'])){ ?> <label for= "email"><?php echo $_SESSION['email'];?> </label> <br><br> <?php } else {?> <label for= "email"><?php echo $lang['emailclient'];?> </label> <input type="email" id="email" name="email" /> <br> <br> <?php } ?> <label for= "image"><?php echo $lang['photo1'];?></label> <input type="file" id="img1" name="img1" accept="image/png, image/jpeg, image/jpg" > <br><br> <label for= "image"><?php echo $lang['photo2'];?></label> <input type="file" id="img2" name="img2" accept="image/png, image/jpeg, image/jpg"><br><br> <label for= "image"><?php echo $lang['photo3'];?></label> <input type="file" id="img3" name="img3" accept="image/png, image/jpeg, image/jpg"> <br><br> <label for= "image"><?php echo $lang['photo4'];?></label> <input type="file" id="img4" name="img4" accept="image/png, image/jpeg, image/jpg"> <br><br> <label for= "image"><?php echo $lang['photo5'];?></label> <input type="file" id="img5" name="img5" accept="image/png, image/jpeg, image/jpg"> <br><br> <br> <br> <input type="submit" id='submit' name="formannonce" value='<?php echo $lang['valider'];?>' > </form> </fieldset> </div> </body> </html>
ET D'AUTRE PART Là où nous avons es ERREURS.
Maintenant la page d'accueil en photo, dans laquelle nous avons une barre de recherche où l'utilisateur peut CHOISIR la catégorie sans taper du texte:

Son code dans la page accueil:
<div id="searchbar"> <form method="GET"> <h1><?php echo $lang['qrv'];?></h1> <select name="categorie"> <option value="" disabled selected><?php echo $lang['categorie'];?></option> <?php foreach($categories as $C){ echo "<option value='".$C['id']."'>".$C['nom']."</option>"; } ?> </select> <input type="search" name="q" placeholder=<?php echo $lang['placeholder'];?>/> <select name="villes"> <option value="" disabled selected><?php echo $lang['ville'];?></option> <option value= "1t"> ville 1</option> <option value= "2"> ville 2</option> </select> <input type="submit" value="<?php echo $lang['rechercher'];?>" /> </form> </div>
La commande qui permet d'afficher les résultats de la recherche. ET DONC ON PEUT PAS FAIRE LA RECHERCHE A PARTIR DE LA LISTE DEROULANTE EN NOUS BASANT SUR L'ID DE LA CATEGORIE : NOTRE PROBLEME.
function getImagesAnnonces(){ global $bdd; $sql = "SELECT id_annonce,filepath as IMG FROM images_annonces ORDER BY id_annonce DESC"; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_GROUP); } catch (Exception $e) { echo "Erreur dans la requête " . $sql; } // le temps des tests pour voir le résultat return $res; } function getSearch($q, $categorie, $villes){ global $bdd; $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; $res = []; $sql = 'SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE (A.titre LIKE "%'.$q.'%" AND CATEGORIE LIKE "%'.$categorie.'%" AND A.ville LIKE "%'.$villes.'%" ) ORDER BY created_date DESC'; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { echo "Erreur dans la requête " . $sql; } // le temps des tests pour voir le résultat return $res; } function recherche($q, $categorie, $villes){ $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $categorie= isset($_GET['CATEGORIE'])? trim($_GET['CATEGORIE']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; $annonces =getSearch($q, $categorie, $villes); $images = getImagesAnnonces(); $res = []; foreach ($annonces as $R) { $res[$R['id']] = $R; $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL; if(!empty($imgs)){ foreach($imgs as $I){ $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null; } }else{ $res[$R['id']]['images'] = null; } } return $res; }
<?php $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $categorie= isset($_GET['CATEGORIE'])? trim($_GET['CATEGORIE']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; if($q || $categorie || $villes) { $search= recherche($q, $categorie, $villes); if(!empty($search)){ // boucle pour afficher tes résultats.. foreach($search as $rec){ echo' <div class="annoncepub">'; $images = !empty($rec['images']) ? $rec['images'] : ['/no_image.png']; // array if (!empty($images)) { //boucle sur les images echo'<div class="container">'; echo ' <div class="slider" >'; foreach ($images as $img) { echo '<img class ="active" style="width:90px; height:90px;" src="' . $img . '">'; } echo "</div>"; // fin div slider . echo '<div class="cont-btn" >'; echo ' <div class="btn-nav left" > <'; echo " </div>"; echo ' <div class="btn-nav right" > >'; echo " </div>"; echo "</div>"; echo "</div>"; // fin div container } echo "<span class='category'>" .$rec['CATEGORIE'] . "</span>"; echo "<span class='title'>" .$rec['titre'] . "</span>"; echo "<span class='comment'>" .$rec['description'] . "</span>"; echo "<span class='price'>" .$rec['prix'] . "</span>"; echo "<span class='date'>" . $rec['created_date'] . "</span>"; echo "</div>"; // fin div annoncepubs } }else{ echo "Aucun résultat pour votre recherche..."; } } ?>
Donc,
Ton champ dans le formulaire, pour les catégories se nomme categorie
Dans, dans ta variable GET, tu dois utiliser le "name" de ton champ.
Ensuite,
Pour ta recherche, tu dois cibler l'id de la catégorie ET un like sur le "q" ET l'id de la ville
Pour la ville, j'ai considéré (vu que ta liste contient des valeurs numériques) que comme pour les catégorie, tu enregistres bien l' ID dans la table annonce et pas le "nom" de la ville au format textuel.
Ton champ dans le formulaire, pour les catégories se nomme categorie
<select name="categorie">
Dans, dans ta variable GET, tu dois utiliser le "name" de ton champ.
Ensuite,
Pour ta recherche, tu dois cibler l'id de la catégorie ET un like sur le "q" ET l'id de la ville
$sql = 'SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%'.$q.'%" AND A.id_categorie = "'.$categorie.'" AND A.ville = "'.$villes.'" ORDER BY created_date DESC';
Pour la ville, j'ai considéré (vu que ta liste contient des valeurs numériques) que comme pour les catégorie, tu enregistres bien l' ID dans la table annonce et pas le "nom" de la ville au format textuel.
On y est presque:
1-quand on choisit dans notre liste une catégorie et qu'on valide, elle ne les affiche pas toutes. Exemple: on recherche une maison, c'est la dernière maison publiée qui va apparaitre dans notre recherche.
2-quand on choisit dans notre liste une catégorie et qu'on valide, c'est l'image d'une autre annonce qui apparait. Voir photo:

3-quand on saisit un texte dans la barre de recherche, nous avons toujours: AUCUN RESULTAT...
le q ne marche pas.
Voici le code:
Page des commandes:
Page d'affichage.
1-quand on choisit dans notre liste une catégorie et qu'on valide, elle ne les affiche pas toutes. Exemple: on recherche une maison, c'est la dernière maison publiée qui va apparaitre dans notre recherche.
2-quand on choisit dans notre liste une catégorie et qu'on valide, c'est l'image d'une autre annonce qui apparait. Voir photo:

3-quand on saisit un texte dans la barre de recherche, nous avons toujours: AUCUN RESULTAT...
le q ne marche pas.
Voici le code:
Page des commandes:
function getSearch($q, $categorie, $villes){ global $bdd; $sql_lang = (!empty(($_SESSION['lang']) && in_array($_SESSION['lang'], ['fr','en','es']) ))? $_SESSION['lang'] : 'fr'; $res = []; $sql = 'SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%'.$q.'%" AND A.id_categorie = "'.$categorie.'" AND A.ville = "'.$villes.'" ORDER BY created_date DESC'; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { echo "Erreur dans la requête " . $sql; } // le temps des tests pour voir le résultat return $res; } function recherche($q, $categorie, $villes){ $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; $annonces =getSearch($q, $categorie, $villes); $images = getImagesAnnonces(); $res = []; foreach ($annonces as $R) { $res[$R['id']] = $R; $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL; if(!empty($imgs)){ foreach($imgs as $I){ $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null; } }else{ $res[$R['id']]['images'] = null; } } return $res; }
Page d'affichage.
<?php $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; if($q || $categorie || $villes) { $search= recherche($q, $categorie, $villes); if(!empty($search)){ // boucle pour afficher tes résultats.. foreach($search as $rec){ echo' <div class="annoncepub">'; $images = !empty($rec['images']) ? $rec['images'] : ['/no_image.png']; // array if (!empty($images)) { //boucle sur les images echo'<div class="container">'; echo ' <div class="slider" >'; foreach ($images as $img) { echo '<img class ="active" style="width:90px; height:90px;" src="' . $img . '">'; } echo "</div>"; // fin div slider . echo '<div class="cont-btn" >'; echo ' <div class="btn-nav left" > <'; echo " </div>"; echo ' <div class="btn-nav right" > >'; echo " </div>"; echo "</div>"; echo "</div>"; // fin div container } echo "<span class='category'>" .$rec['CATEGORIE'] . "</span>"; echo "<span class='title'>" .$rec['titre'] . "</span>"; echo "<span class='comment'>" .$rec['description'] . "</span>"; echo "<span class='price'>" .$rec['prix'] . "</span>"; echo "<span class='date'>" . $rec['created_date'] . "</span>"; echo "</div>"; // fin div annoncepubs } }else{ echo "Aucun résultat pour votre recherche..."; } } ?>
Si tu veux dire ajouter la requête dans php myadmin pour voir ce que ça donne, voilà:

Sinon où faudrait-il echo $sql?
SELECT A.* ,C.id, C.nom_fr FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%'maison'%" AND A.id_categorie = 1 AND A.ville = 1 ORDER BY created_date DESC

Sinon où faudrait-il echo $sql?
Là tu n'as pas fait le echo de la requête.
Tu as juste essayé de remplacer les variables php dedans (mais en faisant des erreurs ... )
Donc, commence par faire ça
lances ta recherche, copie le résultat du echo dans phpmyadmin et regarde si ça retourne des résultats....
Tu as juste essayé de remplacer les variables php dedans (mais en faisant des erreurs ... )
Donc, commence par faire ça
$sql = 'SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%'.$q.'%" AND A.id_categorie = "'.$categorie.'" AND A.ville = "'.$villes.'" ORDER BY created_date DESC'; echo $sql; try { $req = $bdd->prepare($sql); $req->execute(); $res = $req->fetchAll(PDO::FETCH_ASSOC); } catch (Exception $e) { echo "Erreur dans la requête " . $sql; }
lances ta recherche, copie le résultat du echo dans phpmyadmin et regarde si ça retourne des résultats....
Quand on choisit une catégorie, ça nous affiche tous les résultats en bdd.
Ce que a donne en bdd:

Mais 1 seul résultat sur la page d'affichage. Ce que a donne sur la page d'affichage:
Pour le q, la requête est correcte, mais rien ne s'affiche en bdd, et "Aucun resultat" dans la page d'affichage.
SELECT A.* ,C.id, C.nom_fr AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%%" AND A.id_categorie = "1" AND A.ville ="" ORDER BY created_date DESC
Ce que a donne en bdd:

Mais 1 seul résultat sur la page d'affichage. Ce que a donne sur la page d'affichage:

Pour le q, la requête est correcte, mais rien ne s'affiche en bdd, et "Aucun resultat" dans la page d'affichage.
Et bien allons-y par étape ...
Fais des var_dump de tes variables dans ta fonction et regarde ce que ça retourne ...
par exemple
En faisant ça, tu devrais constater que la valeur de l'ID qui est retourné .. est celui de la catégorie et non celui de l'annonce...
En fait, dans la capture écran que tu nous montres.. on voit bien que tu as deux fois un champ portant le même nom .. et ça .. php ne sait pas faire la différence...
Il faut que tu retires le
Mais bon, la valeur de ce champ se trouve déjà dans la table annonce : A.id_categorie .. ça ne sert donc à rien de le remettre....
Fais des var_dump de tes variables dans ta fonction et regarde ce que ça retourne ...
par exemple
function recherche($q, $categorie, $villes){ /** INUTILE PUISQUE TU LES PASSE EN PARAMETRES DE TA FONCTION !!!! $q = !empty($_GET['q']) ? trim($_GET['q']) : null; $categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null; $villes= isset($_GET['villes'])? trim($_GET['villes']) : null ; */ $annonces = getSearch($q, $categorie, $villes); $images = getImagesAnnonces(); //le temps des tests : echo "<pre> Annonces : <br>" ; var_dump($annonces); echo "<br> Images : <br>" ; var_dump($images); echo "</pre>"; $res = []; foreach ($annonces as $R) { $res[$R['id']] = $R; $imgs = !empty($images[$R['id']]) ? $images[$R['id']] : NULL; if(!empty($imgs)){ foreach($imgs as $I){ $res[$R['id']]['images'][] = !empty($I['IMG']) ? $I['IMG'] : null; } }else{ $res[$R['id']]['images'] = null; } } //le temps des tests : echo "<pre> res: <br>" ; var_dump($res); echo "</pre>"; return $res; }
En faisant ça, tu devrais constater que la valeur de l'ID qui est retourné .. est celui de la catégorie et non celui de l'annonce...
En fait, dans la capture écran que tu nous montres.. on voit bien que tu as deux fois un champ portant le même nom .. et ça .. php ne sait pas faire la différence...
Il faut que tu retires le
,C.idde ta requête ... ou que tu lui mettes un alias.
Mais bon, la valeur de ce champ se trouve déjà dans la table annonce : A.id_categorie .. ça ne sert donc à rien de le remettre....
En enlevant l' id comme tu as dit, ça marche bien. Les annonces d'une catégorie choisie s'affichent.
en var dump:
Mais quand on saisi du texte sur la barre de recherche, on n'a rien.
Résultat du var_dump quand on saisi du texte:
en var dump:
C:\wamp64\www\Projetsite\cmdaffichage.php:98: array (size=1) 0 => array (size=12) 'id' => string '3' (length=1) 'created_by_member' => string '0' (length=1) 'id_categorie' => string '10' (length=2) 'pseudo' => string 'essai3' (length=6) 'telephone' => string '22368' (length=5) 'email' => string 'essai3@g.fr' (length=11) 'ville' => string '' (length=0) 'titre' => string 'Vélos pour vendre' (length=18) 'description' => string 'Appelez.' (length=8) 'prix' => string '415' (length=3) 'created_date' => string '2021-12-15' (length=10) 'CATEGORIE' => string 'velos' (length=5) Images : C:\wamp64\www\Projetsite\cmdaffichage.php:100: array (size=5) 6 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/maison.jpg' (length=19) 4 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/maison.jpg' (length=19) 3 => array (size=2) 0 => array (size=1) 'IMG' => string 'pictures/velo1.jpg' (length=18) 1 => array (size=1) 'IMG' => string 'pictures/velo2.jpg' (length=18) 2 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/moto2.jpg' (length=18) 1 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/maison5.jpg' (length=20) res: C:\wamp64\www\Projetsite\cmdaffichage.php:120: array (size=1) 3 => array (size=13) 'id' => string '3' (length=1) 'created_by_member' => string '0' (length=1) 'id_categorie' => string '10' (length=2) 'pseudo' => string 'essai3' (length=6) 'telephone' => string '22368' (length=5) 'email' => string 'essai3@g.fr' (length=11) 'ville' => string '' (length=0) 'titre' => string 'Vélos pour vendre' (length=18) 'description' => string 'Appelez.' (length=8) 'prix' => string '415' (length=3) 'created_date' => string '2021-12-15' (length=10) 'CATEGORIE' => string 'velos' (length=5) 'images' => array (size=2) 0 => string 'pictures/velo1.jpg' (length=18) 1 => string 'pictures/velo2.jpg' (length=18)
Mais quand on saisi du texte sur la barre de recherche, on n'a rien.
Résultat du var_dump quand on saisi du texte:
C:\wamp64\www\Projetsite\cmdaffichage.php:98: array (size=0) empty Images : C:\wamp64\www\Projetsite\cmdaffichage.php:100: array (size=5) 6 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/maison.jpg' (length=19) 4 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/maison.jpg' (length=19) 3 => array (size=2) 0 => array (size=1) 'IMG' => string 'pictures/velo1.jpg' (length=18) 1 => array (size=1) 'IMG' => string 'pictures/velo2.jpg' (length=18) 2 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/moto2.jpg' (length=18) 1 => array (size=1) 0 => array (size=1) 'IMG' => string 'pictures/maison5.jpg' (length=20) res: C:\wamp64\www\Projetsite\cmdaffichage.php:120: array (size=0) empty Aucun résultat pour votre recherche...
En testant sur phpmyadmin:
Nous obtenons un bdd vide:
MySQL a retourné un résultat vide (c'est à dire aucune ligne). (traitement en 0,0328 seconde(s).)
SELECT A.* ,C.nom_fr AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE A.titre LIKE "%maison%" AND A.id_categorie = "" AND A.ville LIKE "" ORDER BY created_date DESC
Nous obtenons un bdd vide:
MySQL a retourné un résultat vide (c'est à dire aucune ligne). (traitement en 0,0328 seconde(s).)
Bonjour,
Je pense que je l'ai bien fait dans la page d'affichage
Où faut-il inclure un if dans une requête sql contenant des left join, des where, AND... ?
Je pense que je l'ai bien fait dans la page d'affichage
$q = !empty($_GET['q']) ? trim($_GET['q']) : null; $categorie= !empty($_GET['categorie'])? trim($_GET['categorie']) : null; $villes= !empty($_GET['villes'])? trim($_GET['villes']) : null ; if($q || $categorie || $villes) { $search= recherche($q, $categorie, $villes);
Où faut-il inclure un if dans une requête sql contenant des left join, des where, AND... ?
je te parle de la requête sql ( autrmeent dit .. le contenu de ta variable $sql )
Et oui, il va falloir ajouter des IF ..
par exemple
Et oui, il va falloir ajouter des IF ..
par exemple
$sql = 'SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE 1 = 1 '; //pour le ttire if(!empty($q)){ $sql .= " AND A.titre LIKE "%'.$q.'%" "; } // Faire pareil pour les deux autres condtitions //--- //on fini par ajouter le order by $sql .= " ORDER BY created_date DESC" ;
ça m'affiche les erreurs suivantes:
Warning: A non-numeric value encountered in C
Fatal error: Uncaught DivisionByZeroError: Modulo by zero in C
Warning: A non-numeric value encountered in C
Fatal error: Uncaught DivisionByZeroError: Modulo by zero in C
$sql = "SELECT A.* ,C.id, C.nom_'.$sql_lang.' AS CATEGORIE FROM annonces A LEFT JOIN categories C ON C.id = A.id_categorie WHERE 1 = 1 "; //pour le ttire if(!empty($q)){ $sql .= " AND A.titre LIKE "%'.$q.'%" "; } if(!empty($categorie)){ $sql .= " AND A.id_categorie = '.$categorie.' "; } if(!empty($villes)){ $sql .= " AND A.ville= '.$villes.' "; } //on fini par ajouter le order by $sql .= " ORDER BY created_date DESC" ;
Tout marche bien. Peut-on en saisissant du texte dans la barre de recherche en anglais par exemple, et que ce mot n'a pas une annonce en anglais, que la recherche soit effectuée grâce à la catégorie?
Exemple, je tape sur la barre de recherche "cars", sauf que que les annonces de celles-ci sont en français dans la catégorie voitures. Est-ce possible de les faire apparaitre, si on a nom_sql_lang AS CATEGORIE?
Exemple, je tape sur la barre de recherche "cars", sauf que que les annonces de celles-ci sont en français dans la catégorie voitures. Est-ce possible de les faire apparaitre, si on a nom_sql_lang AS CATEGORIE?
Je ne suis pas sûr d'avoir compris ce que tu as essayé d'écrire.....
Mais j'ai l'impression que tu aimerais pouvoir rechercher également par rapport au nom de la catégorie.
EDIT : Ajout de parenthèse pour prioriser si jamais tu as les autres condtions dans ta requete
Mais j'ai l'impression que tu aimerais pouvoir rechercher également par rapport au nom de la catégorie.
$sql .= " AND ( A.titre LIKE '%".$q."%' OR C.nom_".$sql_lang." LIKE '%".$q."% )"' ;
EDIT : Ajout de parenthèse pour prioriser si jamais tu as les autres condtions dans ta requete