petit moteur de recherche

Mammouth du PHP | 558 Messages

06 avr. 2008, 21:30

attention si vous l'utilisez penser à àjouter la securité car j'ai volontairement retiré les securités pour eviter de faire apparaitre les failles.
je vous met le code ci-dessous.
vue que vous m'avez pas mal aidé et aiguillé je vous offre le code du moteur de recherche que j'ai créé.
un grand merci a tous.
 <?php
//connectio bd
mysql_connect('localhost','root','');
mysql_select_db('base_de_donnee');
//on verifie si le champs n'est pas vide
if($_POST['recherche']==NULL) { echo'le champs recherche est vide.'; exit(); }
$recherch = $_POST['recherche'];
$recrherche_produit = $_POST['recherche'];
// On supprime les accents et on remplace les c en s ainsi que tout charactere speciaux
$replace=array('à','â','ä','ç','c','è','é','ê','ë','î','ï','y','ô','ö','ù','û','ü',"'",'&','"','<','>','=','-','_','/',':',';',',','.','?','(',')','\\');
$by=     array('a','a','a','s','s','e','e','e','e','i','i','i','o','o','u','u','u',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
$recherch = str_replace($replace,$by,$recherch);
//on met tout en minuscule
$recherch = strtolower($recherch);
//on supprime les doubles characteres
$recherch = preg_replace('`(.)\1`', '$1', $recherch);
//on enleve les terminaison se finissant pat "t","d","s","x"
$recherch = preg_replace( '`[s]$`', ' ', $recherch);
$recherch = preg_replace( '`[tdxe]$`', ' ', $recherch);
$recherch = preg_replace( '`[s] `', ' ', $recherch);
$recherch = preg_replace( '`[tdxe] `', ' ', $recherch);
//on ajoute le mots ragout et le charactere & a la fin de la variable
$recherch1="".$recherch."ragout&";
//on supprime les espaces en trop
$recherch1 = preg_replace('/\s\s+/', ' ', $recherch1);
//on supprime le mot ragout et le charactere & si celui ci est preceder d'un espace.
$recherch1=str_replace(' ragout&','',$recherch1);
//on supprime le mot ragout et le charactere & si celui ci n'est pas preceder d'un espace.
$recherch1=str_replace('ragout&','',$recherch1);
//on remplace les espace par des des "|" pour préparer la recherche d'expretion reguliere
$recherch1=str_replace(' ','|',$recherch1);
echo''.$recherch1.'
<br>
r&eacute;sultat de votre recherche sur: <b>'.$recrherche_produit.'</b><br>
<br>';
$i=0;
//on compte le nombre de resultat obtenu pour l'afficher
$nb_resultat1=mysql_query("SELECT COUNT(*) FROM produit WHERE MATCH recherche AGAINST ('$recherch') OR recherche REGEXP '$recherch1'") or die(mysql_error());
$nb_resultat=mysql_fetch_assoc($nb_resultat1);
$nbres=$nb_resultat['COUNT(*)'];
//on fait la recherche pour en sortir les valeurs
$resultat1=mysql_query("SELECT * FROM produit WHERE MATCH recherche AGAINST ('$recherch') OR recherche REGEXP '$recherch1'") or die(mysql_error());
//si on a un nombre de reponse inferieur a 1 on affiche qu'il n'y a pas de resultat
if($nbres < 1) { echo'pas de r&eacute;sultat sur la recherche: <b>'.$recrherche_produit.' '.$recherch.'</b>'; }
//sinon on affiche le nombre de resultat.
else { echo'il y a '.$nbres.' resultat';
while($resultat=mysql_fetch_assoc($resultat1))
{
extract($resultat);
//si on veut afficher la position du resultat
$i++;
//entrée les resultat que vous voulez en sortir
}}
?>
Modifié en dernier par hakazizi le 07 avr. 2008, 10:33, modifié 4 fois.

ViPHP
ViPHP | 4674 Messages

06 avr. 2008, 23:09

Hey.

Un exemple d'utilisation serait le bienvenu, avec également, des commentaires dans ton code.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 4039 Messages

06 avr. 2008, 23:57

C'est dingue, mais a quoi peut servir le fait d'enlever les t,d,s et x ?

D'habitude, qu'un moteur corrige l'input, c'est acceptable. Mais qu'il le fausse ? (et pourquoi y'a du ragout pourquoi ?)

