MOTEUR DE RECHERCHE SIMPLE DANS UNE BDD.

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 21 févr. 2005 à 14:36
R3dDragon Messages postés 62 Date d'inscription dimanche 30 juillet 2006 Statut Membre Dernière intervention 14 avril 2009 - 23 nov. 2006 à 18:28
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29683-moteur-de-recherche-simple-dans-une-bdd

R3dDragon Messages postés 62 Date d'inscription dimanche 30 juillet 2006 Statut Membre Dernière intervention 14 avril 2009
23 nov. 2006 à 18:28
Moi sa m'affiche une page blanche quand je lance ma recherche...
meego Messages postés 21 Date d'inscription lundi 14 novembre 2005 Statut Membre Dernière intervention 11 décembre 2008
23 janv. 2006 à 15:18
salut ,

moi jsui en bts info et jsuis nazz en info
et pas interésse

mais ce code est largement corretc pour une utilisation simple d'un moteur de recherche pour un mec comme moi par exemple
pas besoin de zélé a mort
jnbrunet Messages postés 258 Date d'inscription samedi 25 décembre 2004 Statut Membre Dernière intervention 13 novembre 2012
2 oct. 2005 à 22:28
erroné:
<form action="Recherche.php" method="Post">


corrigé:
<form action="Rechercher.php" method="Post">

code pas si mal pour débutant...j'ai déja vu bien mieu...manque de commantaire...etc...

Jn
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
2 sept. 2005 à 20:05
J'utilise cette fonction ;)

