Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 11-18-2009, 03:00 AM
ScottW23 ScottW23 is offline
 
Join Date: Oct 2003
Posts: 23
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Easiest way to restrict thread view count to unique IP's?

In vb 3.8.4, what do you think would be the easiest/simplest way to make it so that the thread view count is only incremented for each unique user? In other words, hitting refresh on a thread page wouldn't increment the count, unless the user changed IP's.

Would I need to maintain a database of IP's and check the table before incrementing the count, or is there a simpler way? I could use cookies to do it, but if someone disabled their cookies, then they could just increment the count at will.

Nevermind I decided to just code it. This goes in showthread.php around line 489 replacing the existing views counter code.

Code:
$userip = $_SERVER[REMOTE_ADDR]; 
$ipnum = ip_address_to_number($userip);
 
        $getuip = $db->query_first("
                SELECT count(*) as views  
                FROM ipchecker
                WHERE threadid = ".intval($threadinfo['threadid'])." AND ipaddr=".$ipnum
        ); 
 
if ($getuip['views'] <=1) {
 if ($vbulletin->options['threadviewslive'])
 {
        // doing it as they happen; for optimization purposes, this cannot use a DM!
        $db->shutdown_query(" 
                UPDATE " . TABLE_PREFIX . "thread
                SET views = views + 1 
                WHERE threadid = " . intval($threadinfo['threadid'])
        ); 
 }
 else
 {   
        // or doing it once an hour
        $db->shutdown_query(" 
                INSERT INTO " . TABLE_PREFIX . "threadviews (threadid)
                VALUES (" . intval($threadinfo['threadid']) . ')' 
        ); 
        $db->shutdown_query("
                INSERT INTO ipchecker VALUES (NULL,".time().",".$ipnum.",".intval($threadinfo['threadid']).')'
        ); 
 }
} 

function ip_address_to_number($IPaddress) 
{
    if ($IPaddress == "") { 
        return 0; 
    } else {
        $ips = split ("\.", "$IPaddress");
        return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
    } 
}
Also need to create the table for the IP's:

Quote:
CREATE TABLE `ipchecker` (
`id` int(10) NOT NULL auto_increment,
`datestamp` int(10) NOT NULL default '0',
`ipaddr` int(10) NOT NULL default '0',
`threadid` int(10) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `ipcheck` (`threadid`,`ipaddr`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
And I setup a separate cron to delete any row older than 24 hours to declutter the table. So it restricts views to 1 unique IP per day.
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 05:18 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.03456 seconds
  • Memory Usage 2,161KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (1)bbcode_code
  • (1)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (1)post_thanks_box
  • (1)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit_info
  • (1)postbit
  • (1)postbit_onlinestatus
  • (1)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.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/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete