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

Langage PHP Discussion :

Mots en gras dans les résultats d'une recherche


Sujet :

Langage PHP

  1. #1
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut Mots en gras dans les résultats d'une recherche
    Bonjour à tous,

    Pour mettre en gras le mot-clé recherché dans le résultat d'une requête standard de type WHERE colonne LIKE '%motcle%', j'utilisais cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace('/('.$motcle.')/i', '<strong>$1</strong>', $texte);
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = str_replace($motcle,"<b>$motcle</b>",$texte);
    Bon, déjà, je ne sais pas laquelle est la plus judicieuse.
    Mais surtout, je voudrais pouvoir mettre en gras les différents mot-clés, avec une condition écrite comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $motrecherche=explode(" ",$motcle);
    $WHERE = "WHERE"; 
    $count = 0; 
    reset ($motrecherche); 
    while(list($key, $data) = each($motrecherche)) 
    { 
    $count = $count + 1; 
    if ($count == 1)   $WHERE .= " (titre LIKE '%" . $data . "%' OR description LIKE '%" . $data . "%')";  // recherche sur un mot
    else $WHERE .= " AND (titre LIKE '%" . $data . "%' OR description LIKE '%" . $data . "%') "; // recherche sur plusieurs mots
      }
    Si quelqu'un à une petite idée... Merci d'avance !

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    dans le cas d'un seul mot-clé le str_replace() semble le mieux. Dans le cas de plusieurs tu pourrais utiliser strtr() et lui passer un tableau mais ça t'oblige à définir chaque entrée. Le plus simple serait d'utiliser l'alternative dans ton pattern regex, le pipe | :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = preg_replace('/('.implode('|', $motrecherche).')/i', '<strong>$1</strong>', $texte);
    avec directement implode() sur ton tableau (en espérant au passage que tu protèges tes caractères contre l'injection SQL ) ou un str_replace(' ', '|', $motcle)

    Pour les requête dynamiques, l'utilisation de implode() rend le code généralement beaucoup plus clair et concis, ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach($motrecherche as => $data)   {
        $sql[] = " (titre LIKE '%" . $data . "%' OR description LIKE '%" . $data . "%')";
    }
     
    $WHERE = 'WHERE '.implode(' AND ', $sql);
    ça permet d'éviter différentes variables pour tester si tu as plusieurs mot-clés, etc., ou encore de changer ton AND en OR plus facilement

  3. #3
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Merci pour ta réponse rapide et pour ton code qui fonctionne parfaitement bien (pour le gras). Je ne pratique pas trop le pipe, je dois dire, sauf en double sur des conditions.

    Je suis preneur d'une optimisation de la clause WHERE mais j'ai une erreur sur la première ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    syntax error, unexpected T_DOUBLE_ARROW, expecting T_VARIABLE or '$'

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Effectivement, j'ai mis une flèche de trop dans le foreach

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach($motrecherche as $data)   {

  5. #5
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Ah oui, en effet, je n'ai même pas vu non plus...

    Bon, du coup, plus d'erreur mais plus de résultat non plus
    Voici un récap du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $motrecherche=explode(" ",$motcle);
    foreach($motrecherche as $data)   
    { 
    $sql[] = " (titre LIKE '%" . $data . "%' OR texte LIKE '%" . $data . "%')"; 
    }
    $WHERE = 'WHERE '.implode(' AND ', $sql);
    $requete = mysql_query ("SELECT * FROM matable $WHERE");

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Bizarre, est-ce que ça vient pas du changement de nom de champ que t'aurais fait entre-temps ? 'texte' et 'description', car les 2 codes donnent bien le même résultat :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    $motcle = "eeeee rrrrrr ttttttttt uuuu";
    $motrecherche=explode(" ",$motcle);
    foreach($motrecherche as $data)
    {
    $sql[] = " (titre LIKE '%" . $data . "%' OR texte LIKE '%" . $data . "%')";
    }
    $WHERE = 'WHERE '.implode(' AND ', $sql);
    echo $WHERE.'<hr>';
     
    // donne : 
    // WHERE (titre LIKE '%eeeee%' OR texte LIKE '%eeeee%') AND (titre LIKE '%rrrrrr%' OR texte LIKE '%rrrrrr%') AND (titre LIKE '%ttttttttt%' OR texte LIKE '%ttttttttt%') AND (titre LIKE '%uuuu%' OR texte LIKE '%uuuu%')
     
    $motrecherche=explode(" ",$motcle);
    $WHERE = "WHERE";
    $count = 0;
    reset ($motrecherche);
    while(list($key, $data) = each($motrecherche))
    {
    $count = $count + 1;
    if ($count == 1)   $WHERE .= " (titre LIKE '%" . $data . "%' OR texte LIKE '%" . $data . "%')";  // recherche sur un mot
    else $WHERE .= " AND (titre LIKE '%" . $data . "%' OR texte LIKE '%" . $data . "%') "; // recherche sur plusieurs mots
      }
     
      echo $WHERE.'<hr>';
     
    // donne :
    // WHERE (titre LIKE '%eeeee%' OR texte LIKE '%eeeee%') AND (titre LIKE '%rrrrrr%' OR texte LIKE '%rrrrrr%') AND (titre LIKE '%ttttttttt%' OR texte LIKE '%ttttttttt%') AND (titre LIKE '%uuuu%' OR texte LIKE '%uuuu%')

  7. #7
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    De mon côté, je n'ai toujours aucun résultat avec ton code mais j'en ai avec le deuxième. Même en collant les codes que tu as posté (avec ee rr tt...).

    EDIT : non c'est bon, c'est le nom "sql" qui posait problème... En renommant la variable, ça fonctionne. Merci !

  8. #8
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Concernant l'injection sql, je contrôle ma variable avec mysql_real_escape_string. C'est suffisant ?

  9. #9
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Suffisant, je sais pas mais c'est déjà pas mal

  10. #10
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Ok Merci encore pour tout.

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

Discussions similaires

  1. [XL-2003] Afficher les résultats d'une recherche dans une listbox
    Par sword56 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 31/03/2012, 21h24
  2. Afficher les résultats d'une recherche dans un TREEVIEW
    Par buddyMick dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/09/2010, 23h53
  3. Souligner les mots dans les documents après une recherche
    Par Watier_53 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/06/2008, 11h50
  4. Réponses: 7
    Dernier message: 21/09/2006, 09h44

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