Voici le code (juste la partie qui cherche et celle qui trie les résultats :
Texte à rechercher : $searchText
Je cherche dans 2 champs : Title (le titre du tutoriel) et Comment (la présentation du tuto) (mes noms de champs sont pourris je sais lol)
DelAccents et DeformatText sont des fonctions qui formatte le texte (on s'en fout d'elles)

// On va séparer chaque terme
$searchText = str_replace(' ', '+', trim($searchText));
$searchTab = explode('+', $searchText);
$req = "SELECT `ID`, `IDcateg`, `IDsubcateg`, `title`, `date`, `Comment` FROM `tuto` WHERE $searchLangage(";
$reqTitle = '(';
$reqComment = '(';
foreach($searchTab as $key => $searchWord) {
if ($reqTitle != '(') $reqTitle .= ' AND ';
if ($reqComment != '(') $reqComment .= ' AND ';
$reqTitle .= "`title` LIKE '%$searchWord%'";
$reqComment .= "`Comment` LIKE '%$searchWord%'";
}
$reqTitle .= ')';
$reqComment .= ')';
$req .= $reqTitle . ' OR ' . $reqComment . ')';
$result = mysql_query($req);
$t = 0;
// Trie les résultats
while ($rs = mysql_fetch_row($result)) {
$tutoID = $rs[0];
$tutoIDCateg = $rs[1];
$tutoIDSubCateg = $rs[2];
$tutoTitle = $rs[3];
$tutoDate = FormatDate($rs[4]);
$tutoComment = $rs[5];
// Le nombre d'occurences
$searchNumber = 0;
$count = 0;
foreach($searchTab as $key => $searchWord) {
$searchNumber = $searchNumber + substr_count(strtolower(DelAccents(DeformatText($tutoTitle))), strtolower($searchWord));
$searchNumber = $searchNumber + substr_count(strtolower(DelAccents(DeformatText(InverseNl2br($tutoComment)))), strtolower($searchWord));
}
if ($searchNumber != 0) {
$resultsTab[$t] = array('PR'=>$searchNumber, 'tutoID'=>$tutoID, 'tutoTitle'=>$tutoTitle, 'tutoDate'=>$tutoDate, 'tutoIDCateg'=>$tutoIDCateg, 'tutoIDSubCateg'=>$tutoIDSubCateg);
$t = $t + 1;
}
}
// Tri du tableau
function cmp($a, $b) {
if ($a['PR'] == $b['PR']) return 0;
return ($a['PR'] > $b['PR']) ? -1 : 1;
}
if (isset($resultsTab)) {
if (count($resultsTab) != 0) {
usort($resultsTab, "cmp");
reset($resultsTab);
}
}


Mes résultats sont dans $resultsTab
40ms c'est pas bcp je trouve ??
Mais si tu le dis, alors j'ai calculé le temps vraiment sur la fonction (pas sur la page entière) et ça prend entre 15 et 20ms, ça monte bcp + si on a une recherche très très longue normal...
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
31 août 2005 à 21:04
t'as substr_count qui marche bien mieux que mon code si tu le fais en php...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
31 août 2005 à 19:19
40 ms pour 20 enregistrements c'est énorme, revois le script :-)

y'a un problème dans la requête ou autre part
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
31 août 2005 à 18:46
Fausse alerte, désolé d'avoir été si pessimiste lol.
En fait j'avais testé en local, et ça tournait autour de 200ms au total (et c'est lent chez moi)
La j'ai amélioré, j'ai le système de classement, et sur le serveur ça donne environ une execution de 20ms - 40ms (selon la complexité de la recherche) au total, pour toute la page.
Sachant que je n'ai que 20 entrée dans ma base pour l'instant...
Mais je trouve que c'est bon quand meme non ? Car le temps d'execution moyen sur mon site est de 20ms-30ms, alors ça n'alourdit pas trop quoi.
Et puis si mon script vous interesse je peux vous le montrer ou le poster (si ça ne servirai à rien, pas la peine alors) ;)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
31 août 2005 à 17:43
0.2 secondes ? ça porte le total à combien ? parce que 200 ms c'est énorme :-)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
31 août 2005 à 17:39
Euh moi j'ai rajouté dans mon moteur de recherche le meme code que coucou viens de proposer, mais je l'ai fait en php, après la recherche LIKE du code ci dessus (adapté pour supporter plusieurs mots clés), pour pouvoir classer les résultats.
L'execution de la page s'est allongée de 0.2s en moyenne mais au moins ma base de données n'a pas trop de risque de saturer car je le fait en php.
Et puis en php, on peut faire plus de chose qu'avec une requete, ça sera juste un peu plus long quoi.
Vous en pensez quoi ?
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
31 août 2005 à 14:49
Tout dépend après du nombre d'enregistrements de la table, c'est toujours un des problèmes majeurs :-)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
31 août 2005 à 14:42
le truc, c'est que si tu fais un moteur de recherche, t'es obligé d'y mettre un index (peu importe lequel), mais si tu penses que la partie rechercher sera peu utilisée, l'index ralentirait les autres requettes...
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
31 août 2005 à 14:30
C'est sympa, je sais pas si c'est rapide (je ne pense pas vu que t'as un calcul sur toute la chaîne, tout dépend comment mysql calcule ça), mais pour un faible nombre d'enregistrements c'est propre :-)

Après ça restera toujours moins efficace qu'un fulltext de toute façon, mais bon ça vient pas du code mais du LIKE
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
31 août 2005 à 14:24
et sinon, t'aimes bien ma façon de faire ?
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
31 août 2005 à 14:13
J'avais posté un truc je sais plus où y'a longtemps dans le forum sur les fulltext avec une requête exemple pour compter par pertinence (mysql qui gère ça), je rechercherai à l'occas
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
31 août 2005 à 13:31
le mien les trie, mais l'a pas une tête de code optimisé, (j'ai trouvé ce code moi même, pourtant, avant les vacances, je n'avais pas fait grand chose en SQL...)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
31 août 2005 à 12:08
Ah ce que tu dis m'interesse Coucou747, mon moteur de recherche ne trie pas les résultats.
Je reste à l'écoute de ce que vous aller nous sortir comme code lol ;)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
31 août 2005 à 10:57
les likes ne permettent pas grand chose :
avec un like, on peut dire que les lignes retournées par mysql possèdent le mot, avec une commande comme :


((LENGTH(a.texte)-LENGTH(REPLACE(a.texte, "'.$search.
'","")))/'.strlen($search).') as length

ceci renvoi le nombre de fois qu'on trouve le mot...

je penses que c'est assez efficace... coté benchs, je sais pas trop... mais ça permet de trier les résultats...
Si on ne veut que les trier, alors il ne faut pas diviser par la longueur de la chaine de recherche, mais si on veut ensuite connaitre le nombre de fois, alors autant faire comme ça...

je ne connais pas les champs fulltext et les commandes match against, si Antho voullait bien critiquer ma requette pour que je puisse améliorer mes scripts, j'en serais heureux...
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
30 août 2005 à 22:28
Merci, moi qui suis un pur débutant cette source va me servir pour "débuter" ;)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
20 mars 2005 à 19:25
ces acolades sont sous entendues... rien ne manque... (on peut se permetre ce genre de racourcit lorsque le bloc d'instruction est réduit à uhe seule instruction...)
jeffpachon Messages postés 1 Date d'inscription dimanche 20 mars 2005 Statut Membre Dernière intervention 20 mars 2005
20 mars 2005 à 18:58
dans ton code il manque quelques {} :

if(mysql_num_rows($requete) == 0){
echo 'Aucun résultas ne correspond aux termes de votre recherche.';
}
while($B = mysql_fetch_array($requete)){
echo "$B[Le Champ 1] - $B[Le Champ 2']";
}

à part ça il marche bien ....
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 févr. 2005 à 21:18
Le code est marqué DEBUTANT alors s'il y a des critiques à formuler, j'aimerais que ce soit dans le mode constructif: y a ça qui ne va pas vaudrait mieux comme cela etc...

J'ai autre chose à faire que nettoyer des posts inutiles et j'espère ne plus avoir à recommencer.
Doit bien y avoir des NGs où aller se défouler sur le net, pas besoin de venir flooder phpcs.

ciao...
coockiesch Messages postés 2268 Date d'inscription mercredi 27 novembre 2002 Statut Membre Dernière intervention 13 septembre 2013 4
21 févr. 2005 à 18:38
Salut!

Je suis en partie d'accord avec Anthomicro, le code est pas des plus extra. Mais je trouve dommage que certains membres descendent systématiquement les codes des débutants, même si c'est vrai cela alourdi le site que d'avoir 150 fois la même source...

J'ai aussi fais un tit moteur: http://www.phpcs.com/code.aspx?ID=25410
Que je pense pas trop mal, mais j'accepte aussi les codes + basiques...

A part ca, BenXbox, c'est pas mal d'utiliser <?php au lieu de <? ( pbs de compatibilité sur certains serveurs ). Utiliser ' ' au lieu de " " quand c'est possible ( ' ' sont plus rapides ). Ainsi que tester le retour d'un mysql query pour gérer les erreurs:

$requete = mysql_query(...);
if(!$requete)
die('Une erreur s\'est produite lors de l\'exécution de la requête MySQL...');

@++

R@f
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 févr. 2005 à 17:23
Justement, les débutants aiment en général apprendre directement avec une méthode correcte, plutôt que de voir un code pareil...

Ensuite pour les débutants : http://phpcs.com/gma/tout/moteur%20recherche

a +
fg85 Messages postés 370 Date d'inscription dimanche 28 mars 2004 Statut Membre Dernière intervention 13 avril 2007
21 févr. 2005 à 16:57
Euh c pas pour te cassé Anthomicro (parce que jt'm bi1) mais il faut dire que le code que vient de nous poster "BenXbox" PEUT SERVIR à des débutants qui débutent juste en php (notion de "LIKE" et "%") tandis que si des débutants vont sur ton code, il vont pas pigé voir même rien pigé du tout .

Ton code est "Initié" et celui al est "débutant" il faut en tenir compte .

En espèrant faire comprendre à beaucoup de monde les règles de base du site .

-------------------------------
http://fg.logiciel.free.fr
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 févr. 2005 à 15:45
Non, ton code php n'est pas propre, et je pense que tu n'as pas compris (toi non plus apparemment) le but de ce site qui est d'offrir une base de données de sources utiles (ici ce n'est pas le cas vu que ça existe en mieux sur le site), ou ayant une façon différente de codage par rapport aux autres (ici ce n'est pas le cas non plus, heu.. si remarque, c'est mal codé ^^). Donc vu qu'il y a déjà moult exemples sur ce site de moteurs de recherches, qui en plus sont mieux codés que le tien et disposent de plus de fonctionnalités, je ne vois pas l'intérêt de ta source...
BenXbox Messages postés 210 Date d'inscription mercredi 5 juin 2002 Statut Membre Dernière intervention 14 août 2007
21 févr. 2005 à 15:34
J'ai jamais dit que j'utilisé le XHTML et de plus mon code PHP et très propre !!!
Mon code et beaucoup plus facile à comprendre que le tien.
Mais bon tu voulais me descendre parce que ta fais le même genre de code et en plus ta mit 1/10.
Je crois que tu n’as pas compris le but de ce site.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 févr. 2005 à 14:37
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
21 févr. 2005 à 14:36
Salut,

t'appelles ça un moteur de recherche ?

C'est mal codé, les codes PHP et XHTML (on peut même pas appeler ça du XHTML) sont sales...

ça existe déjà en mieux : http://www.phpcs.com/ajoutcode.aspx?ID=25170

(la solution optimum serait d'utiliser les indexs fulltext)

a +
Rejoignez-nous