Archives FluxBB.fr

Les archives de FluxBB.fr

Vous n'êtes pas identifié(e).

#1 06-09-2009 19:34:16

tribuforex
Membre

Récupérer titre et messages (ou partie)

Bonjour à tous!
Je ne suis toujours pas parvenu à faire ce que je voulais.
J'aurais aimé pouvoir afficher dans une page de mon site tous les titres en rapport à un mot prédéfini (et le premier message de la discussion juste en dessous).

Ainsi, en utilisant le même procédé que la page search, il serait possible de créer des pages qui affichent tous les résultats sur des mots clés prédéfinis (et une petite présentation serait toujours juste en dessous...)

Quelqu'un aurait il une idée du code à insérer sur la page?

Hors ligne

#2 06-09-2009 19:42:17

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Bonjour

Je pense que tu réponds à une grande partie de la question : la page search.php. Tout n'y est pas à prendre et tu devras rajouter des éléments (comme récupérer le premier message de la discussion) mais c'est un bon point de départ.

Après ton message ne nous permet pas de savoir à quel point tu as avancée dans ta recherche : as-tu codé la requête pour chercher les discussions à partir des mots clés, ... ?


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#3 06-09-2009 20:08:12

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Salut Fanf73!

Pour le mot clé, je pense qu'il va falloir utilise la variable suivante:

$keywords = "babar"

Pour le code entier, non, je n'ai toujours pas trouvé. Je me base sur le code qui me permet de récupérer tous mes titres:

<?php
              define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';

$show = 100000;

        // Fetch $show topics
        $result = $db->query('SELECT t.id, t.subject, t.last_post, t.last_poster FROM '.$db->prefix.'topics AS t INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.moved_to IS NULL ORDER BY t.last_post DESC LIMIT '.$show) or error('Impossible de retrouver les topics', __FILE__, __LINE__, $db->error());

        while ($cur_topic = $db->fetch_assoc($result))
        {
            if ($pun_config['o_censoring'] == '1')
                $cur_topic['subject'] = censor_words($cur_topic['subject']);

            echo '<a href="'.$pun_config['o_base_url'].'/viewtopic.php?id='.$cur_topic['id'].'&action=new" class="lien3" title="'.pun_htmlspecialchars($cur_topic['subject']).'">'.pun_htmlspecialchars($cur_topic['subject']).'</a> <br />'."\n";
        }
        ?>

Mais je suis coincé à chaque fois que j'essaie de bouger quelquechose

Dernière modification par tribuforex (06-09-2009 20:09:27)

Hors ligne

#4 06-09-2009 20:39:44

Super_baloo8
Membre

Re : Récupérer titre et messages (ou partie)

Voici la requête SQL qui devrait t'aider :

$result = $db->query('SELECT p.id AS message_id, p.poster_id, p.message, p.posted, p.topic_id, t.subject, u.username FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id WHERE p.message LIKE \'%'.$search_word.'%\' ORDER BY t.id DESC, p.posted DESC LIMIT 0,'.$number_result_to_show) or error('Impossible d\'effectuer la recherche', __FILE__, __LINE__, $db->error());

Attention, il n'y a pas de filtrage sur les forum, en gros, un membre pourrais voir un topic et le message associé d'un topic normalement caché des membres.

Dans cette requête, tu as 3 variables.

- $db->prefix -> préfixe de des tables du forum dans la base de donnée

