Au secour ! moteur de recherche
lirycs78
Messages postés
103
Date d'inscription
Statut
Membre
Dernière intervention
-
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
Bonsoir,
Sachez tout d'abord que je m'arrache les cheveux sur un truc qui je pense,n'est pas si compliquer que sa.
J'aimerais faire un script simple :
Un moteur de recherche mais sans bbd.
Un petit shema :
MOTEUR DE RECHERCHE --> envoi du mot clé --> Cherche dans le fichier .txt --> resultat trouver --> affiche le resultat
Voila pas plus compliquer que cela, mais je n'y arrive pas, soit j'utilise les mauvaise funtion soit je c'est pas je comprend a l'envers. Voici ce que j'ai coder et qui ne marche pas :'(
LE FORMULAIRE :
<form action="" method="GET">
<label>Rechercher</label><br><input type="text" name="searchname"><br>
<input type="submit" value="Envoyer">
</form>
Le code php :
function search($search){
$ligne = 1;
$pfichier = fopen("mots.txt","r");
while ($ch = fgets($pfichier, 64)) {
if ($ch == "$search"){
echo "$ch";
}
elseif ($ch != "$search"){
echo "Erreur !";
}
}
}
if (isset($_GET['searchname'])){
$search = htmlspecialchars($_GET['searchname']);
echo '<p>Mot rechercher : <valeur>'.$search.'</valeur></p>';
search($search);
}
Merci d'avance pour vos reponse.
Sachez tout d'abord que je m'arrache les cheveux sur un truc qui je pense,n'est pas si compliquer que sa.
J'aimerais faire un script simple :
Un moteur de recherche mais sans bbd.
Un petit shema :
MOTEUR DE RECHERCHE --> envoi du mot clé --> Cherche dans le fichier .txt --> resultat trouver --> affiche le resultat
Voila pas plus compliquer que cela, mais je n'y arrive pas, soit j'utilise les mauvaise funtion soit je c'est pas je comprend a l'envers. Voici ce que j'ai coder et qui ne marche pas :'(
LE FORMULAIRE :
<form action="" method="GET">
<label>Rechercher</label><br><input type="text" name="searchname"><br>
<input type="submit" value="Envoyer">
</form>
Le code php :
function search($search){
$ligne = 1;
$pfichier = fopen("mots.txt","r");
while ($ch = fgets($pfichier, 64)) {
if ($ch == "$search"){
echo "$ch";
}
elseif ($ch != "$search"){
echo "Erreur !";
}
}
}
if (isset($_GET['searchname'])){
$search = htmlspecialchars($_GET['searchname']);
echo '<p>Mot rechercher : <valeur>'.$search.'</valeur></p>';
search($search);
}
Merci d'avance pour vos reponse.
A voir également:
- Au secour ! moteur de recherche
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Google moteur de recherche page d'accueil - Guide
- Copernic moteur de recherche - Télécharger - Navigateurs
- Copernic Desktop Search - Télécharger - Utilitaires
- Recherche de pairs utorrent ✓ - Forum Téléchargement
1 réponse
Bonjour,
Ce qui ne va pas je pense c'est ta fonction de recherche. Notamment ce passage (gras) :
Tu lis 64 caractères par 64 caractères dans ton fichier. Donc à chaque lecture tu auras une chaine de caractère de 64 en taille (ou moins sur la fin). Donc si tu compare ce qui t'es retourné lors de la lecture à ce que tu cherches, tu vois bien que ça ne peut pas coller.
Un exemple simple : si tu cherche la chaine de caractère "toto" qui n'a qu'une taille de 4 et que tu lis "toto va a la plage". Lorsque tu testes une égalité stricte ==, c'est toute la chaine qui est comparée.
Une première modification serait donc de remplacer ton test par ce test là :
Ce test va regarder s'il trouve une occurence de ta chaine a trouver dans ce qui a été retourné lors de la lecture. S'il en trouve une, il retournera l'index / la position. Dans le cas où ce n'est pas trouvé, la fonction strpos retourne FALSE. Mais attention, pourquoi j'ai mis !== et pas simplement != ? Parce que !== fait une comparaison stricte avec la valeur booleen FALSE et non sa valeur numérique. On sait que FALSE équivaut au chiffre 0 et TRUE au chiffre 1. Si la position trouvée est 0 (l'occurrence à recherchée arriver en premier dans la chaine lue), le test != sera validé, alors que !== ne le sera pas (ce que nous voulons).
Ca devrait règler ton problème temporairement. Pourquoi temporairement ? parce que logiquement ton algorithme n'est pas optimal. Puisque tu lis 64 caractères par 64 caractères, tu peux très bien tombé sur le cas suivant :
- Admettons que tu recherches la chaine de caractère "toto"
- Dans ton fichier tu as exactement 128 caractères, soit deux lectures de 64 caractères. Admettons que la chaine "toto" se trouve pile a cheval sur ces deux lectures. La première lecture te retournera les 64 premiers caractères, dont à la fin les deux premiers de ta chaine "toto", à savoir "to". La deuxième lecture retournera la suite, le deuxième "to" de "toto". Conclusion : ta chaine ne sera pas trouvée et pourtant elle est bien dans ton fichier.
Solution : il faut lire tout le fichier d'un coup (ou alors concaténer son contenu dans une variable que tu stock).
Voilà la modification du code pour le faire :
Le code n'a pas été testé mais ça devrait résoudre ton problème.
Ce qui ne va pas je pense c'est ta fonction de recherche. Notamment ce passage (gras) :
function search($search){ $ligne = 1; $pfichier = fopen("mots.txt","r"); while ($ch = fgets($pfichier, 64)) { if ($ch == "$search"){ echo "$ch"; } elseif ($ch != "$search"){ echo "Erreur !"; } } }
Tu lis 64 caractères par 64 caractères dans ton fichier. Donc à chaque lecture tu auras une chaine de caractère de 64 en taille (ou moins sur la fin). Donc si tu compare ce qui t'es retourné lors de la lecture à ce que tu cherches, tu vois bien que ça ne peut pas coller.
Un exemple simple : si tu cherche la chaine de caractère "toto" qui n'a qu'une taille de 4 et que tu lis "toto va a la plage". Lorsque tu testes une égalité stricte ==, c'est toute la chaine qui est comparée.
Une première modification serait donc de remplacer ton test par ce test là :
if ( strpos($search,$ch) !== FALSE )
Ce test va regarder s'il trouve une occurence de ta chaine a trouver dans ce qui a été retourné lors de la lecture. S'il en trouve une, il retournera l'index / la position. Dans le cas où ce n'est pas trouvé, la fonction strpos retourne FALSE. Mais attention, pourquoi j'ai mis !== et pas simplement != ? Parce que !== fait une comparaison stricte avec la valeur booleen FALSE et non sa valeur numérique. On sait que FALSE équivaut au chiffre 0 et TRUE au chiffre 1. Si la position trouvée est 0 (l'occurrence à recherchée arriver en premier dans la chaine lue), le test != sera validé, alors que !== ne le sera pas (ce que nous voulons).
Ca devrait règler ton problème temporairement. Pourquoi temporairement ? parce que logiquement ton algorithme n'est pas optimal. Puisque tu lis 64 caractères par 64 caractères, tu peux très bien tombé sur le cas suivant :
- Admettons que tu recherches la chaine de caractère "toto"
- Dans ton fichier tu as exactement 128 caractères, soit deux lectures de 64 caractères. Admettons que la chaine "toto" se trouve pile a cheval sur ces deux lectures. La première lecture te retournera les 64 premiers caractères, dont à la fin les deux premiers de ta chaine "toto", à savoir "to". La deuxième lecture retournera la suite, le deuxième "to" de "toto". Conclusion : ta chaine ne sera pas trouvée et pourtant elle est bien dans ton fichier.
Solution : il faut lire tout le fichier d'un coup (ou alors concaténer son contenu dans une variable que tu stock).
Voilà la modification du code pour le faire :
function search($search,$file_name){ $content = file_get_contents($file_name); if ( strpos($search,$content) !== FALSE ) echo "<BR>trouve"; else echo "<BR>Erreur, pas trouve"; }
Le code n'a pas été testé mais ça devrait résoudre ton problème.