Erreur de requête dans une fonction PHP

Résolu/Fermé
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 14 déc. 2021 à 15:58
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - 16 déc. 2021 à 22:08
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:
$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:

19 réponses

jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 déc. 2021 à 16:52
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.



0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
14 déc. 2021 à 17:12
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?
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 déc. 2021 à 18:00
ben par q
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 14 déc. 2021 à 18:50
On ne peut pas remplacer par q, car ça nous donne aucun résultat.
<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
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 déc. 2021 à 18:58
Je recommence une fois de plus.....
As-tu tester la requête directement dans phpmyadmin ?????
Qu'est-ce que ça te donne ???
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 14 déc. 2021 à 19:23
ça donne ça.

Apparemment ce n'est pas la même syntaxe.
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
14 déc. 2021 à 19:24
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705 > max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
14 déc. 2021 à 19:31
La requête SQL c'est juste
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
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
Modifié le 14 déc. 2021 à 19:55
C'est le "AS nom" qui nous embêtait, et en l'enlevant a n'affiche pas d'erreur
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) {
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 déc. 2021 à 20:33
Quelle requête SQL as tu testé dans phpmyadmin ( après y avoir remplacé les variables php par de vraies valeurs ???? )
Tu ne m'as toujours pas montré le résultat ...

Comprends tu ce que j'écrit au moins ?
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
14 déc. 2021 à 20:46
La requête:
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 ;)
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 déc. 2021 à 20:48
Tu y es presque ..
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 ..
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 14 déc. 2021 à 21:10
Oui, j'ai vu. mais on besoin que pour <select de categorie ça recherche l'id (surtout s'il y a des langue)
"%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%"
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
14 déc. 2021 à 21:41
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
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 15 déc. 2021 à 15:19
Es--ce que a veut dire de passer en méthode POST, on fait
$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
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 déc. 2021 à 16:04
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...)
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 15 déc. 2021 à 17:22
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
<?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...";
 }
}
?>
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 déc. 2021 à 17:24
Donc,
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.
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
15 déc. 2021 à 20:13
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:

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...";
 }
}
?>
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 déc. 2021 à 20:58
Fais un echo de la variable $sql
Et une fois que tu auras récupéré la requête qui est généré, tu est là dans phpmyadmin et dis-nous si tu obtiens des résultats
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
15 déc. 2021 à 21:18
Si tu veux dire ajouter la requête dans php myadmin pour voir ce que ça donne, voilà:
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?
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 déc. 2021 à 21:48
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


 $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....
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 15 déc. 2021 à 22:13
Quand on choisit une catégorie, ça nous affiche tous les résultats en bdd.
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.
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 déc. 2021 à 23:22
Et bien allons-y par étape ...
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.id
de 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....
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 15 déc. 2021 à 23:38
En enlevant l' id comme tu as dit, ça marche bien. Les annonces d'une catégorie choisie s'affichent.
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...
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 déc. 2021 à 23:45
Refais un écho de la variable SQL et teste la dans phpmyadmin...
Combien de fois vais-je devoir te le dire ?
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
15 déc. 2021 à 23:53
En testant sur phpmyadmin:
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).)
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
16 déc. 2021 à 00:00
Ben oui visiblement tu n'as sélectionner aucune catégorie ni aucune ville..
Il faudrait construire ta requête SQL en fonction des critères de recherche que tu envoies ou non.
En gros, le mettre la condition sur la catégorie que si ta variable n'est pas vide.
Idem pour la ville ou pour le texte
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
16 déc. 2021 à 15:44
Bonjour,
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... ?
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 16 déc. 2021 à 17:10
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
 $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" ;

0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
16 déc. 2021 à 19:34
ça m'affiche les erreurs suivantes:
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" ;
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 16 déc. 2021 à 20:45
J'ai fait une inversion de guillemets
 $sql .= " AND  A.titre LIKE '%".$q."%"' ";


Et toi tu t'es planté sur la première
 $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  ';
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
16 déc. 2021 à 21:32
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?
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié le 16 déc. 2021 à 22:23
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.

$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
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
16 déc. 2021 à 22:08
Excellent!!!! Pas de qualificatif :) Merci pour tout Super Jordane, et surtout pour ta patience :). Bien à toi :)
0