Problème dans la fonction rechercher (search.php)

Started by davidlecuisto, January 21, 2018, 06:47:00 AM

Previous topic - Next topic

davidlecuisto

Bonjour

Lorsque j'utilise le moteur de recherche sur mon site , je tombe parfois sur des réponses au lieu des sujets ( topics créer)

Par exemple si je cherche "chantale" je tombe sur "Re : Chantale" au lieu de tomber sur le topic initial qui est "Chantale" ...

J'ai beau regarder dans le script search.php , je constate que la condition pour ne pas avoir les messages de réponse dans la recherche y est :

INNER JOIN {db_prefix}messages AS first_m ON (first_m.id_msg = t.id_first_msg)

Ou encore

ms.id_msg = t.id_first_msg



Une idée d'où le bug pourrais venir ?

Je sèche un peu là :-\

Paulo.chon

Bonjour,

Je ne comprends pas bien quelle recherche tu fais.

Une recherche détaillée ?

Qui porte sur les titres ?
(Option "Titres des sujets seulement" cochée)

davidlecuisto

Bonjour

Merci de intéresser a mon problème ;)

Non, une simple recherche par exemple en passant par l'onglet rechercher sans rien cocher ...

ou en tapant ma recherche dans le champs rechercher en haut a droite de l'index du forum  ...

C'est quand même bizarre vu qu'on vérifie dans le script search.php  que le champs id_msg de la table messages a la même valeur que le champs id_first_msg dans la table topics ...

Bref , peut-être un bug lors de l'insert d'un topic a un moment donné dans ma bdd , mais je posait juste la question voir si l'un de vous aviez déjà eu le problème ....


alexetgus

Salut,

Ca le fait à tout le monde, t'inquiète pas.

Ca arrive quand un sujet a plusieurs pages et que le résultat est présent sur plusieurs de ces pages.
Dans ce cas, le titre devient l'adresse de la dernière page dans la recherche qui commencera par "Re:" suivi du nom du sujet.
Ou alors, si le résultat est présent dans tous les messages d'un sujet d'une seule page, ça le fera aussi. Ca, c'est une boulette SMF. Mais bon, c'est pas dramatique. ;)

Du coup, je m'aperçois que le mod pour retirer ce "Re:" dans les réponses a une petite lacune. La recherche a été oubliée...


davidlecuisto

#4
Merci pour l'info alexetgus ....

Vu que c'est un bug smf , je l'ai contourner de cette manière .... je sais c'est lourd en requête et c'est a optimiser mais bon en attendant une correction des codeurs de smf , c'est une solution temporaire qui fonctionne ;)

Search.template.php

foreach ($topic['matches'] as $message)
{

// erreur recherche réponse signaler par mon amie by davidlecuisto

// on prend le topic par défaut de la recherche smf
$requetevraitopic= mysql_query('SELECT * FROM smf_topics WHERE id_topic=\'' . $topic['id'] . '\'')or die (mysql_error());
             $resultatvraitopic = mysql_fetch_array($requetevraitopic);

// on vérifie le topic qui a été choisi si erreur ou pas
               $requetevraitopic2= mysql_query('SELECT * FROM smf_messages WHERE id_msg=\'' . $message['id'] . '\'')or die (mysql_error());
             $resultatvraitopic2 = mysql_fetch_array($requetevraitopic2);

// Si ce n'est pas le topic intial ...
if ($resultatvraitopic2['id_msg'] != $resultatvraitopic['id_first_msg'])
             {

// On corrige en faisant une dernière requête

$requetevraitopicfinal= mysql_query('SELECT * FROM smf_messages WHERE id_msg=\'' . $resultatvraitopic['id_first_msg'] . '\'')or die (mysql_error());
             $reresultatvraitopicfinal = mysql_fetch_array($requetevraitopicfinal);
               
   // on donne la nouvelle valeur aux variables
   
   $message['id'] = $reresultatvraitopicfinal['id_msg'];
   $message['subject_highlighted'] = $reresultatvraitopicfinal ['subject'];
   
   // on va chercher la couleur du membre

                   $colorgroup = mysql_query('SELECT * FROM smf_members WHERE member_name=\''.$reresultatvraitopicfinal['poster_name'].'\'')or die (mysql_error());
                          $resultcolor= mysql_fetch_array($colorgroup);
 
$reqcolor= mysql_query('SELECT * FROM smf_membergroups WHERE id_group=\''.$resultcolor['id_group'].'\'')or die (mysql_error()); 
                      $color= mysql_fetch_array($reqcolor);
 
 
   $message['member']['link'] = '<a href="' . $scripturl . '?action=profile;u=' . $reresultatvraitopicfinal['id_member'] . '" title="' . $txt['profile_of'] . ' ' . $reresultatvraitopicfinal['poster_name'] . '"><font color="'.$color['online_color'].'">' . $reresultatvraitopicfinal['poster_name'] . '</font></a>' ;
   $message['time']= timeformat($reresultatvraitopicfinal['poster_time']) ;
   
   // etc ... a adapter avec vos mod installer ;) /!\ on perd le highlighted /!\ <-- si je vois que cette solution temporaire intéresse je chercherai une solution :)
   
   
   }
   
   // fin mod davidlecuisto erreur recherche


Merci encore pour avoir jeter un oeil a mon problème ;)

alexetgus

Tu aimes le code bien portant, bien nourri. ;D
En effet, ça demande un petit effort d'optimisation.

Une simple REGEX sur le résultat final de SMF pourrait faire l'affaire, c'est quand même plus léger que les requêtes SQL.
Un truc du style : (ne pas faire attention au nom de la variable testée, c'est pour l'exemple uniquement et donc à remplacer)
if(preg_match('/^Re:(.*)$/', $titre_du_topic, $matche)) $titre_du_topic = $matche[1];
C'est juste le titre affiché qui est gênant, pas l'adresse ni autre chose.


Perso, ce "Re:" qui apparait de temps à autres ne me gêne pas du tout. Je n'ai jamais eu de remarques non plus à ce sujet.
A vrai dire, il a fallu que tu soulignes le problème pour que je me rende compte qu'il existait. ;)

Je ne suis pas certain que SMF soit au courant. Le problème risque donc d'être porté vers la 2.1 si les recherches gardent le même code d'origine. :-\
Ce serait peut-être plus sage de leur dire.

davidlecuisto

Bonsoir

Non , les plaintes que j'ai eu sont de l'ordre que la recherche faisait croire que le topic initial venait d'un autre membre ( vu que c'est une réponse qui était affichée ....)

Avec ta régex , je supprime simplement le " Re : "  mais le liens mène a la réponse du topic , il faut donc scroller la page pour remonter au topic initial ... et le nom de l'auteur n'est tjrs pas non plus celui du créateur du topic .... ni la date de création etc ...

J'ai aussi parfois "Re : Re :"(Si un membre répond 2 fois au même topic ) , là non plus ta regex nu suffira pas ;)

Et  il y a un espace entre le "Re" et les" :"  l'espace peut être c'est  "&nbsp;" ou " " ou "&#160;" ou "&#xA0;" etc ....

Donc il faudrait une regex du style  ( Pour ceux a qui cette solution convient ;) )

if(preg_match('/^Re(&nbsp;|\s|&#160;):(.*)$/', $titre_du_topic, $matche)) $titre_du_topic = $matche[2];

Bref , je n'avais pas non plus remarquer ce bug ( pourtant 10 ans que je suis un fan de smf ) , mais par respect pour les auteurs des sujets sur mon forum , je leur ait dit que j'allais essayer de résoudre ce petit qui les génait ;)

Je ne vois donc aucune autre solution que le SQL pour contourner ce petit problème  :-\

QuoteJe ne suis pas certain que SMF soit au courant. Le problème risque donc d'être porté vers la 2.1 si les recherches gardent le même code d'origine. :-\
Ce serait peut-être plus sage de leur dire.

Ok mais je ne sais pas qui contacter pour remonter ce minuscule bug aux codeurs de SMF .

Pour terminer un grand merci a toi de m'avoir expliqué la raison du bug et d'avoir pris le temps ce de suivre ce topic !

Cdt

David


maximus23

Bonjour,

Vu je vais regarder cela de plus près et verrai la suite à donner avec la team :)

Si tu ne veux plus de Re : dans tes messages tu peux les supprimer dans le fichier de langage index.french... il suffit de rechercher le Re : en mot entier et il est suivi d'un espace insécable il suffit de laisser simplement le string vide.

:)
Pas de support par PM ou Courrier...Veuillez utiliser le forum pour vous avoir une réponse rapide à votre demande d'aide. Merci.
Amitiés et à Bientôt...
No support by PM or Mail...You will get better and faster responses in the support forums. Thank you.
Have a nice day...

alexetgus

Salut

Quote from: davidlecuisto on January 27, 2018, 01:42:57 AM
Bonsoir

Avec ta régex , je supprime simplement le " Re : "  mais le liens mène a la réponse du topic , il faut donc scroller la page pour remonter au topic initial ... et le nom de l'auteur n'est tjrs pas non plus celui du créateur du topic .... ni la date de création etc ...

