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 :

Soucis sur recherche FULLTEXT [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut Soucis sur recherche FULLTEXT
    Bonjour,

    J'ai un petit soucis concernant les recherches en FULLTEXT que je ne comprend pas. En gros, certaines recherches fonctionnes alors que d'autres pas.

    En gros :

    Table TOTO contenant plusieurs champs dont 2 nommés "titre_annonce" et "texte_annonce" en "FULLTEXT".

    Je récupère les mots recherchés pour les traiter :
    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
    16
    17
    18
    <?php
    if(!empty($_GET['key'])){
    	$variableclef = trim(stripcslashes(htmlspecialchars($_GET["key"])));
        //On recupère la recherche mot par mot
    	$motclef = explode(" ",$variableclef);
    	//on compte le nombre de mot
    	$num = count($motclef);
    	//on boucle
    	for( $i = 0; $i < $num; $i++ )
    	{
    		//Recherche de type : '+mot1 +mot2 +mot3'
    		//cf : http://dev.mysql.com/doc/refman/5.0/fr/fulltext-boolean.html
    		$recherche .= '+'.$motclef[$i].' ';
    	}
    //on échappe les simples quote
    $recherche = str_replace("'" ,"\'",$recherche);
    }
    ?>
    A ce stade si j'entre par exemple la recherche "moteurs de recherches" mon code donne comme résultat : "+moteurs +de +recherches" donc normalement une recherche sur les 3 mots.

    Code sql :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    $query=mysql_query("SELECT * FROM TOTO WHERE valide='1' AND prix LIKE '".$_GET['prix']."%' AND MATCH (titre_annonce,texte_annonce) AGAINST ('".$recherche."')"); 
    ?>
    En bd est enregistré plusieurs exemples dont les titres suivants (champ:" titre_annonce") :
    moteurs de recherches
    recherche maison noirmoutier
    et 5 titres contenant le mot "annonce" (annonce ou l'annonce).

    Si je cherche les termes : "moteurs de recherches" ou "moteurs" ou "recherches", je n'ai aucun résultat.

    Si je cherche les termes : "recherche maison noirmoutier" ou "recherche" ou " maison" ou "noirmoutier", j'ai des résultats.

    Si je recherche le terme : "annonce", je n'ai aucun résultat bien qu'il soit présent 5 fois.

    Si je cherche le terme : "l'annonce", j'ai 3 résultats sur 5.

    Ce que je ne comprend pas, c'est pourquoi parfois je n'ai pas de résultat bien que les termes soient présent ou qu'ils me manque une partie des résultats ?

    Nota: ma version sql doit contenir un minimum de 4 lettres pour les recherches.

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pour un élément de réponse : les apostrophes ne sont prises en compte qu'a partir de mysql 5.1
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Ok pour les apostrophes mais concernant le reste, une idée sur le pourquoi "ça merdouille"?

  4. #4
    Expert confirmé

    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
    Par défaut
    pourquoi tu fais un htmlspecialchars ? tes données sont en entités dans ta base ?

    EDIT : et pourquoi utiliser for au lieu de foreach ? d'ailleur autant replacer les espaces par espace +

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Pour htmlspecialchars c'est juste pour éviter certains caractères html que pourrait s'amuser à rentrer certaines personnes. Pourquoi, ce n'est pas correcte?

    tes données sont en entités dans ta base ?
    C'est à dire?

    Les données sont enregistrées via un simple textarea sur lequel j'effectue certains contrôle avant enregistrement.

    J'ai remplacé la boucle for par foreach, supprimé htmlspecialchars mais ça ne change rien.

    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??

  6. #6
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par tryan Voir le message
    Pour htmlspecialchars c'est juste pour éviter certains caractères html que pourrait s'amuser à rentrer certaines personnes. Pourquoi, ce n'est pas correcte?


    C'est à dire?

    Les données sont enregistrées via un simple textarea sur lequel j'effectue certains contrôle avant enregistrement.

    J'ai remplacé la boucle for par foreach, supprimé htmlspecialchars mais ça ne change rien.

    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??
    le htmlspecialschars c'est uniquement en moment de l'affichage, c'est pas bien de la faire dans tes requête :
    si la personne ecrit : héhé,
    dans la requete ca doit etre héhé,
    dans la base héhé,
    et à l'affichage h&ecute;h&ecute; (et encore normalement c'est que pour les < > )


    Citation Envoyé par tryan Voir le message
    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??
    si la personne recherche : machin bidule truc
    ton code va faire : +machin +bidule +truc
    tu vois bien que finalement les espace sont remplacer par espace+

    meme si c'est un peu plus complexe que ca le principe y est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $str = 'machin bidule truc';
    echo '+', str_replace(' ', ' +', $str);
    //+machin +bidule +truc

  7. #7
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    Citation Envoyé par tryan Voir le message
    Pourquoi remplacer les espaces par espace+ ? Je ne vois pas l'intérêt de faire une recherche sur un espace ??
    Afin de gérer le cas du premier mot, tu enlève ta concaténation
    Ainsi tu aura au final :

    Au lieu de


  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 128
    Par défaut
    Désolé, je ne suis pas une flèche et je teste en même temps .

    @gwharl : bingo . En ajoutant "IN BOOLEAN MODE", j'ai tout mes résultats, merci.

    Merci pour tes explications également @stealth35 .

    Il y a un truc que je ne pige pas concernant la recherche. Doit elle aboutir sous la forme :

    mot1 +mot2 +mot3
    ou
    mot1+mot2+mot3
    ou (cas des espaces)
    mot1 + +mot2 ++mot3
    ou
    mot1++mot2++mot3

    @gwharl : Dans la doc il est dit : "signe + initial indique que le mot doit être présent dans la ligne retournée. " et dans ton code tu supprimes justement le premier + ... pourquoi ?

  9. #9
    Membre chevronné
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2009
    Messages : 236
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TOTO WHERE valide='1' AND prix LIKE '".$_GET['prix']."%' AND MATCH (titre_annonce,texte_annonce) AGAINST ('".$recherche."' IN BOOLEAN MODE)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/04/2015, 14h14
  2. [RegEx] souci sur une recherche dans une chaine
    Par fey dans le forum Langage
    Réponses: 8
    Dernier message: 21/10/2009, 15h58
  3. Question sur la recherche FULLTEXT
    Par Rudya dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/05/2007, 11h44
  4. [SQL] probleme sur recherche
    Par Tib781 dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2005, 12h31
  5. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06

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