Au secour ! moteur de recherche
lirycs78
Messages postés
106
Statut
Membre
-
kij_82 Messages postés 4102 Date d'inscription Statut Contributeur Dernière intervention -
kij_82 Messages postés 4102 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.
Configuration: Windows XP Firefox 3.0.1
A voir également:
- Au secour ! moteur de recherche
- Copernic moteur de recherche - Télécharger - Navigateurs
- Google moteur de recherche page d'accueil - Guide
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Le fichier pdf à télécharger est disponible avec le même nom sur le site de bell canada. mais vous ne le trouverez pas directement avec un moteur de recherche… quelle est l’url de ce fichier pdf sur le site web de bell canada ? - Forum Réseaux sociaux
- Copernic Desktop Search - Télécharger - Utilitaires
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.