J'aime pas ce rôle, mais je m'y force. Désolé d'être critique, mais je vois pas l'utilité, ni ce qu'on y gagnerait.. tu exploites pas du tout les possibilités de recherche (recherche booléenne[1] ? expanded query[2] ?). Tu enlèves certaines informations (selon la configuration, MySQL gère les lettres accentuées (ou pas. Elle les désaccentue à mon avis)), tu "fausse" les recherches (avec en parallèle un truc avec du ragout), et ce n'est pas vraiment un moteur de recherche, plutôt un filtre. Ce n'est ni une fonction, ni un objet, difficilement réutilisable...

Mais je veux pas être incendiaire. Tu as sans doute appris des chôses en l'écrivant, et c'est très bien, ce qu'il y a de mieux à faire. Et la je sais de quoi je parle, vu que j'ai suivi le même chemin (enfin, ceci dit, j'ignorais complètement l'existance de la recherche fulltext de MySQL. Je me suis tapé un moteur de recherche, avec indexation, classement des mots selon leur relevance et unicité, et gestion du score selon la présence et l'écart des mots. Tout ça pour faire des recherches dans la consitution belge :oops: ...).

Ce que je mets en question, c'est le geste de présenter ce code (en même temps, c'est s'ouvrir à des critiques, c'est cruel, je sais, j'espère faire une critique constructive et enrichissante, et pas simplement gratuite). Je ne veux ni être démotivant, cruel ou quoi que ce soit, je suis même sur que je suis bien moins bon programmeur que beaucoup d'autres de ce forum, mais il y a certaines chôses à prendre en compte. L'internet regorge de bouts de codes, de "scripts", qui jonchent littéralement chaque site un tant soit peu dédié à un langage. Des bons, des mauvais, de tout. C'est par leur valeur pédagogique qu'il faut les traiter. Soit de la manière dont ils sont commentés, expliqués, soit par la maestria avec laquelle ils sont organisés, structurés.. Mais ici, je ne vois rien de ça. Je ne compte même plus le nombre de fois que j'ai préféré ne pas divulguer, puisque je savais bien que c'était "pas bon". Que personne n'y verrait d'utilité. Et de toute façon, il s'agissait de morceaux "d'apprentissage". Des scripts sur lesquels je m'étais fait les dents, et ça, c'est pas toujours joli joli a voir, a moins d'avoir profondément remanié le script, dans l'intention de le montrer, de s'ouvrir, de se mettre à nu. Même pour les quelques-uns que j'ai mis, je doute fort de leur véritable utilité, voir de leur potentiel pédagogique (quasi nul, sisi).

Après ça, autre chôse. Je connais le truc de "tiens, je vais faire ça, ça va être bien". On s'enferme dans son coin, et on fait. Mais, le truc, c'est que dehors, ça se fait depuis des lustres, et qu'on est déjà moins bien. C'est jamais très chouette de se confronter à "l'extérieur", à d'autres. Pendant 6 à 7 ans, j'ai progressé dans mon coin. Seul, à faire mes scripts inutiles, jamais utilisés, à me faire les dents. Ce n'est que depuis quelques mois que je suis sorti, que je me suis confronté à d'autres. Et encore, je suis pas très loin.

Juste pour dire qu'il faut, pendant un bon bout de temps, "ingérer". Intérioriser. Avant de vouloir "produire" quelque chôse, d'offrir en retour. Mais, je prends tout ça un peu trop au sérieux à mon avis (c'est dimanche soir en même temps), ce n'est jamais qu'un petit script qui t'es utile, et on est sur un forum ou on partage des trucs qui nous sont utiles.

Pour terminer, une autre façon d'approcher le problème aurait été de demander ce qui serait bien, pour un tel moteur, et de discuter sur les façons de l'implenter. On est sur un forum, on dialogue. C'est bien plus intéressant de discuter sur les façons d'organiser, de structurer et de programmer que de simplement résoudre un problème aussi. Pour nous aussi, c'est plus chouette de donner du conseil à quelqu'un qui le demande. D'habitude, on doit s'en tenir à forcer quelques conseil lors de la résolution d'un souci, qui ne sont malheureusement pas toujours suivis. On aurait pu discuter sur les différentes méthodes, sur ce qui existe, et au final tu aurais appris bien plus, sans doute plus que ce qui t'aurais été utile, mais en tout cas tu aurais eu une meilleure idée de la problématique, et sur les façons de le résoudre. On n'est pas que des débuggeurs, php en a un d'intégré (suffit de le comprendre). On est des gens qui travaillent quotidiennement avec les mêmes langages, qui coinçons sur des problèmes, on a une expérience assez large que pour pouvoir conseiller d'autres personnes. En plus ici, avec nos horizons propres à chacun, l'expérience totale doit être.. pas mal énorme.

On a du vécu, et on ne demande qu'a ce que d'autres puissent profiter (pour un jour, à leur tour, partager). Et ça, ça va quand même plus loin que de dire "c'est un problème de short tags".

(hum, désolé pour l'exposé.. je suis loquace ce soir.. 8-) )
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Mammouth du PHP | 558 Messages

07 avr. 2008, 10:18

il 'est vrai que c'est un peu beaucoup "bricoler".
si je retire les lettre accentuer et les modifie les c en s les y en i etc...
c'est pour avoir un max de reponse.
j'ai modifier le champs en fulltxt pour lui donner la meme forme donc pour un humain devenu totalement illisible.
mais pas pour une machine qui ne fait que des comparaisons.
je vais l'integrer a ma boutique de vente de vetement sur le web.
le ragout est la juste pour etre supprimer c'est paradoxal mais logique.
je lui est ajouter également le charactere "&" à la fin.
si c'est un espace qui se trouve a la fin le regexp va me mettre une erreur j'ai donc trouver cette solution.
si j'ai choisi le mots ragout ce n'est pas tout a fait par hasard.
c'est qu'il y a tres peu de chance que quelqu'un tape le mot ragout sur un site de vetement.
voila en fait j'ai pas mal galerer a rechercher dans les fonction ce qui pouvait-etre utile ou non.
et j'ai utiliser ma methode qui consiste a essayer tout et n'importe quoi jusqu'a ce que cela fonctionne.
Hey.
Un exemple d'utilisation serait le bienvenu, avec également, des commentaires dans ton code.
pour ce qui est de l'exemple d'utilisation.
taper le mot 'orien' 'oriend' 'oriens' ou 'orient' cela trouvera le mot orient et le mot oriental ou orientale'.
pour les commentaire je les ajoutes

ViPHP
ViPHP | 4674 Messages

07 avr. 2008, 12:25

Pour rejoindre ce qu'a dit Berzemus, moi je n'ai même pas pris le temps de lire ton code. Pas de fonction, pas de méthodes, pas d'objets. À première vue, ça relève plus de la bidouille que d'une réelle méthode.

Les moteurs de recherches pour les bases de données, je ne m'y connais pas, mais je sais que les systèmes de recherches proposés par les différents systèmes de gestion de bases de données relationnelles ou objets sont très suffisamment puissants.

Un moteur de recherche intéressant serait sur des fichiers par exemple. Là on ferait intervenir l'algorithmique du texte et ça commencerait à être très sympa.

Conseil donc : un script, une classe, une application etc. — même s'il n'est pas meilleur que les autres — sera largement plus utilisé s'il est extrêmement bien documenté et intégrable n'importe où et dans n'importe quelle condition.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 4039 Messages

07 avr. 2008, 12:32

mais si on tape orintale, ça trouve quoi ?

On a peut-être aussi oublié de t'orienter vers mnoGoSearch (Lien vers php.net), qui est un moteur de recherche des plus complèts, avec correcteur orthographique et tout et tout (mais que je n'ais pas encore essayé, ceci dit.. quelqu'un en a fait l'expérience ?)
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

ViPHP
ViPHP | 4674 Messages

07 avr. 2008, 12:40

Waho j'avais lu MSNGoSearch, j'ai eu peur ! Mais non, je ne connaissais même pas ce module ... Intéressant ? Je vais y jeter un œil.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 4039 Messages

07 avr. 2008, 12:53

MSNGoSearch
:langue:

Image
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

07 avr. 2008, 13:08

attention si vous l'utilisez penser à àjouter la securité car j'ai volontairement retiré les securités pour eviter de faire apparaitre les failles.
comprend pas trop ?!

Pour ne pas faire voir les failles (aux débutants) autant les ignorer... est-ce ta réflexion ? :?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 4674 Messages

07 avr. 2008, 13:11

Ce que j'ai compris c'est que pour pas que les gens voient les failles de son système, il a tout enlevé. Ça évite de se faire hacker par la suite car il utilise son script sur son site j'imagine. Mais bon, c'est pas plus intelligent :?.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 558 Messages

07 avr. 2008, 13:47

c'est pour eviter que si un hacker passe par la trouve une faille et s'y engouffre.
et je sait qu'il y en a.
car je sait qu'aucun systeme est "sans faille".
EDIT
bon OK je vais tout mettre securité comprise. j'ai compris qu'il est préferable de faire voir la securité pour en discuté.
et voir qu'elles sont les failles oublier afin de les combler merci Truc et HyWaN de m'avoir fait comprendre cela.
voila le formulaire
<?php
if($_POST['valeur']==NULL) { echo'<form action="moteur1.php" method="post" target="_blank">'; }
else  { echo'<form action="moteur1.php" method="post" >'; }
?>
votre recherche:<input name="recherche" value="<?php echo"$recrherche_produit"; ?>">
<input type="hidden" name="valeur" value="15698456258885">
<button type="submit">rechercher</button>
et le traitement que j'ai encore un peu modifier.
<?php
include("php/connectionbd.php");
//on supprime tout charactère "dangeureux" avant affichage
$replace=array("'",'&','"','<','>','=','-','_','/',':',';',',','.','?','(',')','\\');
$by=     array(' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
$recrherche_produit = str_replace($replace,$by,$_POST['recherche']);
echo'&Eacute;ffectuez une nouvelle recherche<br>';
include("moteur.php");
if($_POST['recherche']==NULL OR $_POST['recherche'] == ' ') { echo'le champs recherche est vide.'; exit(); }
$replace=array("'",'&','"','<','>','=','-','_','/',':',';',',','.','?','(',')','\\');
$by=     array(' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
$recrherche_produit = str_replace($replace,$by,$_POST['recherche']);
// On supprime les accents et on remplace les c en s ainsi que tout charactere speciaux
$replace=array('à','â','ä','ç','c','è','é','ê','ë','î','ï','y','ô','ö','ù','û','ü',"'",'&','"','<','>','=','-','_','/',':',';',',','.','?','(',')','\\');
$by=     array('a','a','a','s','s','e','e','e','e','i','i','i','o','o','u','u','u',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ');
$recherch = str_replace($replace,$by,$_POST['recherche']);
//on met tout en minuscule
$recherch = strtolower($recherch);
//on supprime les doubles characteres
$recherch = preg_replace('`(.)\1`', '$1', $recherch);
//on enleve les terminaison se finissant pat "t","d","s","x"
$recherch = preg_replace( '`[s]$`', ' ', $recherch);
$recherch = preg_replace( '`[tdxe]$`', ' ', $recherch);
$recherch = preg_replace( '`[s] `', ' ', $recherch);
$recherch = preg_replace( '`[tdxe] `', ' ', $recherch);
//on ajoute un mots suivi d'un "&" a la fin de la variable
$recherch1="".$recherch."ragout&";
//on supprime les espaces en trop
$recherch1 = preg_replace('/\s\s+/', ' ', $recherch1);
//on retire le mots que l'on a ajouté si il a un espace avant
$recherch1=str_replace(' ragout&','',$recherch1);
//on retire le mots que l'on a ajouté si il ni a pas d'espace avant
$recherch1=str_replace('ragout&','',$recherch1);
//on prepare la variable pour la fonction REGEXP
$recherch1=str_replace(' ','|',$recherch1);
echo'<br>
R&eacute;sultat de votre recherche sur: <b>'.$recrherche_produit.'</b><br>
';
$i=0;
//on compte le nombre de resultat obtenu si la requete echoue pour evité ue erreur affihe on arrete le script et on dit que la recherche n'as rien donné
$nb_resultat1=mysql_query("SELECT COUNT(*) FROM produit WHERE MATCH recherche AGAINST ('$recherch') OR recherche REGEXP '$recherch1'") or die('Pas de r&eacute;sultat sur la recherche: <b>'.$recrherche_produit.'</b>');
$nb_resultat=mysql_fetch_assoc($nb_resultat1);
$nbres=$nb_resultat['COUNT(*)'];
//si la recherche n'as rien donnée on affiche exactement le meme message que celui de l'erreur sql ou on annonce le nombre de resultat
if($nbres < 1) { echo'Pas de r&eacute;sultat sur la recherche: <b>'.$recrherche_produit.'</b>'; }
else { echo'Il y a '.$nbres.' r&eacute;sultat'; if($nbres > 1) { echo's'; }
echo'<table border="1">';
$resultat1=mysql_query("SELECT * FROM produit WHERE MATCH recherche AGAINST ('$recherch') OR recherche REGEXP '$recherch1'");
while($resultat=mysql_fetch_assoc($resultat1))
{
extract($resultat);
//si on veut afficher l position du resultat
$i++;
//entrée les information a sortir.
}
?>