Oui, tu as raison, je me suis précipité et j'en ai oublié l'auteur et tout le reste. :-[
Ceci dit, l'adresse ne doit pas changer, elle pointe sur le post qui contient le résultat de la recherche. Si tu expédies sur la première page d'un topic, ça va en embrouiller quelques uns quand ils ne verront pas leur recherche sur la page affichée.

Le premier post du topic t'es juste utile pour avoir le titre, l'auteur et la date (quoi que, le titre est fourni par SMF avec le "Re :").


Quote from: davidlecuisto on January 27, 2018, 01:42:57 AM
J'ai aussi parfois "Re : Re :"(Si un membre répond 2 fois au même topic ) , là non plus ta regex nu suffira pas ;)

Et  il y a un espace entre le "Re" et les" :"  l'espace peut être c'est  "&nbsp;" ou " " ou "&#160;" ou "&#xA0;" etc ....

Donc il faudrait une regex du style  ( Pour ceux a qui cette solution convient ;) )

if(preg_match('/^Re(&nbsp;|\s|&#160;):(.*)$/', $titre_du_topic, $matche)) $titre_du_topic = $matche[2];

Bref , je n'avais pas non plus remarquer ce bug ( pourtant 10 ans que je suis un fan de smf ) , mais par respect pour les auteurs des sujets sur mon forum , je leur ait dit que j'allais essayer de résoudre ce petit qui les génait ;)

A ce moment là, la REGEX deviendrait :
if(preg_match('/^(Re.:.?)+(.*)$/', $titre_du_topic, $matche)) $titre_du_topic = $matche[2];

On ne s'intéresse plus aux espaces, mais à un caractère qui pourrait être là.
Ce qui donne ceci [Voir PJ] (c'est plus lisible avec un dessin)



Je vais me pencher là dessus pour essayer de faire au plus simple, et surtout, au plus optimisé.

P'tain ! Ma Todo list devient longue comme un jour sans pain ! Ne t'inquiète pas si je ne réponds pas dans la minute. ;)

alexetgus

Oups ! J'ai merdé dans ma REGEX sur le dernier caractère de la première parenthèse capturante... Le ".?" :-[
Mais bon, ça marche quand même.

davidlecuisto

Bonjour

Je ne veux pas supprimer le Re : , je le trouve pratique .... 


Merci maximus , si la team SMF  trouve une solution "+ propre  et optmisée " que la mienne a ce bug ce serait top ;)


@ alexetgus , te prend pas trop la tête avec ta regex , elle ne resoud de toute façon pas le bug ;)

Merci a tous 

alexetgus

Aaaaah d'accord ! Moi je m'acharnais à supprimer ce "Re :" dans les réponses de recherche.
Vu la façon dont tu en parlais, je pensais que c'était ça qui te chagrinais.

Pour ce qui est de l'adresse du post, il n'y a aucun bug. L'adresse est celle de l'endroit où se trouve la recherche. C'est ridicule de donner une adresse qui ne pointe pas vers le post qu'on cherche.
Du coup, tu vas être obligé de garder ton bricolage, il n'y a pas de bug à corriger de ce côté là. :-\


davidlecuisto

Evidemment qu'il y a un bug ....

Vu que l'url du résultat de recherche donnait sur un message de réponse au lieu du topic initial ....

Bref on ne se comprends pas mais pas grave , de mon côté le bug est régler avec mon bricolage ;)

N'en parlons plus laissons la team smf gérer cela ;)

Paulo.chon

Quote from: davidlecuisto on January 30, 2018, 11:22:22 AM
Evidemment qu'il y a un bug ....

Vu que l'url du résultat de recherche donnait sur un message de réponse au lieu du topic initial ....


Cela dépend sans doute du poids que tu donnes aux différents éléments, et en particulier à l'ancienneté, me semble-t-il...

Si le terme recherché est dans le titre du message, alors il apparait dans chaque message de la discussion, et le message le plus récent apparaitra en premier.
Enfin en fonction des autres critères et du poids donné à chacun d'eux...



Ah je regarde mieux et je vois que le facteur d'ancienneté est " un facteur d'ancienneté du dernier message correspondant dans un sujet".

Mais il y a aussi le " facteur de fréquence de correspondance", donc si tu as le terme recherché dans le titre mais aussi dans le texte du message, et plusieurs fois, ce message apparaitra avant le message de création du sujet dans la liste de résultats.

Enfin bref il peut y avoir une raison tout à fait logique à tes résultats...

Advertisement: