Des images qui font répéter le nombre de publication

Résolu/Fermé
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022 - Modifié le 8 déc. 2021 à 13:34
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 - 13 déc. 2021 à 20:54
Bonjour,
J'ai mes annonces qui se répètent selon le nombre d'images présentes dans une annonce donnée, et celà depuis que j'ai changé mes tables. Au départ j'avais 2 tables, maintenant j'en ai 4.
Pour éviter également des soucis de requête plus tard, je voudrais ajouter une image par défaut s'il y en a pas une.


Dans le code ça donne ça:
function afficherAnnonce(){
    global $bdd;
    $res = [];
   $sql=' SELECT  A.*
   ,C.*
   ,I.*
FROM annonces A
LEFT JOIN categories C ON C.id = A.id_categorie
INNER JOIN images_annonces I ON A.id= I.id_annonce
ORDER BY created_date 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']]['filepath']);
        }
         $res[$R['id']]['images'][] = $R['filepath'];                                               
      }
      
    }catch(Exception $e){
        echo "Erreur dans la requête " . $sql;
    }
 // le temps des tests pour voir le résultat
    return $res;
      
  }


Configuration: Windows / Chrome 96.0.4664.45

28 réponses

max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
10 déc. 2021 à 18:13
Ok, j'ai compris. Cela a marché. Mais il reste la deuxième partie concernant la catégorie: ça vient pas. On a :
 $categorie= isset($_GET['CATEGORIE'])? trim($_GET['CATEGORIE']) : null;
Et comme tu sais on ne peut pas mettre = POST['categorie'] car ça renvoie vers les id ajoutés dans les options values.

De plus le LIKE ne fait pas sortir les mots qui se ressemblent. Par exemple si on tape telephone et que l'utilisateur a écrit téléphone, ça ne passe pas. Y a t-il un moyen dans notre requête de faire:
A.titre LIKE "%'.$q.'%"  OR  A.titre LIKE "%'.$categorie.'%"  
comme ça boucle la barre de recherche

J'ai fait ainsi pour que ça marche
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;
  }
:
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 688
10 déc. 2021 à 18:52
Fais un var_dump de $_GET et regarde les variables disponibles avec leur NOM ...
Je doute que ça soit CATEGORIE ....
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
10 déc. 2021 à 19:43
J'ai ça quand je fais un var_dump:
C:\wamp64\www\Projetsite\accueil.php:162:
array (size=2)
  'categorie' => string 'voitures' (length=8)
  'q' => string '' (length=0)

Et ça n'affiche aucun résultat
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 688
10 déc. 2021 à 21:40
Il y a plusieurs soucis dans ton code.

1 - Ta requête SQL devrait utiliser des OR et non pas des AND

2 - Dans ton formulaire de recherche... tu devrais renvoyer l'id de la catégorie et non son libellé...
Il me semblait qu'on avait déjà abordé cette question et que tu m'avais indiqué avoir "compris" ...


Pour commencer, tu devrais créer une fonction qui te permettrait de lister les catégories disponibles dans ta table
function getCategories(){
  global $bdd;
  
   $sql="SELECT C.id , C.nom
        FROM categories C
        ORDER BY C.nom";
        
   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;
}





Puis, dans tes formulaires, utiliser cette fonction pour créer ta liste déroulante
par exemple

<?php
$categories =  getCategories();
?>
<select name="categorie">
  <?php
    foreach($categories as $C){
      echo "<option value='".$C['id']."'>".$C['nom']."</option>";
    }
  ?>
</select>


et quand tu récupéreras les données du formulaire.. c'est bien "categorie" en MINUSCULE que tu devras utiliser
$id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null;

Tu feras donc bien la recherche en te basant sur l'ID de la catégorie... et non son libellé ...

0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
10 déc. 2021 à 22:06
Le formulaire renvoie bien l'id de la catégorie jusqu'à présent.
Question: comment faire avec cette partie du code si à la place j'ai les langues:
".$C['nom']."</option>";

Exemple dans le formulaire
 <option value= "1"> <?php echo $lang['appa'];?></option>
                    <option value= "2"> <?php echo $lang['mv'];?></option>
:
A part ça le code que tu as envoyé est clair.
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 688
10 déc. 2021 à 22:22
je ne sais pas..
As tu fais une Table de langues comme pour les catégories ??
Si oui, ben.. c'est exactement le même principe..


rassures moi ... tu ne fais pas que copier/coller bêtement les codes que je te donne .. tu les comprends .. hein ??
Sinon ça ne sert à rien..
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
11 déc. 2021 à 14:25
J'ai dû créer une table pour les langues. Le code marche bien.

Pour les codes que tu me donnes, je pense que je les comprends de mieux en mieux.
Remerciements pour tes explications :)
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
13 déc. 2021 à 19:02
En apportant une modification:
$id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null;

au lieu de $_POST['categorie'], nous avons l'erreur suivante: Erreur ! SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'id_categorie' ne peut être vide.

Quand c'était $_POST le formulaire était soumis.
Est-ce à cause de cette ligne?
<form action="" method="POST" enctype="multipart/form-data">
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 688
13 déc. 2021 à 19:21
Vu que dans ton formulaire tu as
method="POST"

Pourquoi essaye tu de récupérer la valeur en get ??
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 13 déc. 2021 à 19:43
Si j'ai bien compris, je laisse
$id_categorie= trim($_POST['categorie']);
parce que ça marche.
Dans ce cas où mettre cette partie:
$id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null;
. Est-ce cette partie qui remplace le LIKE? dans la fonction getsearch ou recherche. Et que faire du Like si oui.
$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.'%" 
    AND nom 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;
  }
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 688
13 déc. 2021 à 20:01
oula... on devrait changer ton pseudo par "paic" ..
paic citron quand y'en a plus y'en a encore

:-)

Alors

Si j'ai bien compris, je laisse $id_categorie= trim($_POST['categorie']); parce que ça marche.
Dans ce cas où mettre cette partie: $id_categorie= isset($_GET['categorie'])? trim($_GET['categorie']) : null; .

Le second.. remplace le premier ...
Si tu ne sais pas ce que c'est, renseignes toi sur l'écriture ternaire ( sorte de if/else )
ça t'aidera à comprendre.

par contre, tu n'as toujours pas corrigé la requête SQL ...
Je t'ai déjà à deux reprises qu'il ne faut pas utiliser des AND mais des OR dans ce que tu essaies de faire ...


NB: La question est marquée en RESOLUE .... il serait donc bien que dorénavant, pour tes prochains soucis.. tu créés une nouvelle discussion.
0
max30_3775 Messages postés 178 Date d'inscription jeudi 4 novembre 2021 Statut Membre Dernière intervention 18 mars 2022
Modifié le 13 déc. 2021 à 20:24
Si le second remplace le premier, faudrait-il donc remplacer method="POST" par get pour que ça n'affiche pas l'erreur:
Erreur ! SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'id_categorie' ne peut être vide.

Que mettre à sa place donc pour éviter cette erreur?

OK, la requête sera corrigé. Mais c'était pour comprendre comment on remplace un $id_categorie= $_POST par un $_get dans un formulaire avec "POST" comme méthode.

Je créerai une nouvelle discussion, le topic étant résolu.
0
jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 688
13 déc. 2021 à 20:54
Je te parle de la forme d'écriture le ternaire comme je te l'ai déjà expliqué bien entendu si tu veux envoyer ton formulaire en poste ce que je te conseille au passage, oui il faut bien remplacer les $_GET par des $_POST
0