Au secour ! moteur de recherche

Fermé
lirycs78 Messages postés 103 Date d'inscription vendredi 7 juillet 2006 Statut Membre Dernière intervention 7 janvier 2010 - 28 août 2008 à 02:08
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 28 août 2008 à 10:58
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.
A voir également:

1 réponse

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
28 août 2008 à 10:58
Bonjour,

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.
-1