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 :

moteur de recherche avec plusieurs mots clés


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut moteur de recherche avec plusieurs mots clés
    bonjour,
    je souhaite faire un moteur de recherche sur mon site, j'ai fait des recherches sur internet et j'ai trouvé un scripts, mais il ne gère qu'un seul mot clé!!
    alors que moi je veux faire une recherche pour plusieurs mots clé!!!
    comment faire?
    C'est très important pour moi cette recherche, merci.

  2. #2
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Salut !

    Pour plusieurs mots clés? Je n'ai même pas essayé avec un seul mais j'imagine que tu as une table dans ta base avec des sortes de mot clés menant vers les pages qu'il faut ?

    Enfin je sais pas comment ca marche mais sinon voila si ca marche par BDD (ce qui est surement le cas :

    tu explode la chaine de recherche sur les espaces comme ca tu récupère chaque mot clés, et après ben tu fais une requete avec des LIKE ... Déjà explique nous comment s'effectue une recherche sur un mot clé

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut j'ai un trouvé un script pour un seul mot clé
    oui c'est vrai il nécessite une table avec 3 champs: lien, keywords et titre, voilà le script principale qui parcours les fichiers et insère le contenue des balises méta dans la table:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    function ScanDir($Directory){
    $MyDirectory = opendir($Directory);
     while($Entry = readdir($MyDirectory)) {
       /*  vérifie que le fichier n'est pas un répertoire  */
      if(is_dir($Entry)&& $Entry != "." && $Entry != ".." ) {
        ScanDir("$Entry/$Directory" );
      }
      else {
        /*  type de fichiers qui seront indexés  */
        if (eregi(".php",$Entry)) { //
          $MetaTags = get_meta_tags($Directory."/".$Entry);
          /*  requete d'insertion du fichier dans la table  */
     
     
     
    /*if (!isset($MetaTags["robots"])) { die ($Directory."/".$Entry . ' pas de metatags robots'); }
    */ 
     
          if ($MetaTags["robots"] == "all" )
     
    	   {
            $MetaKey = $MetaTags["keywords"];
            //$MetaKey = strtoupper($MetaKey);   est-ce utile?
            $MetaTitre = $MetaTags["description"];
    		$query      = " ALTER TABLE search AUTO_INCREMENT=0";
    $mysql_result = mysql_query($query) or die (" Erreur de modification de la table par la requete \"$query\"" ); 
            $query = "INSERT INTO search (lien,keyword,titre)
                      VALUES(\"$Directory/$Entry\",\"$MetaKey\",\"$MetaTitre\" )";
            $mysql_result = mysql_query($query) or die ("<br><br><b>Erreur de modification de la table par la requete</b><br> \"$query\"" );
          }
        }
      }
     }
    closedir($MyDirectory);
    }
    $open_basedir="..";
    ScanDir("." );
    ensuite ya un deuxième script qui fait la recherche sur cette table pour afficher le résultat et je pense que c'est dans la requête sql qu'il modifier pour que ça traite plusieurs mots clé,
    voilà le deuxième script:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
    mysql_connect($host, $user, $password) or die ("Connexion au serveur impossible");
     
    // on choisit la bonne base
    mysql_select_db($bdd) or die ("Connexion a la base impossible");
     
    echo "
    <html>
    <body>";
    $Mot=$_REQUEST["Mot"];
    if (($Mot == "")||($Mot == "%")) {
    // Si aucun mot clé n'a été saisi,
    // le script demande à l'utilisateur
    // de bien vouloir préciser un mot clé
     
    	echo "
    	Veuillez entrer un mot clé s'il vous plaît!
    	<p>";
     
    }
     
    else {
    $query = "SELECT distinct count(lien) FROM search
    	WHERE keyword LIKE \"%$Mot%\"
    	OR titre LIKE \"%$Mot%\"
    	";
     
    	$result = mysql_query($query);
     
    	$row = mysql_fetch_row($result);
     
    	$Nombre = $row[0];
     
    // Si aucun enregistrement n'est retourné,
    // on affiche un message adéquat
    if ($Nombre == "0") {
    	echo "
    	<h2>Aucun résultat ne correspond à votre recherche</h2>
     
    	<p>
     
    	";
     
    }
     
    // Sinon, on affiche le nombre d'enregistrements correspondant
    // et les résultats eux-mêmes
    else {
    	$query = "SELECT distinct lien,keyword,titre FROM search
    	WHERE keyword LIKE \"%$Mot%\"
    	OR titre LIKE \"%$Mot%\" ORDER by titre ASC";
     
    	$result = mysql_query($query);
     
    	// Si un seul enregistrement est trouvé, on affiche un message au singulier
    	if ($Nombre == "1") {
    	echo "
    	<a name=\"#resultat\"><h2>Résultat: Un article trouvé</h2></a>
     
    	<p>";
     
    	}
    	// Dans le cas contraire le message est au pluriel...
    	else {
    	echo "
    	<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a>
     
    	<p>";
     
    	}
    	while($row = mysql_fetch_row($result))
    	{
    		echo "
    		<p>\n
    		<b>$row[2]</b>\n
    		<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
    		<p>\n
    		";
     
    	}
    }
     
    }
     
    // on ferme la base
    mysql_close();
    ?>

    ça marche bien pour un seul mot clé, mais pour plusieurs!!!!!

  4. #4
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Salut !

    Bon je vais essayer de te proposer un script sans garanti de succès comme je n'ai jamais essayé^^:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    if (($Mot == "")||($Mot == "%")) {
    // Si aucun mot clé n'a été saisi,
    // le script demande à l'utilisateur
    // de bien vouloir préciser un mot clé
     
    	echo "
    	Veuillez entrer un mot clé s'il vous plaît!
    	<p>";
     
    }
     
    else {
    //on enleve les espaces avant et apres la chaine
    $mot=trim($mot);
    //on explose la chaine si il y a différent mot clés
    $array=explode(' ',$mot);
    $query = "SELECT distinct count(lien) FROM search
    	WHERE keyword LIKE \"%$array[0]%\"
    	OR titre LIKE \"%$array[0]%\"
    	";
     
    	for ($i=1,$i<=count($array),$i++){
     
          $query.=" OR keyword LIKE \"%$array[$i]%\"
    	OR titre LIKE \"%$array[$i]%\"";
    }
     
    // Si aucun enregistrement n'est retourné,
    // on affiche un message adéquat
    if ($Nombre == "0") {
    	echo "
    	<h2>Aucun résultat ne correspond à votre recherche</h2>
     
    	<p>
     
    	";
     
    }
     
    // Sinon, on affiche le nombre d'enregistrements correspondant
    // et les résultats eux-mêmes
    else {
    	$query = "SELECT distinct lien,keyword,titre FROM search
    	WHERE keyword LIKE \"%$Mot%\"
    	OR titre LIKE \"%$Mot%\" ORDER by titre ASC";
     for ($i=1,$i<=count($array),$i++){
     
          $query.=" OR keyword LIKE \"%$array[$i]%\"
    	OR titre LIKE \"%$array[$i]%\"";
    }
    	$result = mysql_query($query);
     
    	// Si un seul enregistrement est trouvé, on affiche un message au singulier
    	if ($Nombre == "1") {
    	echo "
    	<a name=\"#resultat\"><h2>Résultat: Un article trouvé</h2></a>
     
    	<p>";
     
    	}
    	// Dans le cas contraire le message est au pluriel...
    	else {
    	echo "
    	<a name=\"#resultat\"><h2>Résultat: $Nombre articles trouvés</h2></a>
     
    	<p>";
     
    	}
    	while($row = mysql_fetch_row($result))
    	{
    		echo "
    		<p>\n
    		<b>$row[2]</b>\n
    		<br><a href=\"../$row[0]\">Visualiser l'article</a>\n
    		<p>\n
    		";
     
    	}
    }
     
    }
     
    // on ferme la base
    mysql_close();

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut
    je suis entrain de tester le sript que tu m'a donné, mais je pense que le serveur a du mal à interpréter le code suivant;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $query = "SELECT distinct count(lien) FROM search
    	WHERE keyword LIKE \"%$array[0]%\"
    	OR titre LIKE \"%$array[0]%\"
    	";
     
    	for ($i=1;$i<=count($array);$i++){
     
          $query.="OR keyword LIKE \"%$array[$i]%\"
    	OR titre LIKE \"%$array[$i]%\"";
    	$result = mysql_query($query);
    il indique une erreur Notice: Undefined offset: 2 in c:\program files\easyphp1..;

    c'est dans la ligne suivante:
    $query.="OR keyword LIKE \"%$array[$i]%\"

    je sais as pour la syntaxe de concaténation des deux chaine de requête!!!

  6. #6
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    c'est juste que l'on dépasse l'index du tableau je crois

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ($i=1;$i<count($array);$i++){
    Ca ira surement mieux et ça pour les deux for

    EDIT : Dans tes requete aussi faut voir ce que tu souhaite donc un OR ou un AND (pour les titres par exemple)... ca je sais pas trop en revanche

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut ça marche, mais ya une deuxième erreur:
    Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource..
    c'est pour cette ligne là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while($row = mysql_fetch_row($result))
    pour la requête je préfère le or, ça marchera bien comme ça

  8. #8
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while($row = mysql_fetch_assoc($result))

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut non ça marche pas
    je t'envoie tout le code:


    <?php
    if (($Mot == "")||($Mot == "%")) {
    // Si aucun mot clé n'a été saisi,
    // le script demande à l'utilisateur
    // de bien vouloir préciser un mot clé

    echo "<h1 class=\"text_titre\">Veuillez entrer un mot clé s'il vous plaît!</h1>";

    }

    else {
    //on enleve les espaces avant et apres la chaine
    $mot=trim($Mot);
    //on explose la chaine si il y a différent mot clés
    $array=explode(' ',$mot);
    $query = "SELECT distinct count(lien) FROM search
    WHERE keyword LIKE \"%$array[0]%\"
    OR titre LIKE \"%$array[0]%\"
    ";

    for ($i=1;$i<count($array);$i++){

    $query.="OR keyword LIKE \"%$array[$i]%\"
    OR titre LIKE \"%$array[$i]%\"";
    $result = mysql_query($query);
    }

    // Si aucun enregistrement n'est retourné,
    // on affiche un message adéquat
    if ($result == "0") {
    echo "<h1 class=\"text_titre\">Aucun résultat ne correspond à votre recherche</h1>";

    }

    // Sinon, on affiche le nombre d'enregistrements correspondant
    // et les résultats eux-mêmes
    else {
    $query = "SELECT distinct lien,keyword,titre FROM search
    WHERE keyword LIKE \"%$Mot%\"
    OR titre LIKE \"%$Mot%\" ORDER by titre ASC";
    for ($i=1;$i<count($array);$i++){

    $query.=" OR keyword LIKE \"%$array[$i]%\"
    OR titre LIKE \"%$array[$i]%\"";
    }
    $result = mysql_query($query);

    // Si un seul enregistrement est trouvé, on affiche un message au singulier
    if ($result == "1") {
    echo "
    <a name=\"#resultat\"><h1 class=\"text_titre\">Résultat: Un article trouvé</h1></a>

    <p>";

    }
    // Dans le cas contraire le message est au pluriel...
    else {
    echo "
    <a name=\"#resultat\"><h1 class=\"text_titre\">Résultat: $result articles trouvés</h1></a>

    <p>";

    }
    while($row = mysql_fetch_assoc($result))
    {
    echo "
    <p>\n
    <span class=\"texte_cont\">$row[2]...</span>\n
    <br><span class=\"texte_cont\"><a href=\"../$row[0]\" class=\"mylink\">Visualiser l'article</a></span>\n
    <p>\n
    ";

    }
    }

    }

    // on ferme la base
    mysql_close();
    ?>

  10. #10
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    <?php
    if (($Mot == "")||($Mot == "%")) {
    // Si aucun mot clé n'a été saisi,
    // le script demande à l'utilisateur
    // de bien vouloir préciser un mot clé
     
    echo "<h1 class=\"text_titre\">Veuillez entrer un mot clé s'il vous plaît!</h1>";
     
    }
     
    else {
    //on enleve les espaces avant et apres la chaine
    $mot=trim($Mot);
    //on explose la chaine si il y a différent mot clés
    $array=explode(' ',$mot);
    $query = "SELECT distinct count(lien) FROM search
    WHERE keyword LIKE \"%$array[0]%\"
    OR titre LIKE \"%$array[0]%\"
    ";
     
    for ($i=1;$i<count($array);$i++){
     
    $query.="OR keyword LIKE \"%$array[$i]%\"
    OR titre LIKE \"%$array[$i]%\"";
    $result = mysql_query($query);
    }
     
    // Si aucun enregistrement n'est retourné,
    // on affiche un message adéquat
    if ($result == "0") {
    echo "<h1 class=\"text_titre\">Aucun résultat ne correspond à votre recherche</h1>";
     
    }
     
    // Sinon, on affiche le nombre d'enregistrements correspondant
    // et les résultats eux-mêmes
    else {
    $query = "SELECT distinct lien,keyword,titre FROM search
    WHERE keyword LIKE \"%$Mot%\"
    OR titre LIKE \"%$Mot%\" ORDER by titre ASC";
    for ($i=1;$i<count($array);$i++){
     
    $query.=" OR keyword LIKE \"%$array[$i]%\"
    OR titre LIKE \"%$array[$i]%\"";
    }
    $result = mysql_query($query);
     
    // Si un seul enregistrement est trouvé, on affiche un message au singulier
    if ($result == "1") {
    echo "
    <a name=\"#resultat\"><h1 class=\"text_titre\">Résultat: Un article trouvé</h1></a>
    
    <p>";
     
    }
    // Dans le cas contraire le message est au pluriel...
    else {
    echo "
    <a name=\"#resultat\"><h1 class=\"text_titre\">Résultat: $result articles trouvés</h1></a>
    
    <p>";
     
    }
    while($row = mysql_fetch_assoc($result))
    {
    echo "
    <p>\n
    <span class=\"texte_cont\">$row[2]...</span>\n
    <br><span class=\"texte_cont\"><a href=\"../$row[0]\" class=\"mylink\">Visualiser l'article</a></span>\n
    <p>\n
    ";
     
    }
    }
     
    }
     
    // on ferme la base
    mysql_close();
    ?>
    Quel est l'erreur ? Je te propose de faire ça au moment de l'exécution de la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysql_query($query) or die(mysql_error());

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 47
    Points : 36
    Points
    36
    Par défaut c'est bon ça marche
    l'erreur était dans la requête:

    $query = "SELECT distinct lien,keyword,titre FROM search
    WHERE keyword LIKE \"%$Mot%\"
    OR titre LIKE \"%$Mot%\" ORDER by titre ASC";
    for ($i=1;$i<count($array);$i++){

    $query.=" OR keyword LIKE \"%$array[$i]%\"
    OR titre LIKE \"%$array[$i]%\" ";

    il fallait metrre:

    $query = "SELECT distinct lien,keyword,titre FROM search
    WHERE keyword LIKE \"%$Mot%\"
    OR titre LIKE \"%$Mot%\" ";
    for ($i=1;$i<count($array);$i++){

    $query.=" OR keyword LIKE \"%$array[$i]%\"
    OR titre LIKE \"%$array[$i]%\" ORDER by titre ASC ";

    le order by doit être la dernière instruction


    Merci beaucoup, tu m'a était d'une grande aide.
    merci encore!

  12. #12
    Membre éprouvé Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Points : 948
    Points
    948
    Par défaut
    De rien de toute façon ce script me servira bien assez tôt

    Bref n'oublie pas le tag résolu ^^

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

Discussions similaires

  1. faire une recherche avec plusieurs mot-clés
    Par jakouz dans le forum Débuter
    Réponses: 2
    Dernier message: 16/12/2010, 13h50
  2. [MySQL] recherche avec plusieurs mots dans mon moteur
    Par hadjiphp dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/05/2009, 08h53
  3. recherche avec plusieurs mots-clé
    Par MAMANHOU dans le forum IHM
    Réponses: 6
    Dernier message: 12/07/2007, 10h05
  4. Moteur de recherche et plusieurs mots clés
    Par jack1234 dans le forum Langage
    Réponses: 13
    Dernier message: 14/12/2005, 10h29
  5. Réponses: 6
    Dernier message: 04/11/2005, 17h09

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