Seite 1 von 1

Aus der Foren id den Foren Namen + Letztes Post auslesen?

Verfasst: 11.10.2002 17:56
von JLoop©
Hi,
ich habe mir ein kleines script geschrieben das aus der forum_id in der tabelle phpbb_forums_watch den forennamen aus der phpbb_forums tabelle ausliest so das dieser im template angezeigt wird!Nun würde ich zusätzlich gerne den Letzten Beitrag aus dem jeweiligen Forum anzeigen aber ich habe keine idee wie ich das hinbekommen kann!

Hier mal das script:

Code: Alles auswählen

<?php
/***************************************************************************
* topics.php
* -------------------
* begin : Friday, May 10, 2002
* copyright : (C) 2001 The phpBB Group
* email : support@phpbb.com
*
*
*
***************************************************************************/

/***************************************************************************
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
***************************************************************************/

define('IN_PHPBB', true);
$phpbb_root_path = "./";
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);
$page_title = $lang['Topics_created'];
include($phpbb_root_path . 'includes/page_header.'.$phpEx);


$sql="SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name
FROM " . FORUMS_WATCH_TABLE . " fw, " . FORUMS_TABLE . " f
WHERE fw.user_id = '" . $userdata['user_id'] . "' AND fw.forum_id = f.forum_id
ORDER BY f.forum_id";
if ( !$result = $db->sql_query($sql) )
                {
                        message_die(GENERAL_ERROR, 'Error getting forum information', '', __LINE__, __FILE__, $sql);
                }
$numrows = $db->sql_numrows($result);

                if ( $db->sql_numrows($result) > 0)
                {
while ( $row = $db->sql_fetchrow($result) )
                        {
$forum_id = $row['forum_id'];
$forum_name = $row['forum_name'];
 $template->assign_block_vars('abo_info', array(
                                        'FORUM_NAME' => $forum_name,
                                        'U_FORUM' => append_sid('viewforum.php?f='.$forum_id))
                                );
                        }
                        }
                        else
                        {
                        $nothing = "Zurzeit hast du keine Foren abonniert!";
$template->assign_block_vars('abo_info', array(
                                'FORUM_NAME' => $nothing)
                        );
                        }

$template->set_filenames(array(
'body' => 'abo_info.tpl')
);

$template->pparse('body');

include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
?>
Zurzeit sind in der tabelle 2 Foren ids gespeichert es werden also 2 Forennamen angezeigt!
Ich habe schon versucht den query so anzupassen:

Code: Alles auswählen

$sql="SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name, t.topic_id, t.topic_title, t.topic_last_post_id, t.forum_id
FROM " . FORUMS_WATCH_TABLE . " fw, " . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t
WHERE fw.user_id = '" . $userdata['user_id'] . "' AND fw.forum_id = f.forum_id AND t.forum_id !='$forum_id' AND t.topic_last_post_id
ORDER BY f.forum_name DESC";
Dann wird zwar der Letzte Beitrag daneben angezeigt aber der letzte Beitrag aus allen Foren überhaupt und es wird nur noch ein Forenname angezeigt!

Hat jemand ne idee wie ich das lösen kann?
Ich bin für jeden tip dankbar!

Grüße JLoop

Verfasst: 12.10.2002 00:19
von PhilippK
Dann versuchen wir uns mal etwas in SQL.

Machen wir mal etwas SQL. Fangen wir an, dass Original etwas zu vereinfachen. Machen wir aus den phpBB-Variablen einfach 'nen Tabellennamen und nehmen die user_id als Variable. Das produziert zwar keinen funktionsfähigen Code, sieht aber deutlich übersichtlicher aus :-)

Code: Alles auswählen

SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name
FROM forums_watch_table fw, forums_table f
WHERE fw.user_id = user_id AND fw.forum_id = f.forum_id 
ORDER BY f.forum_id
Ich mag die JOINS deutlich lieber, also setzen wir das ganze mal um:

Code: Alles auswählen

SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name
FROM forums_watch_table fw INNER JOIN forums_table f ON fw.forum_id = f.forum_id
WHERE fw.user_id = user_id
ORDER BY f.forum_id
So, dann holen wir über forum_last_post_id der Foren-Tabelle den letzten Beitrag:

