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 :

Base sql recherche sur plusieurs mots clés à partir d'un formulaire


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut Base sql recherche sur plusieurs mots clés à partir d'un formulaire
    Bonjour
    J'ai un formulaire sur lequel je saisis le mot à rechercher. Cela fonctionne.
    Si je tape Livre cela fonctionne
    Si je tape Revue également.
    Mais je voudrais avoir les champs contenant Livre ET Revue ou Livre OU Revue.
    J'ai essayé pas mas de combinaisons du type Livre "AND" Revue mais sans résultat.
    Quelqu'un connaitrait il une solution ?
    Par avance merci
    Jean-Claude

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Bonjour,

    Avez-vous essayé une requête comme celle-là ?
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from tableName where colonne1=motRecherche or colonne2=motRecherche

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Merci pour votre réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "SELECT * FROM $tablebib WHERE auteur LIKE '%$recherche%' OR titre LIKE '%$recherche%' ORDER BY auteur";
    Il n'y a qu'une case pour la saisie de la recherche
    Cordialement
    jclaude

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Bonjour,
    Normalement ta requête est correcte et devrait te remonter les lignes ayant le titre et/ou l'auteur contenant le mot recherché, parce que lorsque les deux colonnes contient le mot recherché la condition avec or est toujours vraie.

    Attention aussi aux injections SQL, il faut préparer la requête ou utiliser mysqli_real_escape_string pour la sécuriser.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Oui la requete fonctionne.
    J'ai un titre qui s'appelle : La vérité sur le grand blocus.
    Si je tape vérité il sort, si je tape blocus aussi.
    Je voudrais qu'en tapant vérité et blocus il sorte également. J'ai vu des bases où cela fonctionne en mettant "AND" ou "OR" ou "&" entre les 2 mots.
    Merci
    cordialement
    Jean-Claude

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 703
    Par défaut
    pour utiliser des mots clés dans le champs de recherche, il faut analyser la chaine pour la décomposer en utilisant éventuellement une grammaire.
    une autre solution serait de rajouter un champ "titre et contenu" / "titre ou contenu".

  7. #7
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Bonjour,

    Vous pouvez combiner explode et implode et une expression régulière pour arriver au résultat souhaité :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //récupérer le/les mot(s)
    $mots=$_POST["mot"];
    //séparer les mots par l'opérateur "|" qui sera utilisé dans l'expression régulière
    $mots=implode("|",explode(" ",$mots));
    //Préparation de la requête
    $stmt=$pdo->prepare("select * from $tablebib where auteur rlike :mots or titre rlike :mots ");
    //exécution
    $result=$stmt->execute([":mots"=>$mots]);

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    OK. Merci.
    Et qu'est ce que je dois taper pour avoir les titres contenant "vérité" et "blocus" ?
    cdlt
    jclaude

  9. #9
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Bonjour,

    écris les deux mots en les séparant par un espace.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Je n'arrive pas à modifier ma réquête.
    Si quelqu'un peut m'aider, par avance merci.
    Cdlt
    jclaude

    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
    $recherche=$_POST['chaine']; 
     echo "<span class = 'bloc-bleu100gras-centre'>Recherche sélective dans la base de l'expression : </span>";
     echo "<span class = 'bloc-bleu100italique-centre'>".$recherche.    "</span><br>";
     
     $sql = "SELECT * FROM $tablebib WHERE auteur LIKE '%$recherche%' OR titre LIKE '%$recherche%' ORDER BY auteur";
    $requete = mysqli_query( $cnx, $sql) or die( "ERREUR MYSQL numéro: ".mysqli_errno()."<br>Type de cette erreur: ".mysqli_error()."<br>\n" );
    echo( "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" align=\"center\">\n" );
    echo( "<tr>
    <td><div align=\"center\"><b>Auteur</b></div></td>
    <td><div align=\"center\"><b>Titre</b></div></td>
    <td><div align=\"center\"><b>Classement</b></div></td></tr>" );
     
    $nblignes=0;
     while( $result = mysqli_fetch_array( $requete ) )
    {
    $nblignes=$nblignes+1;
    echo( "<tr>\n" );
    echo( "<td><div align=\"left\">".$result["auteur"]."</div></td>\n" );
    echo( "<td><div align=\"left\">".$result["titre"]."</div></td>\n" );
    echo( "<td><div align=\"left\">".$result["libelcote"]."</div></td>\n" );
    echo( "<td><div align=\"left\">".$result["numero"]."</div></td>\n" );
    echo( "</tr>\n" );
    }
    echo "<span class = 'bloc-bleu100gras-centre'>Nombre de livres :  $nblignes</div><p>"; 
    echo( "</table><br>\n" );
    ?>

  11. #11
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Bonjour,

    Essaies ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $recherche=mysqli_real_escape_string($cnx,$_POST['chaine']);
    $recherche=implode("|",array_filter(explode(" ",$recherche)));
    $sql = "SELECT * FROM $tablebib WHERE auteur RLIKE '$recherche' OR titre RLIKE '$recherche' ORDER BY auteur";
    //Pas de changement pour le reste du code...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Merci
    La transformation des espaces en | fonctionne bien.
    Mais il y a un message d'erreur Mysql . Ce message d'erreur disparait en mettant '%$recherche%' au lieu de $ recherche, mais on n'a aucun enregistrement sélectionné.
    Je continuerai à chercher demain.
    Merci et bonne soirée.
    jclaude

  13. #13
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    il ne faut pas utiliser les pourcentages % avec RLIKE, notes bien que RLIKE est différent de LIKE.

    Sinon quel est le message d'erreur?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Voici l'erreur. Aucun numéro

    B I B L I O T H E Q U E

    ERREUR MYSQL numéro:
    Type de cette erreur:
    et voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //$recherche=$_POST['chaine']; 
     
     
     //$sql = "SELECT * FROM $tablebib WHERE auteur LIKE '%$recherche%' OR titre LIKE '%$recherche%' ORDER BY auteur";
     
    $recherche=mysqli_real_escape_string($cnx,$_POST['chaine']);
    echo $recherche;
    $recherche=implode("|",explode(" ",$recherche));
    echo $recherche;
    $sql = "SELECT * FROM $tablebib WHERE auteur RLIKE $recherche OR titre RLIKE $recherche ORDER BY auteur";
    //Pas de changement pour le reste du code...
     
    $requete = mysqli_query( $cnx, $sql) or die( "ERREUR MYSQL numéro: ".mysqli_errno()."<br>Type de cette erreur: ".mysqli_error()."<br>\n" );
    Merci
    jclaude

  15. #15
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Rajoutes les simples quotes autour de .

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Super
    Grand merci Toufik.
    Le | correspond à "OU". Et si je voulais "ET" que faut il mettre ?
    Merci
    jclaude

  17. #17
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Vous n'avez pas besoin de "ET", car le "ET" fait déjà partie de "OU".

    n'oubliez pas d'ajouter array_filter si jamais vous mettez plusieurs espaces successifs entre les mots.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    En tapant vérité blocus j'ai les titres qui contiennent l'un ou l'autre de ces mots, ou les 2.
    Mais comment faire si je ne voulais que les titres qui contiennent les 2 mots ?

  19. #19
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 537
    Par défaut
    Dans ce cas, vous devriez séparer les éléments du tableau des mots par les mots clés mysql :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $recherche=mysqli_real_escape_string($cnx,$_POST['chaine']);
     
    //séparer les éléments du tableau par un espace, puis supprimer les valeurs vides.
    $f=array_filter(explode(" ",$recherche));
     
    $sousSql="(titre rlike '".implode("' and titre rlike '",$f)."')"
    ." or (auteur rlike '".implode("' and auteur rlike '",$f)."')";
     
    $sql = "SELECT * FROM $tablebib WHERE $sousSql ORDER BY titre";
     
    //afficher la requête pour vous assurer qu'elle est correcte
    echo $sql."<br />";
    //le reste du code....

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 116
    Par défaut
    Vraiment merci beaucoup pour votre patience.
    .... mais cela ne fonctionne toujours pas. Voici le résultat :

    B I B L I O T H E Q U E

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM bibliotheque WHERE (titre rlike 'vérité' and titre rlike 'blocus') or (auteur rlike 'vérité' and auteur rlike 'blocus') ORDER BY name
    ERREUR MYSQL numéro:
    Type de cette erreur:

Discussions similaires

  1. [AC-2007] Recherche sur plusieurs mots clés fonction ET
    Par Kromai dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/06/2011, 10h21
  2. [MySQL] Recherche sur plusieurs mots clés
    Par loupsolitaire dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/10/2008, 18h48
  3. Recherche sur plusieurs mots-clés
    Par Freedolphin dans le forum Installation
    Réponses: 3
    Dernier message: 10/12/2007, 03h11
  4. Moteur de recherche et plusieurs mots clés
    Par jack1234 dans le forum Langage
    Réponses: 13
    Dernier message: 14/12/2005, 11h29
  5. Réponses: 6
    Dernier message: 04/11/2005, 18h09

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