- $search_word -> mot, ou phrase à chercher (attention, j'ai mis LIKE '%%' dans la requête, ça veut dire qu'il cherchera l'ensemble de la phrase/mot dans tous les messages. Si tu veux faire comme les résultats de google, il faut remplacer tous les espaces par des '%'

- $number_result_to_show -> nombre de résultat à afficher

J'espère que ça te donnera une bonne piste pour commencer smile

Dernière modification par Super_baloo8 (06-09-2009 20:42:47)


[img]http://www.grid-france.fr/images/equipe/userbar_equipe_france_2.gif[/img] Équipe France

Hors ligne

#5 06-09-2009 20:50:31

Super_baloo8
Membre

Re : Récupérer titre et messages (ou partie)

Puisque j'en ai besoin aussi pour mon site, voilà la requête complete avec les arguments qui vont bien :

if($recherche_integrale == TRUE)
    {
    $search_word = str_replace(' ', '%', $search_word);
    }
    else
        {
        $search_word = $search_word;
        }
$result = $db->query('SELECT p.id AS message_id, p.poster_id, p.message, p.posted, p.topic_id, t.subject, u.username 
FROM '.$db->prefix.'posts AS p 
INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id
INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id 
LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3)
INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id
WHERE (fp.read_forum IS NULL OR fp.read_forum='.$group_id.') AND t.moved_to IS NULL AND p.message LIKE \'%'.$search_word.'%\'
ORDER BY t.id DESC, p.posted DESC
LIMIT 0,'.$number_result_to_show) or error('Impossible d\'effectuer la recherche', __FILE__, __LINE__, $db->error());

Donc, tu as possibilité, sois de faire une recherche avec la phrase entière, ou soit par mot clefs (variable $recherche_integrale à mettre à TRUE si tu veux une recherche par mot clefs)

Ensuite, il y a la variable "$group_id" qui permet de faire une recherche sur le forum, suivant les accès. (modérateurs, administrateur, membre, invités).

Les champs retournés seront :

$cur_topic = $db->fetch_assoc($result)

- message_id = numéro unique du message
- poster_id = numéro unique du membre qui à écrit ce message
- message = message écrit par le membre
- posted = timestamp du message
- topic_id = numéro unique du topic
- subject = titre du topic
- username = pseudo du membre

Donc pour créer un lien vers le message sur ton forum, tu n'aurais plus qu'à :

echo '<a href="forum/viewtopic.php?pid='.$cur_topic['message_id'].'#p'.$cur_topic['message_id'].'">Lien vers la discussion</a>;

Par défaut, ma requête est ordonnée par :

- Par numéro de Forum de manière décroissante (plus grand numéro au plus petit)
- Puis par date d'écriture du message de manière décroissante aussi (dernier message écris au plus récent)

Si tu veux changer l'ordre, il faut modifier la condition "ORDER BY"

Dernière modification par Super_baloo8 (06-09-2009 20:58:14)


[img]http://www.grid-france.fr/images/equipe/userbar_equipe_france_2.gif[/img] Équipe France

Hors ligne

#6 06-09-2009 21:45:34

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Merci Super_Baloo8 pour ton coup de main!
Moi la progra c'est vraiment pas mon truc...

Alors je n'ai pas compris comment tu change la requête LIKE \'%'.$search_word.'%\'
Si par exemple je veux rechercher le mot babar? Il faut changer ca comment?

Ensuite, voici ce que j'ai mais ca ne marche pas:

<?php
define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';
$cur_topic = $db->fetch_assoc($result);
$number_result_to_show = 100000;

       
if($recherche_integrale == TRUE)
    {
    $search_word = str_replace(' ', '%', $search_word);
    }
    else
        {
        $search_word = $search_word;
        }
$result = $db->query('SELECT p.id AS message_id, p.poster_id, p.message, p.posted, p.topic_id, t.subject, u.username 
FROM '.$db->prefix.'posts AS p 
INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id
INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id 
LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3)
INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id
WHERE (fp.read_forum IS NULL OR fp.read_forum='.$group_id.') AND t.moved_to IS NULL AND p.message LIKE \'%'.$search_word.'%\'
ORDER BY t.id DESC, p.posted DESC
LIMIT 0,'.$number_result_to_show) or error('Impossible d\'effectuer la recherche', __FILE__, __LINE__, $db->error());


           echo '<a href="forum/viewtopic.php?pid='.$cur_topic['message_id'].'#p'.$cur_topic['message_id'].'">Lien vers la discussion</a>';
        
        ?>

Et je vois qu'il n'y a qu'un echo. Mais si on veut qu'il y ait le titre linké et le premier message en dessous, que faut il mettre en echos?

