Probleme d'affichage

Bonjour,

supposons que j'ai dans une ligne de ma BDD les mots clé suivants: atomes physique
dansune autre ligne de ma BDD les mots clé suivants : atomes

comment faire pour que quand je fais une recherche par mots clé si je tape : atomes physique il ne maffiche qu'une fois la ligne où les mots clé sont atomes physique et une fois la ligne où les mots clé sont atomes

actuellement cela maffiche : atomes physiques
atomes
atomes physique

car il regarde dabord pour atomes et il affiche les lignes correspondantes puis fais pareil avec physique sans regarder si il ne va pas réecrire la meme ligne....je ne sais pas tro quoi mettre dans mon if pour dire qu'il ne réaffiche pas une ligne déja affichée....

merci d'avance ...urgent!!

26 réponses

Résumé de la discussion

La problématique centrale est la recherche par mots-clés dans une base de données et l'affichage répété d'une même ligne lorsque les mots-clés se cumulent dans les résultats. Pour éviter les doublons, il est conseillé d'utiliser une clause WHERE avec plusieurs LIKE reliés par OR et d'interroger avec SELECT DISTINCT sur les colonnes pertinentes. Cette approche empêche d'afficher plusieurs fois une ligne lorsque les mots-clés se chevauchent, et elle peut être combinée avec explode pour générer dynamiquement les critères sans réécriture manuelle. En cas de besoin, la vérification côté PHP peut s'appuyer sur l'enregistrement des identifiants déjà affichés afin d'éviter les doublons sans modifier la requête initiale.

