IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Recherche de mots-clés sur plusieurs champs


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Points : 19
    Points
    19
    Par défaut Recherche de mots-clés sur plusieurs champs
    Bonjour,

    Dans le cadre d'un projet je cherche à mettre en place un système de recherche sur une base de donnée.

    L'entrée de l’utilisateur contient une série de mots-clés séparés par des espaces, et la recherche porte sur plusieurs champs d'une table. Le problème est que chaque mot-clé doit se trouver dans au moins un des champs, peu importe l'ordre.

    Donc, par exemple, si j'ai ces entrées dans la table :
    [...toto...] [...titi...] [other...]
    [...titi...] [...tutu...] [...toto...]
    [...titi...] [...tata...] [...tutu...]
    et que l'utilisateur a entré "tutu toto titi", il faut lui retourner la deuxième entrée.

    Avez-vous une idée de comment faire cela ? Si c'est faisable...

    Merci d'avance !

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Pour la recherche tout champs, le mieux étant d’utiliser un outils pour comme Lucene par exemple

  3. #3
    Membre du Club
    Homme Profil pro
    NC NC
    Inscrit en
    Juillet 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : NC NC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2012
    Messages : 32
    Points : 49
    Points
    49
    Par défaut
    Salut

    Si tu souhaites une solution propre intégrée à ton développement, une solution est de créer un script qui vérifie que pour chaque mot clef celui ci soit effectivement compris dans l'un des champs sur lesquels porte ta recherche

    Idée
    //L'entrée utilisateur est mise dans la variable $rech
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $rech = isset($_POST['rech']) ? mysql_real_escape_string( $_POST['rech'] ): '';
    //Les expressions à rechercher issues de la variable $rech sont mises dans un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab=explode(" " , $rech)
    Pour chacune des expressions entrées les champs concèrnés de ta base sont verifiés

    // Nb d'entrées utilisateur
    // Test des champs pour chaque entrée, ici les champs sont appelés champ1, champ2 ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     for($i=1 ; $i<$nb; $i++):		
                 $sql= " SELECT * FROM table_à_vérifier WHERE champ1 LIKE '%$tab[$i]% AND  champ2 LIKE '%$tab[$i]% .....";   (NB : continuer avec chaque champ sur lequel doit porter la recherche)				
     
         endfor;
    Tu obtiens pour chaque entrée de l'utilisateur les enregistrements correspondants en utilisant qque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result_recherche = mysql_query($sql) or die('Échec de la requête : ' . mysql_error());
    //ecriture élement de la liste d'aprés objet courant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ($resultat_recherche = mysql_fetch_array($result_recherche, MYSQL_ASSOC)) :[/I]		
            [I]extract($resultat_rcherche);
     
            --- Ici ton script pour traiter le resultat correspondant à chaque entrée ---
     
         endwhile;

    Pour économiser les ressources, une précaution pourrait être à prendre en ce qui concerne le nombre d'expressions à rechercher , ou, puisque chaque expression doit se retrouver dans les champs, pour stopper la recherche si une expression n'est pas trouvée.
    Pour cela tu peux par exemple utiliser en premier le même genre de script en utilisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*) FROM table-à-vérifier .....
    pour t'assurer préalablement à tout traitement que la condition que tu as fixé (TOUTES les expressions sont contenues dans au moins un des champs) est respectée.

    J'éspére que cette base pourra t'aider. Attention, le script proposé n'est pas testé mais uniquement donné à titre de trame exemple.

    Un moteur de recherche simple utilsant un principe similaire à celui ci et acceptant l'operateur OR est utilisé sur wikimaginot.eu

    Cordialement, Pascal

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Merci beaucoup pour vos réponses !

    J'ai décide de ne pas passer par un outil externe.

    En me basant sur la réponse de wikimaginot je pense faire quelque chose comme ca pour construire la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $input = 'mot1 mot2 mot3';
     
    $tab = explode(' ', $input);
    $count = count($tab);
     
    $query = 'SELECT * FROM table WHERE';
     
    for ($i = 0; $i < $count; $i++)
    {
    	$query .= ' (champ1 LIKE %'.$tab[$i].'% OR champ2 LIKE %'.$tab[$i].'%)';
    	if ($i + 1 < $count)
    		$query .= ' AND';
    }
     
    echo $query;
    Bonne journée

  5. #5
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    si c'est une table myisam, tu peux utiliser la recherche fulltext en créant un index fulltext sur tes 3 colonnes puis en utilisant les opérateurs match...against
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Discussions similaires

  1. recherche par mots clés sur toute la table
    Par Natynatou dans le forum 4D
    Réponses: 1
    Dernier message: 01/01/2010, 16h40
  2. Moteur recherche interne et requete sur plusieurs champs
    Par idamarco dans le forum Langage SQL
    Réponses: 5
    Dernier message: 26/01/2009, 17h20
  3. [Débutant]Recherche sur plusieurs champs
    Par Touareg dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/03/2007, 14h04
  4. Réponses: 2
    Dernier message: 30/11/2004, 09h42
  5. Recherche d'un mot avec LIKE sur plusieurs champs
    Par reynhart dans le forum Langage SQL
    Réponses: 16
    Dernier message: 26/11/2004, 17h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo