vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vBulletin 3.0 Full Releases (https://vborg.vbsupport.ru/forumdisplay.php?f=33)
-   -   Latest Threads On Forum Home (https://vborg.vbsupport.ru/showthread.php?t=60544)

dutchbb 04-27-2004 01:17 PM

Quote:

Originally Posted by NTLDR
Latest Threads On Forum Home

Can this be set by usergroup? And how would I do that please.

Great hack!

dutchbb 04-27-2004 01:19 PM

Quote:

Originally Posted by TECK
Hi Lee,
I looked at your code and I think there is a problem with your hack.
You are doing full table scans and that could easily crash your server in a busy site.

Your search for latest threads should generate at least a 70% MySQL activity...
IMO is extremly high. Let me know what you think.

Regards,
Floren.

Hm doesn't sound good, interested in what he has to say...

NTLDR 04-27-2004 01:20 PM

Quote:

Originally Posted by Triple_T
Can this be set by usergroup? And how would I do that please.

Great hack!

You mean only display the latest threads block for certain groups?

dutchbb 04-28-2004 02:27 PM

Quote:

Originally Posted by NTLDR
You mean only display the latest threads block for certain groups?

Yes, like only for paid membership groups.

Is it true what Teck said?

NTLDR 04-28-2004 02:37 PM

Replace:

PHP Code:

// [START HACK='Latest Threads On Forum Home' AUTHOR='NTLDR' VERSION='1.0.0' CHANGEID= 2 ]
// #################### PROCESS LATEST THREADS #######################
// fetch the permissions for each forum
$forumperms = array();
foreach(
$forumcache AS $forum) {

    
$forumperms["$forum[forumid]"] = fetch_permissions($forum['forumid']);

    
// ## HIDE FORUMS WITHOUT THE CANVIEW OR CANVIEWOTHERS PERMISSION ##
    
if (!($forumperms["$forum[forumid]"] & CANVIEW) || !($forumperms["$forum[forumid]"] & CANVIEWOTHERS)) {
        
$limitfids .= ','.$forum['forumid'];
    }
}
unset(
$forum);

if (
$vboptions['threadpreview'] > 0) {
    
$previewfield ', post.pagetext AS preview';
    
$previewjoin 'LEFT JOIN '.TABLE_PREFIX.'post AS post ON(post.postid = thread.firstpostid)';
}

$getthreads $DB_site->query("
    ## GET LATEST THREADS ##
    SELECT thread.*,thread.iconid AS threadiconid 
$previewfield
    FROM "
.TABLE_PREFIX."thread AS thread
    LEFT JOIN "
.TABLE_PREFIX."deletionlog AS deletionlog ON(thread.threadid = deletionlog.primaryid AND type = 'thread')
    
$previewjoin
    WHERE open = '1'
    AND forumid NOT IN (0
$limitfids)
    AND thread.visible = '1'
    AND deletionlog.primaryid IS NULL
    ORDER BY lastpost
    DESC LIMIT 5"
);

while(
$thread $DB_site->fetch_array($getthreads)) {

    
$threads true;
    
$thread['title'] = fetch_censored_text(fetch_trimmed_title(unhtmlspecialchars($thread['title']), 22));
    
$thread['date'] = vbdate($vboptions['dateformat'], $thread['lastpost'], 1);
    
$thread['time'] = vbdate($vboptions['timeformat'], $thread['lastpost']);
    
$thread['preview'] = preg_replace('#\[quote(=("|"|\'|).*\\2)?\](.*)\[/quote\]#siU'''$thread['preview']);
    
$thread['preview'] = htmlspecialchars_uni(fetch_trimmed_title(strip_bbcode(fetch_censored_text($thread['preview']), falsetrue), $vboptions['threadpreview']));
    
$thread['replycount'] = vb_number_format($thread['replycount']);
    
$thread['views'] = vb_number_format($thread['views']);

    
// thread icon
    
$show['icon'] = false;
  
$icon fetch_iconinfo($thread['iconid']);

  if (
is_array($icon)) {
      
$show['icon'] = true;
      
$thread['threadiconpath'] = $icon['iconpath'];
      
$thread['threadicontitle'] = $icon['title'];
  }

    
// show goto new post
    
$show['firstnew'] = false;
    
$bbforumview fetch_bbarray_cookie('forum_view'$thread['forumid']);

    if (
$bbforumview $bbuserinfo['lastvisit']) {
        
$lastread $bbforumview;
    } else {
        
$lastread $bbuserinfo['lastvisit'];
    }

    if (
$thread['lastpost'] > $lastread) {

        
$threadview fetch_bbarray_cookie('thread_lastview'$thread['threadid']);

        if (
$thread['lastpost'] > $threadview) {
            
$show['firstnew'] = true;
            
$show['icon'] = false;
        }
    }

    
exec_switch_bg();

    eval(
"\$threadbits .= \"".fetch_template('forumhome_latestthreadbit')."\";");
}
if (
$threads) {
    
$show['latestthreads'] = true;
}
// memory saving
unset($thread$threads);
$DB_site->free_result($getthreads);
// [END HACK='Latest Threads On Forum Home' AUTHOR='NTLDR' VERSION='1.0.0' CHANGEID= 2 ] 

With: (Changing X to the usergroupid you wish to show it for
PHP Code:

if (is_member_of($bbuserinfoX) {

    
// [START HACK='Latest Threads On Forum Home' AUTHOR='NTLDR' VERSION='1.0.0' CHANGEID= 2 ]
    // #################### PROCESS LATEST THREADS #######################
    // fetch the permissions for each forum
    
$forumperms = array();
    foreach(
$forumcache AS $forum) {

        
$forumperms["$forum[forumid]"] = fetch_permissions($forum['forumid']);

        
// ## HIDE FORUMS WITHOUT THE CANVIEW OR CANVIEWOTHERS PERMISSION ##
        
if (!($forumperms["$forum[forumid]"] & CANVIEW) || !($forumperms["$forum[forumid]"] & CANVIEWOTHERS)) {
            
$limitfids .= ','.$forum['forumid'];
        }
    }
    unset(
$forum);

    if (
$vboptions['threadpreview'] > 0) {
        
$previewfield ', post.pagetext AS preview';
        
$previewjoin 'LEFT JOIN '.TABLE_PREFIX.'post AS post ON(post.postid = thread.firstpostid)';
    }

    
$getthreads $DB_site->query("
        ## GET LATEST THREADS ##
        SELECT thread.*,thread.iconid AS threadiconid 
$previewfield
        FROM "
.TABLE_PREFIX."thread AS thread
        LEFT JOIN "
.TABLE_PREFIX."deletionlog AS deletionlog ON(thread.threadid = deletionlog.primaryid AND type = 'thread')
        
$previewjoin
        WHERE open = '1'
        AND forumid NOT IN (0
$limitfids)
        AND thread.visible = '1'
        AND deletionlog.primaryid IS NULL
        ORDER BY lastpost
        DESC LIMIT 5"
);

    while(
$thread $DB_site->fetch_array($getthreads)) {

        
$threads true;
        
$thread['title'] = fetch_censored_text(fetch_trimmed_title(unhtmlspecialchars($thread['title']), 22));
        
$thread['date'] = vbdate($vboptions['dateformat'], $thread['lastpost'], 1);
        
$thread['time'] = vbdate($vboptions['timeformat'], $thread['lastpost']);
        
$thread['preview'] = preg_replace('#\[quote(=("|"|\'|).*\\2)?\](.*)\[/quote\]#siU'''$thread['preview']);
        
$thread['preview'] = htmlspecialchars_uni(fetch_trimmed_title(strip_bbcode(fetch_censored_text($thread['preview']), falsetrue), $vboptions['threadpreview']));
        
$thread['replycount'] = vb_number_format($thread['replycount']);
        
$thread['views'] = vb_number_format($thread['views']);

        
// thread icon
        
$show['icon'] = false;
      
$icon fetch_iconinfo($thread['iconid']);

      if (
is_array($icon)) {
          
$show['icon'] = true;
          
$thread['threadiconpath'] = $icon['iconpath'];
          
$thread['threadicontitle'] = $icon['title'];
      }

        
// show goto new post
        
$show['firstnew'] = false;
        
$bbforumview fetch_bbarray_cookie('forum_view'$thread['forumid']);

        if (
$bbforumview $bbuserinfo['lastvisit']) {
            
$lastread $bbforumview;
        } else {
            
$lastread $bbuserinfo['lastvisit'];
        }

        if (
$thread['lastpost'] > $lastread) {

            
$threadview fetch_bbarray_cookie('thread_lastview'$thread['threadid']);

            if (
$thread['lastpost'] > $threadview) {
                
$show['firstnew'] = true;
                
$show['icon'] = false;
            }
        }

        
exec_switch_bg();

        eval(
"\$threadbits .= \"".fetch_template('forumhome_latestthreadbit')."\";");
    }
    if (
$threads) {
        
$show['latestthreads'] = true;
    }
    
// memory saving
    
unset($thread$threads);
    
$DB_site->free_result($getthreads);
    
// [END HACK='Latest Threads On Forum Home' AUTHOR='NTLDR' VERSION='1.0.0' CHANGEID= 2 ]


I've had no problems running this code on several sites, though I may look into optimising it if and when I have time.

dutchbb 04-28-2004 02:43 PM

Thanks for this very quick reply :)

TECK 04-28-2004 08:45 PM

Quote:

Originally Posted by NTLDR
I've had no problems running this code on several sites, though I may look into optimising it if and when I have time.

Lee, I hope you did not take it in a bad way my reflection, I was simply trying to help.

If you allow me, I will explain what is wrong with the code.
The query will perform a full scan from ALL forums and ALL threads. At this precise moment, the MySQL % will raise to the sky... for an instance the server will be suffocated with the flood of information it has to compile, in order to display the results, and that?s only for one person... imagine what will happen when 500 users will visit in the same time your front page.

A good rule to keep in mind for coders is: never perform full table scans.
If you have a very small forum with 200-300 posts, that will not really count, since your database is very small, but what do you do with huge forums who have 1 million posts?
Unfortunatelly, the 5 threads limit does not reduce the query scan at all, it will perform it, then grab only the latest 5 results.

What I recommend you to do is this: put a time/date limit in the query. In this way, instead of scanning the hole forum/thread tables, you select a very small portion of it.
The result is obvious, a very small database/server usage... :)

Regards,
Floren.

dutchbb 04-30-2004 08:45 PM

Quote:

Originally Posted by NTLDR
With: (Changing X to the usergroupid you wish to show it for
PHP Code:

if (is_member_of($bbuserinfoX) {

    
// [START HACK='Latest Threads On Forum Home' AUTHOR='NTLDR' VERSION='1.0.0' CHANGEID= 2 ]
    // #################### PROCESS LATEST THREADS #######################
    // fetch the permissions for each forum
    
$forumperms = array();
    foreach(
$forumcache AS $forum) {

        
$forumperms["$forum[forumid]"] = fetch_permissions($forum['forumid']);

        
// ## HIDE FORUMS WITHOUT THE CANVIEW OR CANVIEWOTHERS PERMISSION ##
        
if (!($forumperms["$forum[forumid]"] & CANVIEW) || !($forumperms["$forum[forumid]"] & CANVIEWOTHERS)) {
            
$limitfids .= ','.$forum['forumid'];
        }
    }
    unset(
$forum);

    if (
$vboptions['threadpreview'] > 0) {
        
$previewfield ', post.pagetext AS preview';
        
$previewjoin 'LEFT JOIN '.TABLE_PREFIX.'post AS post ON(post.postid = thread.firstpostid)';
    }

    
$getthreads $DB_site->query("
        ## GET LATEST THREADS ##
        SELECT thread.*,thread.iconid AS threadiconid 
$previewfield
        FROM "
.TABLE_PREFIX."thread AS thread
        LEFT JOIN "
.TABLE_PREFIX."deletionlog AS deletionlog ON(thread.threadid = deletionlog.primaryid AND type = 'thread')
        
$previewjoin
        WHERE open = '1'
        AND forumid NOT IN (0
$limitfids)
        AND thread.visible = '1'
        AND deletionlog.primaryid IS NULL
        ORDER BY lastpost
        DESC LIMIT 5"
);

    while(
$thread $DB_site->fetch_array($getthreads)) {

        
$threads true;
        
$thread['title'] = fetch_censored_text(fetch_trimmed_title(unhtmlspecialchars($thread['title']), 22));
        
$thread['date'] = vbdate($vboptions['dateformat'], $thread['lastpost'], 1);
        
$thread['time'] = vbdate($vboptions['timeformat'], $thread['lastpost']);
        
$thread['preview'] = preg_replace('#\[quote(=("|"|\'|).*\\2)?\](.*)\[/quote\]#siU'''$thread['preview']);
        
$thread['preview'] = htmlspecialchars_uni(fetch_trimmed_title(strip_bbcode(fetch_censored_text($thread['preview']), falsetrue), $vboptions['threadpreview']));
        
$thread['replycount'] = vb_number_format($thread['replycount']);
        
$thread['views'] = vb_number_format($thread['views']);

        
// thread icon
        
$show['icon'] = false;
      
$icon fetch_iconinfo($thread['iconid']);

      if (
is_array($icon)) {
          
$show['icon'] = true;
          
$thread['threadiconpath'] = $icon['iconpath'];
          
$thread['threadicontitle'] = $icon['title'];
      }

        
// show goto new post
        
$show['firstnew'] = false;
        
$bbforumview fetch_bbarray_cookie('forum_view'$thread['forumid']);

        if (
$bbforumview $bbuserinfo['lastvisit']) {
            
$lastread $bbforumview;
        } else {
            
$lastread $bbuserinfo['lastvisit'];
        }

        if (
$thread['lastpost'] > $lastread) {

            
$threadview fetch_bbarray_cookie('thread_lastview'$thread['threadid']);

            if (
$thread['lastpost'] > $threadview) {
                
$show['firstnew'] = true;
                
$show['icon'] = false;
            }
        }

        
exec_switch_bg();

        eval(
"\$threadbits .= \"".fetch_template('forumhome_latestthreadbit')."\";");
    }
    if (
$threads) {
        
$show['latestthreads'] = true;
    }
    
// memory saving
    
unset($thread$threads);
    
$DB_site->free_result($getthreads);
    
// [END HACK='Latest Threads On Forum Home' AUTHOR='NTLDR' VERSION='1.0.0' CHANGEID= 2 ]



Sorry to ask, can you give an example when using permission for 2 or more usergroups, I 'm not sure if and how to use the "OR" here

Dio Br@ndo 04-30-2004 08:52 PM

Create a new phrase called latest_threads in the GLOBAL group with the following content:

i dont understand where create the phrase....can u explain me better pls?

and

$thread['views'] = vb_number_format($thread['views']);

doesnt works and show always 0 :ermm:

NTLDR 04-30-2004 08:57 PM

Quote:

Originally Posted by TECK
Lee, I hope you did not take it in a bad way my reflection, I was simply trying to help.

Of course not, thanks for the input, I'll try and update the instructions with a more suitable query :)


All times are GMT. The time now is 02:09 PM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.02858 seconds
  • Memory Usage 1,892KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (3)bbcode_php_printable
  • (7)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (4)pagenav_pagelink
  • (1)pagenav_pagelinkrel
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (10)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • pagenav_page
  • pagenav_complete
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete