Bonsoir !

Et voilà ! J'arrive tout doucement à la fin de la création de mon site. Je tiens déjà à remercier les personnes qui m'ont aidées lorsque je coincait sur certaines choses :)

Toutes les pages sont faites et le système pour créer une annonce est fait. Maintenant, j'aimerais pour l'affichage de la liste d'annonces, que les utilisateurs puissent trier ce qui doit être affiché.

J'ai déjà regardé sur Google mais rien ne satisfait mes exigences. Les systèmes de tri sont à chaque fois "Trier par date" ou "Trier par prix" dans une liste déroulante.

Moi, ce que je veux, mon site étant un site d'annonce pour Minecraft (un peu comme pixelads.fr mais en différent :p), c'est qu'un joueur qui ai besoin par exemple d'un développeur Java, d'un graphiste 2D et d'un développeur Web arrive sur la page d'annonce et ai juste à cocher dans une liste ce dont il a besoin. Il clique sur "Rechercher" et hop, il n'y a plus que les annonces correspondant à ce qu'il veut qui soit affichées. (je ne sais pas si je suis très clair :p)

Je ne veux pas de réponse toute faite mais juste une piste car à la base, mon site est là pour m'entrainer mais du coup, étant encore un peu débutant, je ne sais absolument pas comment commencer le code, comment m'y prendre.

Je tiens à dire que je code en procédural. :)

Je vous remercie d'avance et si vous avez des questions, n'hésitez pas ! :)

Boris

21 réponses


Benjamin Derepas
Réponse acceptée

Dans un premier temps je te conseil de revoir les requêtes SQL, ça te servira beaucoup, surtout pour un moteur de recherche.

Une fois que tu aura bien compris comment constuire ta requête, tout ira tout seul .
Mais en gros, ta fonction de recherche de la manière suivante :
ta requete selectionne toutes les annonces, puis si l'utilisateur filtre une ou plusieurs catégories, tu les ajoutes dans les filtres de la requête en liant les tables categories et sous categories

FactureHero.com
Réponse acceptée

Je ne lis pas tout car c'est long mais juste une réponse globale :
essaye de scinder Ta structure de bdd en un maximum de tables logiques Et reliées entre elles soit par une clé étrangère soit par une table de liaison (C'est plus logique et c'est meilleur pour les performances Pour ton idée de multi-tri). exemple:

1 table categories
1 table sscategories
1 table annonces

1/ si tu considéres qu une annonce peut être dans plusieurs sous-catégories, alors tu crées une table de liaison annoncesCatégories (id, id_annonce, id_sscategorie)
2/ ta sous catégorie est elle liée à une seule catégorie Donc dans la table sscategories, Tu ajoutes un champ categorie_id pour la relier.

t'es requêtes seront alors beaucoup plus logiques a appeler. imaginé que tu veuilles afficher toutes les annonces de la sous catégorie qui a l id 5, alors tu requêtes la table de liaison qui va te sortir tous les id d annonces qui ont le sscategorie_id 5

Dernier conseil : ce genre de système de tri, clairement plus user friendly sans rechargement de page, donc en ajax. En passant les requêtes directement en js ou jquery.

Benjamin Derepas
Réponse acceptée

Utiliser l'ajax ici est plutôt simple. Tu transmet des données à ton script, et tu modifie légèrement le DOM.
Regarde ici si tu veux l'intégrer pour plus tard

FactureHero.com
Réponse acceptée

Comme le dit Benjamin c'est ce qu'il y a de plus simple.
Conseil : fais d'abord tout ton script PHP via des fonctions appelées lors des requêtes utilisateurs
Une fois que c'est fait, une couche de JS ou jQuery pour passer tes reqûetes http en Ajax, c'est très simple et tu comprendra vite le code.
Un exemple concret : sur un réseau social, au click sur le bouton suivre, une fonction php "follow" est appelée :

 //Clic sur le bouton suivre (follow)
    $(document).on("click", ".follow", function (event){
    event.preventDefault();
    var $this = $(this);
    // on récupère l'id du bouton suivre (id de l'utilisateur à suivre)
    var to_follow_id = $(this).data('id');
    //alert(id);

     $.ajax({
        // Appel de l'url en Ajax
        type: $this.attr('data-action'),
        url: $this.attr('data-ref'),
        timeout: 8000
//        data: id
//  si ja réponse serveur est ok
      }).done(function(response) {
// injecte le message flash de succès et l'affiche
  var successMessage = response;
                       $('#message').html(successMessage);
                       $('#message').fadeIn();

      })
      //  si ja réponse serveur est fail, on affiche un message d'erreur                  
      .fail(function(jqXHR,textStatus, response) {
        // Optionally alert the user of an error here...
     if(textStatus == 'timeout')
    {     

        var msgerrortimeout = "problème serveur"
        $('#message').html(msgerrortimeout);
                       $('#message').fadeIn();
        $this.children('i').removeClass('spinner').addClass('fa-share');
    }
    else {

       var errorMessage = response;
                       $('#message').html(errorMessage);
                       $('#message').fadeIn();
                   }
      });

    return false;
    });

(Faut se mettre à JS ou plus facile à jQuery, mais dans ton code, ce ne sera vraiment pas le plus long. Se concentrer sur ton PHP d'abord n'est pas une mauvaise idée. )

Lartak
Réponse acceptée

Bonsoir.
Je te recommande de revoir un peu ton code en évitant de faire autant de mélange entre le PHP et le Html.
Par exemple :

<?php /* code de requête SQL */
$query = 'SELECT annonces.*, categorie.*, sous_categorie.*, membres.id, membres.pseudo FROM annonces INNER JOIN membres ON annonces.id_membre = membres.id INNER JOIN sous_categorie ON annonces.sous_categorie = sous_categorie.id_scategorie INNER JOIN categorie ON annonces.categorie = categorie.id_categorie';
if(!isset($_POST['search'])) {

  $query .= ' ORDER BY date_annonce DESC';

} else {

  $i = 0;  
  foreach ($_POST['choix'] as $scategorie) {
    $query .= $i == 0 ? ' WHERE ' : ' OR ';
    $query .= 'sous_categorie.id_scategorie = ' . $scategorie;
    $i++;
  }

}

$req = $bdd->prepare($query);
$req->execute();
$annonces = $req->fetch();

/* Affichage des annonces */
foreach ($annonces as $annonce): ?>
  <div class="row row-custom">
    <div class="well">
      <div class="row">
        <div class="col-lg-2">
          <img src="/annonces/logos/<?php echo $annonce['logo'] ?>" alt="">
        </div>
        <div class="col-lg-10">
          <div style="font-size: 20px; color: #505050">
            <a href="/annonces/annonce.php" class="lien-ads-custom"><?php echo $annonce['titre_annonce']; ?></a>
          </div>
          <div style="font-size: 13px; margin-bottom: 10px">Posté par <a href="/profil/membre.php?id=<?php echo $annonce['id']; ?>"><?php echo $annonce['pseudo']; ?></a>, le <?php echo date("d/m/Y à H:i", strtotime($annonce['date_annonce'])); ?></div>
                            <?php echo htmlspecialchars(recupererDebutTexte($annonce['contenu_annonce'], 200)); ?>
        </div>
      </div>
    </div>
  </div>
<?php endforeach; $annonces->closeCursor(); ?>

Pourquoi faire comme-ceci ?
De manière à avoir un code plus propre et mieux organisé, de plus cela t'évitera de faire des répétitions inutiles.

Bonsoir,

Difficile de te répondre sans connaître ta structure de données et donc comment requêter ta base pour obtenir tes résultats..

Bonjour !

Merci de ta réponse ! :)
Je ne comprends pas tout à fait ce que tu veux dire. Tu dois connaître comment est structuré ma base de données ? :)