Code: Alles auswählen

SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name, t.*
FROM forums_watch_table fw
    INNER JOIN forums_table f ON fw.forum_id = f.forum_id
    INNER JOIN topics_table t ON f.forum_last_post_id = t.topic_id
WHERE fw.user_id = user_id
ORDER BY f.forum_id
Jetzt müssen wir das ganze nur zurück übersetzen:

Code: Alles auswählen

$sql = "SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name, t.topic_id, t.topic_title
FROM " . FORUMS_WATCH_TABLE . " fw
    INNER JOIN " . FORUMS_TABLE . " f ON fw.forum_id = f.forum_id
    INNER JOIN " . TOPICS_TABLE . " t ON f.forum_last_post_id = t.topic_id
WHERE fw.user_id = " . $userdata['user_id'] . "
ORDER BY f.forum_name DESC"
So, ich hoffe, dass bei der Trocken-SQL-Übung nichts durcheinander geraten ist...

Gruß, Philipp

Verfasst: 12.10.2002 08:48
von sidragon
Man könnte auch einfach den MOD von Ca5y verwenden ...
http://www.clanunity.net/portal.php
:wink:
vielleicht muss man ja nicht alles selbst neu machen...

Verfasst: 13.10.2002 21:46
von JLoop©
thx @ Philipp aber des funzt nicht jetzt wird garnichts mehr angezeigt nichtmal der forenname :(

Gruß JLoop

Verfasst: 13.10.2002 22:29
von PhilippK
JLoop,

kann's auch nicht. Da hab ich die Topics mit den Posts zusammengeschmissen. Versuch's mal mit:

Code: Alles auswählen

$sql = "SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name, t.*, p.*
FROM " . FORUMS_WATCH_TABLE . " fw 
    INNER JOIN " . FORUMS_TABLE . " f ON fw.forum_id = f.forum_id 
    INNER JOIN " . POSTS_TABLE . " p ON f.forum_last_post_id = p.post_id 
    INNER JOIN " . TOPICS_TABLE . " t ON p.topic_id = t.topic_id 
WHERE fw.user_id = " . $userdata['user_id'] . " 
ORDER BY f.forum_name DESC"
Du solltest beim SELECT-Teil t.* und p.* noch etwas anpassen - dann solltest du (hoffentlich) alle benötigten Infos abgreifen können.

Gruß, Philipp

Verfasst: 13.10.2002 22:54
von JLoop©
Hi es funktioniert jetzt zwar aber es wird nur ein Forenname+Last Post angezeigt in der tabelle sind aber 2 felder ( also 2 foren id´s ) gespeichert!Woran kann das liegen?

Es müsste eigentlich so angezeigt werden:
Forum:News Letztes Thema: Update vom 01.10.2002
Forum:Smalltalk Letztes Thema: Flash 5 vs. Swish
aber es wird nur das erste Forum angezeigt so:
Forum:News Letztes Thema: Update vom 01.10.2002
Die sql sieht jetzt so aus:

Code: Alles auswählen

$sql = "SELECT fw.forum_id, fw.user_id, fw.notify_status, f.forum_name, t.topic_id, t.topic_title
FROM " . FORUMS_WATCH_TABLE . " fw
    INNER JOIN " . FORUMS_TABLE . " f ON fw.forum_id = f.forum_id
    INNER JOIN " . POSTS_TABLE . " p ON f.forum_last_post_id = p.post_id
    INNER JOIN " . TOPICS_TABLE . " t ON p.topic_id = t.topic_id
WHERE fw.user_id = " . $userdata['user_id'] . "
ORDER BY f.forum_name DESC";
Grüße JLoop

Verfasst: 13.10.2002 23:01
von JLoop©
ahh habs schon selbst hinbekommen thx für deine Hilfe!!

Gruß JLoop

Verfasst: 14.10.2002 00:10
von PhilippK
JLoop© hat geschrieben:ahh habs schon selbst hinbekommen thx für deine Hilfe!!
Darf man auch erfahren, woran es lag?

Gruß, Philipp

Verfasst: 14.10.2002 00:21
von JLoop©
INNER JOIN hab ich mit LEFT JOIN ersetzt dann ging es :)

Gruß JLoop