Merci encore Super_Baloo8!

Hors ligne

#7 06-09-2009 23:08:31

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Si veux obtenir que les résultats pour un seul mot, suffit il de mettre? :

$search_word = "babar";

Sinon, avec ca:

<?php
define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';
$cur_topic = $db->fetch_assoc($result);
$number_result_to_show = 100000;

       
$search_word = "babar";
        
$result = $db->query('SELECT p.id AS message_id, p.poster_id, p.message, p.posted, p.topic_id, t.subject, u.username 
FROM '.$db->prefix.'posts AS p 
INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id
INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id 
LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3)
INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id
WHERE (fp.read_forum IS NULL OR fp.read_forum='.$group_id.') AND t.moved_to IS NULL AND p.message LIKE \'%'.$search_word.'%\'
ORDER BY t.id DESC, p.posted DESC
LIMIT 0,'.$number_result_to_show) or error('Impossible d\'effectuer la recherche', __FILE__, __LINE__, $db->error());


           echo '<a href="forum/viewtopic.php?pid='.$cur_topic['message_id'].'#p'.$cur_topic['message_id'].'">Lien vers la discussion</a>';
        
        ?>

J'obtiens:

Error: Impossible d'effectuer la recherche.

Je ne vois où est récupéré le titre, puis le dernier message dans le echo qui est mis? (Enfin, je suis mauvais aussi mais bon..)(Need help!)

Hors ligne

#8 07-09-2009 00:54:04

Super_baloo8
Membre

Re : Récupérer titre et messages (ou partie)

Euh,

Il faut que tu apprennes les bases du php et du mysql, sinon tu ne vas jamais t'en sortir ...

Je n'ai pas le temps de faire tout

<?php
define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';
$number_result_to_show = 1000;

       
$search_word = "babar";
        
$result = $db->query('SELECT p.id, p.poster_id, p.message, p.posted, p.topic_id, t.subject, u.username FROM '.$db->prefix.'posts AS p INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id WHERE (fp.read_forum IS NULL OR fp.read_forum='.$group_id.') AND t.moved_to IS NULL AND p.message LIKE \'%'.$search_word.'%\' ORDER BY t.id DESC, p.posted DESC LIMIT 0,'.$number_result_to_show) or error('Impossible d\'effectuer la recherche', __FILE__, __LINE__, $db->error());

while($cur_topic = $db->fetch_assoc($result))

{
           echo '<p><a href="forum/viewtopic.php?pid='.$cur_topic['id'].'#p'.$cur_topic['id'].'">'.$cur_topic['subject'].'</a><br />'.$cur_topic['message'].'</p>';
}
        
        ?>

Je t'ai écris toutes les variables au dessus, tu n'as plus qu'à écrire 3 ligne et c'est bon, apprends les bases du php, et reviens smile

EDIT : ton message d'erreur viens car il n'arrive pas à se connecter à ta base de donnée. Vérifier que tous les paramètre soit bon !!!!!!

Dernière modification par Super_baloo8 (07-09-2009 01:06:02)


[img]http://www.grid-france.fr/images/equipe/userbar_equipe_france_2.gif[/img] Équipe France

Hors ligne