Bobot (l’IA à votre service)
  1. Regarde ce qui était dans mon message récent sur un de tes précédents fils en remplaçant les AND par des OR et en réflechissant.
    1. 3. le fait de générer un SELECT par mot-clef de recherche n'est pas bon : utilise plutôt WHERE motClef like '%physique%' OR motClef like '%chimie%' etc...

      tru me mets ca mais moi dans ma requetre j'ai un motsclé like %'$_POST['motsclé']'% donc je ne peux pas mettre de OR....
      voila pourquoi je ne sais pas comment faire
      1. Je comprend que dans $_POST['motsclé'] tu as une liste de mots clefs.

        Utilise explode pour les séparer les uns des autres puis LIKE ... OR ....
        1. j'ai utilisé explode et le probléme avec plusieurs mots clé et résolu mais il restequand meme le probléme ou cela affiche plusieurs fois.
          en effet si je tape lolo lala dans motsclé il recherche d'abord dans la bdd lolo dans le champs lotsclé de la bdd puis aprés lala donc si je tape lolo lala il affichera 2fois le résultat
          je ne sais pas comment faire
          je pensais faire un truc du genre if($donnees['id'] deja affiché) ne pas réaffiché mais je ne sais pa commet l'écrire
          please help me c'est urgent!!
          1. Tu ne dois avoir qu'un seul select avec where et les like.

            Est-ce bien le cas ?

            Copie la partie de ton scrit qui génère cette requête sql.
            1. $mots = explode(" ", $_POST['motsclé']);
              <?php

              if (($_POST['auteur']=='') && ($_POST['titre']=='') && ($_POST['année']=='') && ($_POST['journal']=='') && ($_POST['motsclé']!=''))
              {
              for($i=0;$i<sizeof($mots);$i++)
              {

              $reponse = mysql_query("SELECT * FROM base_physique WHERE motsclé LIKE '%".$mots[$i]."%'");

              while ($donnees = mysql_fetch_array($reponse))
              {

              ?>
              <p>
              <?php echo $donnees['id'];?><br />
              Les mots clé de la recherche sont:<?php echo $donnees['motsclé']; ?> <br/></p>
              <?php
              }
              }
              }
              ?>

              quand jaffiche id dans lexemple precedent cela maffiche 1 3 1 donc je voudrais juste 1 3
              1. Tu génères un SELECT par mot-clef, il est donc normal que tu récupères plusieurs fois le même résultat.

                Est-ce-que tu comprends pourquoi ?

                Ceci acquis tu pourras essayer de modifier ton script pour ne générer qu'un seul select avec une clause WHERE regroupant plusieurs LIKE (un par mot-clef.
                1. non je ne comprends pas pourquoi et encore moins ce que je dois faire pour aboutir au bon résultat....
                  si tu peux me onner un coup de main en me montrant un bout de code pour me mettre sur la route car la je n'arrive plus a avancer...
                  1. Il est indispensable que tu comprennes le premier point : supposons que tu aies deux mots clefs ( 'atome' et 'physique') comme critère de sélection, ton script actuel va exécuter deux select sql.

                    Le premier avec WHERE motscle LIKE '%atome%' va te retourner les enregistrements 1, 3 et 10

                    le second avec WHERE motscle Like '%physique%' va te retourner de nouveau l'enregistrement 1 si la colonne motcle de celui-ci contient 'atome' et 'physique'

                    Avant de passer au point suivant recommandation déjà faite de ne pas utiliser de caractères accentués pour les noms de colonnes sql : remplace motclé par motcle

                    Ce point bien compris, il est clair qu'il faut générer un seul SELECT. Quelle sera la clause WHERE de ce select unique ?

                    Donne-moi ta réponse et nous pourrons avancer.
                    1. c'est pas possible de mettre dans ma reqete ou il y a le WHERE un truc du genre :
                      WHERE motsclé LIKE '%".$mots[$i]."%' AND pas encore affiché");
                      mais je sais pas comment faire ca j'ai essayé plein de trucs mais en vain...
                      1. Procédons par étape :
                        - as-tu remplacé motclé par motcle ?
                        - as-tu compris la raison pour laquelle il ne faut qu'un select ?
                        - quelle clause WHERE faut-il générer ?

                        Nous verrons ensuite comment générer cette clause WHERE avec PHP
                        1. oui j'ai remplacé....
                          je pense avoir compris pour l'unique select
                          en revanche même si je vois à peu prés ce qu'il faut mettre dans le WHERE je ne vois pas du tout coment l'écrire...
                          1. ben justement je ne sais pas quoi mettre dans le WHERE

                            WHERE motsclé LIKE '%".$mots[$i]."%'");

                            j'avais mis ca mais cela pose le probléme de la répetition, je ne sais vraiment pas quoi mettre dans le WHERE pru que ca marche

                            si tu pouvais me dire quoi mettre ca m'aiderait vraiment
                            1. On se rapproche du but mais tu vas trop vite en mélangeant sql et php ce que nous ferons dans une étape ultérieure.

                              Que penses-tu des clauses suivantes :

                              WHERE motcle LIKE '%physique%' AND motcle LIKE '%atome%' AND motcle LIKE '%molécule%'

                              WHERE motcle LIKE '%physique%' OR motcle LIKE '%atome%' OR motcle LIKE '%molécule%'

                              Laquelle convient à ta problématique ? pourquoi ?
                              1. c'est la 2eme qui est bonne...je vois ce que tu veux faire ais le probléme c'est que je ne peux pas faire cela car je ne veux pas taper à la main tous les motsclé, c'est pour cela que j'avais fais explode mais je voudrais qu'il gére le reste tout seul
                                1. Quelquchose comme

                                  <?php
                                  $mots = explode(" ", $_POST['motsclé']);

                                  if(($_POST['auteur']=='') && ($_POST['titre']=='') && ($_POST['année']=='') && ($_POST['journal']=='') && ($_POST['motsclé']!=''))
                                  {
                                  $laRequete = "SELECT * FROM base_physique WHERE";
                                  for( $rangMotclef=0; $rangMotclef < sizeof($mots); $rangMotclef ++)
                                  {
                                  if( $rangMotclef > 0 )
                                  $laRequete .= " OR ";
                                  $laRequete .= "motcle LIKE '%" . $mots[ $rangMotclef ] . "%'"
                                  }
                                  }

                                  $reponse = mysql_query( $laRequete );
                                  if( !$reponse )
                                  {
                                  $message = 'Requête invalide : ' . mysql_error() . "\n";
                                  $message .= 'Requête complète : ' . $laRequete;
                                  die($message);
                                  }

                                  while( $donnees = mysql_fetch_array($reponse) )
                                  echo $donnees['id'] . "<br />";
                                  ?>

                                  devrait convenir.

                                  Surtout, surtout ne fait pas un copier/coller mais analyse pour comprendre ce qui te sera nécessaire pour adapter finement à tes besoins.
                                  1. Requête invalide : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 Requête complète : SELECT * FROM base_physique WHERE

                                    j'ai modofié les 2 3 trucs qui n'allairent pas ( les acolades ou ; ) et ca me mets ca a chaque fois le echo donnees ['id'] ne s'affiche pas...
                                    • 1
                                    • 2