Un système de tri c'est simplement une modification de la requête principale. Tu peux utiliser pour ça :

  • group by (pour grouper les résultats selon une catégorie par exemple)
  • order by (pour date/prix la plupart des fois)
  • limit (pour limiter l'affichage des résultats)

Concernant ton problème je pense qu'il te faut une table X contenant les différents acteurs (graphiste, dévéloppeur, administration etc) et adapter à un system de recherche classique

Je te remercie de ta réponse ! :)

Le hic, c'est que je n'arrive toujours pas à comprendre. Benjamin, tu me donnes des réponses pour le triage par date, prix, etc mais moi, je dois faire en sorte que si la personne veut afficher 1 sous-catégorie, il coche une seule case et hop, le triage est fait. S'il veut en cocher 10, il coche les 10 cases et hop, ça fait la recherche :)

Voilà comment est organisé mon menu (on ne voit qu'une partie) :

Donc en gros, quand quelqu'un arrive sur la page d'annonce, toutes les annonces peu importe leur catégorie ou sous-catégories sont affichées par date (du plus récent au moins récent). Ensuite, si la personne veut affiner sa recherche, il lui suffit de séléctionner sur cette liste ce dont elle a envie et faire Rechercher et à ce moment là, les annonces appartenant aux sous-catégories séléctionnées sont affichées (uniquement celles-là).

J'avais déjà pensé à faire un truc (dites-moi si c'est mauvais), c'est de faire une boucle pour chaque sous-catégorie. Ainsi, je vérifie si la variable $graphiste2d existe par exemple et si elle existe, tu fais une boucle de ces annonces là et ainsi de suite. Seulement, ce qui me plairait bien, c'est de pouvoir mélanger quand-même les différentes annonces. Je m'explique.

Si quelqu'un coche la case Graphiste 2D, Animation 3D, Rédacteur et Modérateur par exemple, tous les résultats appartenant à ce qu'il a coché sont affichés mais dans le désordre.

Qu'en pensez-vous ? J'espère que je ne suis pas trop brouillon dans mes explications. :)

Et pour répondre à antho07, voici la structure de ma base de donnée pour les annonces :

Voilà voilà !

Je vous remercie encore ! C'est sympa de vouloir aider !! ;)

Amicalement,
Boris

Dans un premier temps je referai la structure de la base de données je vois beaucoup d'incohérences ici :/
Par exemple :
table annonce : id, titre, contenu, date, id_auteur
table categorie : id, libelle
table sous-categorie : id, libelle, id_categorie

(autre détail rien à voir : si commentaireallowed correspond bien à ce que je pense => booléen autorisant ou non les commentaires, un int(11) est inutile ^^)

Concernant la requete de recherche je ne vois pas où est le problème .... En gros tu veux faire une recherche selon la catégorie... et bien alors ?

SELECT * FROM annonce (+liaisons) WHERE categorie.libelle = graphiste OR categorie.libelle = developpeur ..... 

Je ne comprends pas tout à fait :p (Vraiment désolé)

Pourquoi ma table est-elle incohérente ? Comment faire pour relier la table annonce de la table catégorie et de la table sous-catégorie ? C'est peut-être très logique mais n'ayant pas du tout pensé à cette manière de structurer, je me perds :/

Pour le commentaire_allowed, tu as raison ! Petite erreur de ma part et je t'en remercie ! :)

Alors oui, je veux faire une recherche selon la catégorie mais il peut y en avoir plusieurs différentes. Je comprends le bout de code que tu m'as donné mais à partir de quel moment l'appliquer ? :/

Je m'excuse encore, certaines choses sont peut-être toute bête mais surement dût à ma légère experience, je me perds vite :)

En tout cas, je te remercie encore et encore de m'aider ! :)

Boris

Je connais bien les jointures entre table, j'en fais régulièrement :) Mais je ne connaissais pas le premier lien que tu m'as donné ! Ca va beaucoup m'aider ! Je regarde ça et je te dis quoi ! Merci encore !! :)

Je regarde ça et je te dis quoi

Ba tu me dis si tu as réussi ou pas ...

Ah ! On s'est mal compris ahah ! Je suis Belge donc cette expression veut dire "Je t'en dis des nouvelles" (un peu comme dans Bienvenu chez les ch'tis) :D