#9 07-09-2009 08:54:55

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Pense à activer le mod débug quand tu as des erreurs, ça donne plus de précision (voir l'aide pour ça).


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#10 07-09-2009 10:35:35

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Merci Fanf et Baloo pour votre aide en tout cas!
Je sais qu'il faut que je m'y mette plus en profondeur sur le php et mysql, mais le temps me manque et c'est vraiment pas facile.
Je vais faire mon max pour trouver la fin de la solution seul.
Merci encore pour votre aide!
Vincent.

Hors ligne

#11 07-09-2009 13:33:44

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Je parviens à faire afficher les messages des dernières discussions.
Petit problème d'encodage cependant: les à deviennent des r avec accent si je suis en ISO.
En UTF c'est pas ca non plus.
J'ai essayé de changer:

$cur_topic

Par:

.pun_htmlspecialchars($cur_topic

Mais toujours le même problème.

Sinon avec ce que tu m'avais donné Baloo, j'obtiens ca (en debug):

FluxBB reported: Impossible d'effectuer la recherche

Database reported: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') AND t.moved_to IS NULL AND p.message LIKE '%babar%' ORDER BY t.id DESC, p.post' at line 1 (Errno: 1064)

Hors ligne

#12 07-09-2009 14:57:56

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Ca y est presque!

Pour le problème d'encodage, il suffisait de mettre en Latin1. Ca c'est bon.

Sinon, je ne n'obtiens plus de message d'erreur avec ce code (mais la page reste blanche alors que le mot clé est bien présent ca c'est sûr):

<?php
define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';
$number_result_to_show = 100;      

if($recherche_integrale == TRUE)
    {
    $search_word = str_replace(' ', '%', $search_word);
    }
    else
        {
        $search_word = $search_word;
        }
        
$search_word = "forex";
        
$result = $db->query('SELECT p.id, p.poster_id, p.message, p.posted, p.topic_id, t.subject, u.username FROM '.$db->prefix.'posts AS p
INNER JOIN '.$db->prefix.'topics AS t ON t.id=p.topic_id
INNER JOIN '.$db->prefix.'forums AS f ON f.id=t.forum_id
LEFT JOIN '.$db->prefix.'forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3)
INNER JOIN '.$db->prefix.'users AS u ON u.id=p.poster_id
WHERE (fp.read_forum IS NULL) AND t.moved_to IS NULL AND p.message LIKE \'%'.$search_word.'%\'
ORDER BY t.id DESC, p.posted DESC LIMIT 0,'.$number_result_to_show) or error('Impossible d\'effectuer la recherche', __FILE__, __LINE__, $db->error());

while($cur_topic = $db->fetch_assoc($result))

{
           echo '<p><img src="img/ok-10.png" alt="" width="10" height="10">  '.'<strong><a href="forum/viewtopic.php?pid='.$cur_topic['message_id'].'" class="lien3" title="'.'#p'.$cur_topic['message_id'].'">'.$cur_topic['subject'].'</a></strong><br /><div align="justify">'.$cur_topic['message'].'</div></p>';
}
        ?>

Il manque quelquechose?

Hors ligne

#13 07-09-2009 19:11:37

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Si je supprime ca:

WHERE (fp.read_forum IS NULL) AND t.moved_to IS NULL AND p.message LIKE \'%'.$search_word.'%\'

J'obtiens tous les titres du forum (avec leur 1er message).
Mais ce n'est pas ce qui est recherché. Je cherche bien à obtenir tous les titres (+1er message) mais sur un mot (ou expression de mots) défini.
Qu'est ce qui cloche dans le "where"?

Hors ligne

#14 07-09-2009 19:15:02

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Laisse la condition mais remplace

fp.read_forum IS NULL

par

fp.read_forum IS NULL OR fp.read_forum=1

(en laissant bien les parenthèse autour.


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#15 07-09-2009 19:28:03

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

En effet fanf73! Merci!
Ca marche maintenant. C'est extra!

Sais tu s'il serait difficile que le mot clé apparaisse en gras tout bêtement sur le contenu affiché, ou y en a t'il pour une plombe pour mettre ca en place?

Hors ligne

#16 07-09-2009 20:12:02

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Va faire un tour du côté de cette mod : http://www.punbb.fr/mods/mod.php?id=37 . Il faut un peu l'adapter par contre.


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#17 07-09-2009 22:20:35

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Mod qui semble très pratique dans son utilisation classique.
Mais je vais rencontrer des problèmes sur ce point:

3) La mod ajoute une balise BBcode  de surlignement, elle nécessite donc que le BBcode soit activé dans les messages.

Etant donné qu'il va falloir maintenant que je parse le bbcode car dans le message qui s'affiche j'ai toujours les (img)(url) et autres... Et ca ne fait pas beau du tout.
Peut on parser le bbcode tout en laissant ce bbcode actif?

Hors ligne

#18 07-09-2009 22:25:55

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Le bbcode n'est parsé que si le bbcode est actif. Il faut utiliser la fonction "parse_message()" pour ça, regarde dans le fichier viewtopic ou search pour voir comment l'utiliser.


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#19 07-09-2009 23:11:19

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Mais pour voir si le BBcode est actif, il suffit bien simplement d'aller dans admin/permissions et de voir si BBcode est sur oui?
Si je le met sur non, tous les messages ne seront plus parser. Donc plus d'images et autres bbcode traduit..

J'ai regardé dans viewtopic et je n'ai trouvé que ca:

// Perform the main parsing of the message (BBCode, smilies, censor words etc)
    $cur_post['message'] = parse_message($cur_post['message'], $cur_post['hide_smilies']);

Sinon, n'est il pas possible de parser simplement le bbcode que je fait afficher sur ma nouvelle page?

Dernière modification par tribuforex (07-09-2009 23:12:23)

Hors ligne

#20 07-09-2009 23:21:22

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Et sinon pour mettre automatiquement en gras le mot clé, est ce que une fonction de ce style serait bonne?

$str = "babar";
echo preg_replace("<stong>babar</strong>");

(PS: celle la ne marche pas...)

Hors ligne

#21 07-09-2009 23:34:29

Mpok
Néo Admin

Re : Récupérer titre et messages (ou partie)

Ben comme fanf73 l'a dit juste au-dessus il suffit d'appliquer la fonction parse_message à ton $cur_topic['message'] dans la boucle d'affichage..

Hors ligne

#22 07-09-2009 23:34:40

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Comment voudrais-tu le parser plus simplement qu'en utilisant cette fonction ? Il te suffit de remplacer le second paramètre par 1 (je crois) et de mettre ta variable contenant le texte à la place du premier paramètre.

Pour ta seconde question la fonction preg_replace (ou encore str_replace) peut très bien faire l'affaire.


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#23 08-09-2009 09:34:49

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Le include du parser est maintenant bien intégré, merci Mpok.
En revanche, la fonction preg_replace reste difficile à comprendre et à mettre en place.
Peut on utiliser celle du haut du code d'une façon un peu semblable à celle la?:

<?php
define('PUN_ROOT', './forum/');
require PUN_ROOT.'include/common.php';
require PUN_ROOT.'include/parser.php';
$number_result_to_show = 100;      

if($recherche_integrale == TRUE)
    {
    $search_word = str_replace(' ', '%', '<strong>$search_word</strong>');
    }
    else
        {
        $search_word = $search_word;
        }
        
$search_word = "babar";

Ou bien faut t'il rajouter la fonction sous le echo avec quelquechose comme ca:

$string = $search_word;  
$pattern = 'message';  
$replacement = '<strong>$search_word</strong>';  
echo preg_replace($pattern, $replacement, $string);

Hors ligne

#24 08-09-2009 10:18:17

fanf73
Wik-wiki

Re : Récupérer titre et messages (ou partie)

Il te sera plus facile d'utiliser la fonction str_replace en effet, voir la fonction str_ireplace pour que ce soit insensible à la casse.

Il semblerait que tu n'ais pas tout à fait saisie comment elle fonctionne par contre. Les 3 paramètre à indiquer sont, dans l'ordre :
- le mot à modifier
- ce que tu veux mettre à la place du mot à modifier
- le texte complet sur lequel appliquer ces changements.


Nous ne faisons pas le travail à votre place mais nous prenons le temps de vous montrer le chemin. Merci de lire ce que l'on vous dit et de réfléchir avant de re-demander une explication.

Hors ligne

#25 08-09-2009 11:11:59

tribuforex
Membre

Re : Récupérer titre et messages (ou partie)

Pas évidente à controler cette fonction..

Si je cherche à changer automatiquement mon mot clé (par exemple mickey doit devenir babar), c'est bon ca? (Que je place après echo):

$search_word = str_ireplace("mickey", "babar", $cur_topic['message']);

Hors ligne

Pied de page des forums