code pas si mal pour débutant...j'ai déja vu bien mieu...manque de commantaire...etc...
Jn
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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és9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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és9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 31 août 2005 à 14:24
et sinon, t'aimes bien ma façon de faire ?
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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és12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 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és1Date d'inscriptiondimanche 20 mars 2005StatutMembreDernière intervention20 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és2268Date d'inscriptionmercredi 27 novembre 2002StatutMembreDernière intervention13 septembre 20134 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...
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és9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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...
fg85
Messages postés370Date d'inscriptiondimanche 28 mars 2004StatutMembreDernière intervention13 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 .
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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és210Date d'inscriptionmercredi 5 juin 2002StatutMembreDernière intervention14 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és9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 21 févr. 2005 à 14:37
23 nov. 2006 à 18:28
23 janv. 2006 à 15:18
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
2 oct. 2005 à 22:28
<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
2 sept. 2005 à 20:05
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...
31 août 2005 à 21:04
31 août 2005 à 19:19
y'a un problème dans la requête ou autre part
31 août 2005 à 18:46
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) ;)
31 août 2005 à 17:43
31 août 2005 à 17:39
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 ?
31 août 2005 à 14:49
31 août 2005 à 14:42
31 août 2005 à 14:30
Après ça restera toujours moins efficace qu'un fulltext de toute façon, mais bon ça vient pas du code mais du LIKE
31 août 2005 à 14:24
31 août 2005 à 14:13
31 août 2005 à 13:31
31 août 2005 à 12:08
Je reste à l'écoute de ce que vous aller nous sortir comme code lol ;)
31 août 2005 à 10:57
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...
30 août 2005 à 22:28
20 mars 2005 à 19:25
20 mars 2005 à 18:58
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 ....
22 févr. 2005 à 21:18
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...
21 févr. 2005 à 18:38
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
21 févr. 2005 à 17:23
Ensuite pour les débutants : http://phpcs.com/gma/tout/moteur%20recherche
a +
21 févr. 2005 à 16:57
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
21 févr. 2005 à 15:45
21 févr. 2005 à 15:34
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.
21 févr. 2005 à 14:37
21 févr. 2005 à 14:36
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 +