PDA

View Full Version : vB Getting Last Poster (member.php)


Hugo Firth
09-24-2007, 12:55 PM
Hi guys,

I'm trying to replicate the member.php?find=lastposter&f=<number> function into my own piece of code, I've dug into the code in member.php and took the relavant code out and modified it according to my needs.

The function now reads as follows:

function memberForumLastPoster($fid)
{
global $vbulletin, $db, $vbphrase;

$forumperms = fetch_permissions($fid);
if (!($forumperms & $vbulletin->bf_ugp_forumpermissions['canview']))
{
print_no_permission();
}

if ($vbulletin->userinfo['userid'] AND in_coventry($vbulletin->userinfo['userid'], true))
{
$tachyjoin = "LEFT JOIN " . TABLE_PREFIX . "tachythreadpost AS tachythreadpost ON " .
"(tachythreadpost.threadid = thread.threadid AND tachythreadpost.userid = " . $vbulletin->userinfo['userid'] . ')';
}
else
{
$tachyjoin = '';
}

require_once(DIR . '/includes/functions_misc.php');
$forumslist = $fid . ',' . fetch_child_forums($fid);

require_once(DIR . '/includes/functions_bigthree.php');
// this isn't including moderator checks, because the last post checks don't either
if ($coventry = fetch_coventry('string')) // takes self into account
{
$globalignore_post = "AND post.userid NOT IN ($coventry)";
$globalignore_thread = "AND thread.postuserid NOT IN ($coventry)";
}
else
{
$globalignore_post = '';
$globalignore_thread = '';
}

cache_ordered_forums(1);

$datecutoff = $vbulletin->forumcache[$fid]['lastpost'] - 30;

$thread = $db->query_first_slave("
SELECT thread.threadid
" . ($tachyjoin ? ', IF(tachythreadpost.lastpost > thread.lastpost, tachythreadpost.lastpost, thread.lastpost) AS lastpost' : '') . "
FROM " . TABLE_PREFIX . "thread AS thread
$tachyjoin
WHERE thread.forumid IN ($forumslist)
AND thread.visible = 1
AND thread.sticky IN (0,1)
AND thread.open <> 10
" . (!$tachyjoin ? "AND lastpost > $datecutoff" : '') . "
$globalignore_thread
ORDER BY lastpost DESC
LIMIT 1
");

if (!$thread)
{
eval(standard_error(fetch_error('invalidid', $vbphrase['user'], $vbulletin->options['contactuslink'])));
}

$getuserid = $db->query_first_slave("
SELECT post.username
FROM " . TABLE_PREFIX . "post AS post
WHERE threadid = $thread[threadid]
AND visible = 1
$globalignore_post
ORDER BY dateline DESC
LIMIT 1
");
return $getuserid;
}

The only problem I have with this function is that now when I return $getuserid and echo $getuserid['username'], the same username is constantly being echoed out once it reaches the last category, such as below:

profile-James.html (for fid: 32)
profile-Punisher12.html (for fid: 49)
profile-James.html (for fid: 50)
profile-Yun.html (for fid: 46)
profile-Samuel.html (for fid: 37)
profile-Samuel.html (for fid: 29)
profile-Samuel.html (for fid: 42)
profile-Samuel.html (for fid: 33)
profile-Samuel.html (for fid: 40)
profile-Samuel.html (for fid: 34)
profile-Samuel.html (for fid: 35)
profile-Samuel.html (for fid: 36)

Obviously the last posters for the Fids after profile-Yun.html are not Samuel ;). But when I view the URL directly at member.php?find=lastposter&fid=37, it reflects to the correct profile.

Can anyone tell me why this is happening?

Thanks!


edit:
I've done some through debugging, the flawed code seems to be:
$forumslist = $fid . ',' . fetch_child_forums($fid);

Overwritting $forumslist with just $fid seems to make it work, but I'm afraid that it may backfire in the future. Also, why does fetch_child_forums() work in member.php and not in my function? :(.