J'ai tout regardé et franchement.. MERCI pour cette mine d'information ! Il y a dans ce tutoriel un certain nombre de réponses à mes questions ! Je vais commencer à réfléchir un peu à mon code et entamer tout ça !

Merci merci merci merci et encore merci ! :-)

lol Bienvenue chez les Ch'tis !

Ca m'a fait pensé à cette scène :p

C'était un clin d'oeil ;)
Si tu as des souçis encore, donnes nous l'avancement de ton code on t'aidera

Salut !

Je te remercie de ta réponse ! :)

J'avais déjà commencé à scinder ma base de donnée en différentes tables comme me l'avait conseillé un peu plus haut Benjamin mais tes explications ne sont vraiment pas de trop ! :)

Pour le système Ajax, je comprends bien que c'est plus sympa mais je ne connais pas le jQuery ou même le JS donc Ajax encore moins. A la limite, je pourrais aller récupérer un script sur Internet mais je déteste avoir du code que je ne comprends pas ! Je suppose que tu comprends :) De toute façon, c'est prévu mais pour une version future du site Web !

En tout cas je te remercie de ta réponse ! :)

Boris

Je vous remercie vraiment de votre aide ! :)

Par contre, Entrepreneo.fr, je n'ai pas compris ton code.. :p C'est pour ça que j'ai commencé à regarder la vidéo que m'a proposé Benjamin :) J'espère que ça va m'éclairer un peu histoire d'avoir un petit système de recherche très sympa !

Ensuite, il m'a fallu un peu de temps pour répondre mais je me suis plongé dans le code et j'ai re-structuré un peu le tout.

J'ai désormais une table categorie qui contient les colonnes : id_categorie et libelle; une table sous_categorie qui contient les colonnes : id_scategorie et libelle; et ensuite la table annonce et les colonnes sont indiquées plus haut.

Mon système fonctionne correctement et je vous remercie BEAUCOUP ! Sans votre aide, je n'y serai jamais arrivé ! :)

Pour me dire ce que vous en pensez, voici mon code :

J'ai tout fait sur la même page en vérifiant si oui ou non, la variable POST search (bouton rechercher) existait. Si elle n'existe pas, une simple boucle avec les résultats triés par date décroissante. Sinon, si ça existe, hop, le système de recherche

