Des images qui font répéter le nombre de publication
Résolu
max30_3775
Messages postés
178
Date d'inscription
Statut
Membre
Dernière intervention
-
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
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:
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
A voir également:
- Des images qui font répéter le nombre de publication
- Des images - Guide
- Nombre de jours entre deux dates excel - Guide
- Brouillon publication instagram - Guide
- Supprimer publication facebook - Guide
- Nombre facile - Télécharger - Outils professionnels
28 réponses
Ok, j'ai compris. Cela a marché. Mais il reste la deuxième partie concernant la catégorie: ça vient pas. On a :
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:
J'ai fait ainsi pour que ça marche
$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; }:
J'ai ça quand je fais un var_dump:
Et ça n'affiche aucun résultat
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
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
Puis, dans tes formulaires, utiliser cette fonction pour créer ta liste déroulante
par exemple
et quand tu récupéreras les données du formulaire.. c'est bien "categorie" en MINUSCULE que tu devras utiliser
Tu feras donc bien la recherche en te basant sur l'ID de la catégorie... et non son libellé ...
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é ...
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:
Exemple dans le formulaire
A part ça le code que tu as envoyé est clair.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :)
Pour les codes que tu me donnes, je pense que je les comprends de mieux en mieux.
Remerciements pour tes explications :)
En apportant une modification:
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?
$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">
Si j'ai bien compris, je laisse
Dans ce cas où mettre cette partie:
$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; }
oula... on devrait changer ton pseudo par "paic" ..
:-)
Alors
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.
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.
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.
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.
Je doute que ça soit CATEGORIE ....