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. merci enax ca marche je vais essayer de continuer mon programme now..;
    1. C'est :
      for($rangMotclef = 0 ; $rangMotclef < sizeof($mots) ; $rangMotclef++)
      {
      	if($rangMotclef > 0)
      		$laRequete .= " OR ";
      	$laRequete .= "motcle LIKE '%" . $mots[ $rangMotclef ] . "%'";
      }

      Ou :
      for($rangMotclef = 0 ; $rangMotclef < sizeof($mots) ; $rangMotclef++)
      {
      	if($rangMotclef > 0)
      	{
      		$laRequete .= " OR ";
      	}
      	$laRequete .= "motcle LIKE '%" . $mots[ $rangMotclef ] . "%'";
      }

      Sachant que quand tu n'as qu'une seule instruction dans un bloc les accolades ne sont pas nécessaires.

      J'ai testé le code sur l'une de mes tables et ça fonctionne très bien.
      1. voila le code que j'ai rentré :

        <?php

        mysql_connect("localhost", "root", ""); // Connexion à MySQL
        mysql_select_db("physique"); // Sélection de la base coursphp

        $mots = explode(" ", $_POST['motscle']);

        if(($_POST['auteur']=='') && ($_POST['titre']=='') && ($_POST['année']=='') && ($_POST['journal']=='') && ($_POST['motscle']!=''))
        {
        $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 />";
        ?>

        <?php
        }
        }
        ?>

        mais ca me mets toujours :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

        help me please
        1. Ca dépend des changements que tu as apportés... Normalement, son code devrait fonctionner, à part peut-être l'oubli d'un espace après le WHERE (et effectivement d'un point-virgule à la fin d'une instruction).
          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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
                                • 2