<?php
                  if(!isset($_POST['search']))
                  {
                    $selectannonce = $bdd->prepare('SELECT annonces.*, categorie.*, sous_categorie.*, membres.id, membres.pseudo FROM annonces INNER JOIN membres ON annonces.id_membre = membres.id INNER JOIN sous_categorie ON annonces.sous_categorie = sous_categorie.id_scategorie INNER JOIN categorie ON annonces.categorie = categorie.id_categorie ORDER BY date_annonce DESC');
                    $selectannonce->execute();

                    while($affichads = $selectannonce->fetch())
                    {
                      $contenu_annonce = htmlspecialchars($affichads['contenu_annonce']);
                    ?>
                    <div class="row row-custom">
                      <div class="well">
                        <div class="row">
                          <div class="col-lg-2">
                            <img src="/annonces/logos/<?php echo $affichads['logo']; ?>" alt="">
                          </div>
                          <div class="col-lg-10">
                            <div style="font-size: 20px; color: #505050"><a href="/annonces/annonce.php" class="lien-ads-custom"><?php echo $affichads['titre_annonce']; ?></a></div>
                            <div style="font-size: 13px; margin-bottom: 10px">Posté par <a href="/profil/membre.php?id=<?php echo $affichads['id']; ?>"><?php echo $affichads['pseudo']; ?></a>, le <?php echo date("d/m/Y à H:i", strtotime($affichads['date_annonce'])); ?></div>
                            <?php echo recupererDebutTexte($contenu_annonce, 200); ?> 
                          </div>
                        </div>
                      </div>
                    </div>
                    <?php
                    }

                    $selectannonce->closeCursor();
                  }
                    ?> 

                  <?php
                    if(isset($_POST['search']))
                    {
                      $query = 'SELECT annonces.*, categorie.*, sous_categorie.*, membres.id, membres.pseudo FROM annonces INNER JOIN membres ON annonces.id_membre = membres.id INNER JOIN sous_categorie ON annonces.sous_categorie = sous_categorie.id_scategorie INNER JOIN categorie ON annonces.categorie = categorie.id_categorie';
                      $i=0;

                      foreach ($_POST['choix'] as $scategorie) 
                      {
                        if($i==0)
                        {
                          $query.=" WHERE ";
                        } 
                        else
                        {
                          $query.=" OR ";
                        }
                        $query.="sous_categorie.id_scategorie = $scategorie";

                        $i++; 
                      }

                      $reqsearch = $bdd->prepare($query);
                      $reqsearch->execute();

                      while($affichsearch = $reqsearch->fetch())
                      {
                      $contenu_annonce = htmlspecialchars($affichsearch['contenu_annonce']);
                      ?>
                      <div class="row row-custom">
                        <div class="well">
                          <div class="row">
                            <div class="col-lg-2">
                              <img src="/annonces/logos/<?php echo $affichsearch['logo']; ?>" alt="">
                            </div>
                            <div class="col-lg-10">
                              <div style="font-size: 20px; color: #505050"><a href="/annonces/annonce.php" class="lien-ads-custom"><?php echo $affichsearch['titre_annonce']; ?></a></div>
                              <div style="font-size: 13px; margin-bottom: 10px">Posté par <a href="/profil/membre.php?id=<?php echo $affichsearch['id']; ?>"><?php echo $affichsearch['pseudo']; ?></a>, le <?php echo date("d/m/Y à H:i", strtotime($affichsearch['date_annonce'])); ?></div>
                              <?php echo recupererDebutTexte($contenu_annonce, 200); ?> 
                            </div>
                          </div>
                        </div>
                      </div>
                      <?php
                      }
                    }
                  ?>

Et j'ai mis pour les values des checkbox les id des sous_categories. :)

Tout fonctionne super bien et je dois juste encore rajouter dans la boucle l'affichage des catégories et sous-catégories histoire que les gens se repèrent mieux.

Je vous remercie encore et encore :D Et je regarde cette vidéo Ajax et j'essaye d'améliorer mon petit système :)

Boris

De rien c'est fait pour ça le forum :)
Je débloque moi-même pas mal de choses ici. Donc de temps en temps quand j'ai un moment, j'essaye de renvoyer l'ascenceur. La logique du forum. Cool si ça t'a aidé.

Pour l'Ajax si tu ne comprends rien pas de panique, il te fait un peu de bagage en Js et jQuery mais rien de sorcier par rapport à ce que tu as déjà mis en place.
Quand tu aura compris
1 / comment on sélectionne un élément en jquery : $('div#monelement')
ici je sélectionne l'élément div qui à l'id "monelement'.
2/ La gestion des événements utilisateurs pour toi ça pourra être le click sur un élément de recherche
3/ et l'appel ajax via une url avec tes paramètres de recherche + la gestion de la réponse serveur

Tout sera OK.
Mais la plus grosse partie est ton dev côté PHP.

@plus, noublie pas de passer les réponses que tu penses justes en "résolue" ;)

Effectivement ! Très bonne idée, je n'y avais pas pensé !! Je te remercie ! Je modifie tout ça demain :)

Pour donner une réponse à Benjamin et Entrepreneo, j'ai regardé presque toute la vidéo et soudainement, le code que tu m'avais donné Entrepreneo me parait déjà plus clair et je penses comprendre comment faire un système plus élaboré :)
Mais après avoir réfléchi, cette partie là n'était pas dans mon cahier des charges pour la première version du site et même si en fait, c'est assez simple à mettre en place, je le réserve pour une mise à jour future histoire d'apporter de la nouveauté :D

En tout cas et je sais que je me répète encore mais je vous remercie tous beaucoup d'apporter votre aide ! C'est vraiment génial pour un débutant comme moi et sincèrement, je vous suis vraiment reconnaissant ! Merci :D

Boris