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 08-12-2004, 12:27 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default I'm having a PHP/MySQL problem. Help would be appreciated! :)

Hi! Okay, here's the background... I'm trying to modify an existing hack - Who Viewed This Thread (https://vborg.vbsupport.ru/showthread.php?t=61222).

Now, this hack creates an additional field ("whoviewed") in the "thread" table, and checks/stores UserIDs of people who view any given thread.


The step I'm on requires that a duplicate set of information be made and maintained.

What I did was to create an additional field in the same table called "whoviewedcounter".


I also changed the original addition to the ShowThread.php file:


PHP Code:
 
$showinvisible 
1
 
// Get who has already viewed this thread 
$currentthread $DB_site->query_first("SELECT whoviewed FROM ".TABLE_PREFIX."thread WHERE threadid = $threadid"); 
$vieweduserids explode(" "$currentthread['whoviewed']); 
 
$userinfo fetch_userinfo($bbuserinfo['userid']); 
 
 
if (!
$userinfo['invisible'] OR $showinvisible

    if (!empty(
$currentthread['whoviewed'])) 
    { 
        if (!
in_array($bbuserinfo['userid'], $vieweduserids)) 
        { 
            
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewed = CONCAT(whoviewed, \" \", \"" .$bbuserinfo['userid'] . "\") WHERE threadid = $threadid"); 
        } 
    } 
    else 
    { 
        
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewed = \"" $bbuserinfo['userid'] . "\" WHERE threadid = $threadid"); 
    } 

// Who has viewed this thread? 
if (empty($currentthread['whoviewed'])) 

    
$thread['viewers'] = '('.strtolower($vbphrase['none']).')'

else 

    
$result $DB_site->query("SELECT userid, username FROM ".TABLE_PREFIX."user WHERE userid IN (" implode(", "$vieweduserids) . ")"); 
    
$viewers = array(); 
    while (
$user $DB_site->fetch_array($result)) 
    { 
            
array_push($viewers"<a href=\"member.php?".$session['sessionurl'] . "u=".$user['userid'] . "\">" htmlspecialchars($user['username']) .    "</a>"); 
    } 
    
$thread['viewers'] = implode(", "$viewers); 


And I modified it to this:


PHP Code:
 
 
$showinvisible 
1
 
// Get who has already viewed this thread 
$currentthread $DB_site->query_first("SELECT whoviewed FROM ".TABLE_PREFIX."thread WHERE threadid = $threadid"); 
$vieweduserids explode(" "$currentthread['whoviewed']);
 
$currentthreadcounter $DB_site->query_first("SELECT whoviewedcounter FROM ".TABLE_PREFIX."thread WHERE threadid = $threadid");
$vieweduseridscounter explode(" "$currentthread['whoviewedcounter']);
 
 
$userinfo fetch_userinfo($bbuserinfo['userid']); 
 
if (!
$userinfo['invisible'] OR $showinvisible

    if (!empty(
$currentthread['whoviewed'])) 
    { 
        if (!
in_array($bbuserinfo['userid'], $vieweduserids)) 
        { 
            
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewed = CONCAT(whoviewed, \" \", \"" .$bbuserinfo['userid'] . "\") WHERE threadid = $threadid"); 
        } 
    } 
    else 
    { 
        
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewed = \"" $bbuserinfo['userid'] . "\" WHERE threadid = $threadid"); 
    } 
 
    if (!empty(
$currentthreadcounter['whoviewedcounter'])) 
    { 
        if (!
in_array($bbuserinfo['userid'], $vieweduseridscounter)) 
        { 
            
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewedcounter = CONCAT(whoviewedcounter, \" \", \"" .$bbuserinfo['userid'] . "\") WHERE threadid = $threadid"); 
        } 
    } 
    else 
    { 
        
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewedcounter = \"" $bbuserinfo['userid'] . "\" WHERE threadid = $threadid"); 
    } 

// Who has viewed this thread? 
if (empty($currentthread['whoviewed'])) 

    
$thread['viewers'] = '('.strtolower($vbphrase['none']).')'

else 

    
$result $DB_site->query("SELECT userid, username FROM ".TABLE_PREFIX."user WHERE userid IN (" implode(", "$vieweduserids) . ")"); 
    
$viewers = array(); 
    while (
$user $DB_site->fetch_array($result)) 
    { 
            
array_push($viewers"<a href=\"member.php?".$session['sessionurl'] . "u=".$user['userid'] . "\">" htmlspecialchars($user['username']) .    "</a>"); 
    } 
    
$thread['viewers'] = implode(", "$viewers); 

 
if (empty(
$currentthreadcounter['whoviewedcounter'])) 

    
$thread['viewerscounter'] = '('.strtolower($vbphrase['none']).')'

else 

    
$resultcounter $DB_site->query("SELECT userid, username FROM ".TABLE_PREFIX."user WHERE userid IN (" implode(", "$vieweduseridscounter) . ")"); 
    
$viewerscounter = array(); 
    while (
$user $DB_site->fetch_array($resultcounter)) 
    { 
            
array_push($viewerscounter"<a href=\"member.php?".$session['sessionurl'] . "u=".$user['userid'] . "\">" htmlspecialchars($user['username']) .    "</a>"); 
    } 
    
$thread['viewerscounter'] = implode(", "$viewerscounter); 


Effectively, I duplicated everything here - but I renamed every reference to point to the new field, and I renamed every variable to distinguish it from the original set.

I also made the requisite SHOWTHREAD template changes to reference "$thread[viewerscounter]" in addition to "$thread[viewers]".



Here's the problem: When I view a thread for the first time, both the original section and my added section show "None" for the users who have viewed this thread.

However, the second time I view that page (or if I hit Refresh), I get an error:


Code:
 
 
Database error in vBulletin 3.0.3:
Invalid SQL: SELECT userid, username FROM user WHERE userid IN ()
mysql error: 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 ')' at line 1
mysql error number: 1064
Date: Thursday 12th of August 2004 09:06:01 AM
Script: http://www.mydomain.com/testforums/showthread.php?t=15
Referer: https://www.mydomain.com/testforums/...isplay.php?f=6
Username: Admin
IP Address: 192.168.1.1

In addition to the above error, I notice that the same UserID is being added to the new field (whoviewedcounter) multiple times (i.e. "1 1 1 1 1") - once for each view, I think.

With the changes I made, I wouldn't think I would have any problems - but obviously I missed something (or a few somethings).


If someone can point out what I did wrong, I would greatly appreciate it!
Reply With Quote
  #2  
Old 08-13-2004, 07:54 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I apologize for not putting more specific information in the Thread Title. By the time I realized that, I discovered that I wasn't allowed to edit that information.
Reply With Quote
  #3  
Old 08-13-2004, 08:03 PM
Colin F's Avatar
Colin F Colin F is offline
 
Join Date: Jul 2004
Location: Switzerland
Posts: 1,551
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I would use the single tiny squigly lines-on-top (') instead of the double ones (") here:

implode(", ", $vieweduserids)

making it:

implode(', ', $vieweduserids)

also, you might want to save the ID's in the database using the format 1,2,3,4,5,6,7 as you woudn't have to explode() and implode() again.

Then again, if anything I said doesn't make sense, excuse me. I'm extremely tired...
Reply With Quote
  #4  
Old 08-13-2004, 08:29 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Colin F

I would use the single tiny squigly lines-on-top (') instead of the double ones (") here:

implode(", ", $vieweduserids)

making it:

implode(', ', $vieweduserids)

also, you might want to save the ID's in the database using the format 1,2,3,4,5,6,7 as you woudn't have to explode() and implode() again.


Then again, if anything I said doesn't make sense, excuse me. I'm extremely tired...
I tried making the character change - it didn't work. I even tried using that character change for all instances of the "implode" function, and that didn't do anything either.

As for your second idea, if you think that is the better way to do it, I'm all for it. However, I'm not sure how to modify the code to make it work that way.


This is the original addition to the ShowThread.php file:


PHP Code:
 
 
$showinvisible 
1
// Get who has already viewed this thread 
$currentthread $DB_site->query_first("SELECT whoviewed FROM ".TABLE_PREFIX."thread WHERE threadid = $threadid"); 
$vieweduserids explode(" "$currentthread['whoviewed']); 
$userinfo fetch_userinfo($bbuserinfo['userid']); 
if (!
$userinfo['invisible'] OR $showinvisible

    if (!empty(
$currentthread['whoviewed'])) 
    { 
        if (!
in_array($bbuserinfo['userid'], $vieweduserids)) 
        { 
            
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewed = CONCAT(whoviewed, \" \", \"" .$bbuserinfo['userid'] . "\") WHERE threadid = $threadid"); 
        } 
    } 
    else 
    { 
        
$DB_site->query("UPDATE ".TABLE_PREFIX."thread SET whoviewed = \"" $bbuserinfo['userid'] . "\" WHERE threadid = $threadid"); 
    } 

// Who has viewed this thread? 
if (empty($currentthread['whoviewed'])) 

    
$thread['viewers'] = '('.strtolower($vbphrase['none']).')'

else 

    
$result $DB_site->query("SELECT userid, username FROM ".TABLE_PREFIX."user WHERE userid IN (" implode(", "$vieweduserids) . ")"); 
    
$viewers = array(); 
    while (
$user $DB_site->fetch_array($result)) 
    { 
            
array_push($viewers"<a href=\"member.php?".$session['sessionurl'] . "u=".$user['userid'] . "\">" htmlspecialchars($user['username']) .    "</a>"); 
    } 
    
$thread['viewers'] = implode(", "$viewers); 


If you could show me what I need to do in order to make the original code work with the comma delineated format - I can then try again to modify it by adding a second section and see if it works.

(p.s. Thank you for your patience, and your help!)
Reply With Quote
  #5  
Old 08-14-2004, 07:25 AM
Colin F's Avatar
Colin F Colin F is offline
 
Join Date: Jul 2004
Location: Switzerland
Posts: 1,551
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

PHP Code:
$showinvisible 1
// Get who has already viewed this thread 
$currentthread $DB_site->query_first("SELECT whoviewed FROM ".TABLE_PREFIX."thread WHERE threadid = $threadid"); 
$userinfo fetch_userinfo($bbuserinfo['userid']); 
if (!
$userinfo['invisible'] OR $showinvisible

    if (!empty(
$currentthread['whoviewed'])) 
    {
        
$vieweduserids explode(","$currentthread['whoviewed']);
        if (!
in_array($bbuserinfo['userid'], $vieweduserids)) 
        {
            
$adduserid ",".$bbuserinfo[userid];
            
$DB_site->query("UPDATE " TABLE_PREFIX "thread SET whoviewed = CONCAT(whoviewed, '$adduserid') WHERE threadid = $threadid"); 
        } 
    } 
    else 
    { 
        
$DB_site->query("UPDATE " TABLE_PREFIX "thread SET whoviewed = $bbuserinfo[userid] WHERE threadid = $threadid"); 
    } 
}

// Who has viewed this thread? 
if (empty($currentthread['whoviewed'])) 

    
$thread['viewers'] = '('.strtolower($vbphrase['none']).')'

else 

    
$result $DB_site->query("SELECT userid, username FROM " TABLE_PREFIX "user WHERE userid IN ($currentthread[whoviewed])"); 
    
$viewers = array(); 
    while (
$user $DB_site->fetch_array($result)) 
    { 
            
array_push($viewers"<a href=\"member.php?".$session['sessionurl'] . "u=".$user['userid'] . "\">" htmlspecialchars($user['username']) .    "</a>"); 
    } 
    
$thread['viewers'] = implode(", "$viewers); 


Try this maybe...
Reply With Quote
  #6  
Old 08-14-2004, 12:26 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Colin F

Try this maybe...
When I did, I got this error:


Code:
 
 
Database error in vBulletin 3.0.3:
Invalid SQL: SELECT userid, username FROM user WHERE userid IN (
)
mysql error: 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 ')' at line 2
mysql error number: 1064
Date: Saturday 14th of August 2004 09:20:49 AM
Script: http://www.mydomain.com/testforums/showthread.php?t=14
Referer: https://www.mydomain.com/testforums/...isplay.php?f=6
Username: Admin
IP Address: 192.168.1.1

The database showed that ",1" was entered. I'm wondering whether we're better off trying to fix the original modification, or if you still feel that it would be the better choice to make this work with commas.
Reply With Quote
  #7  
Old 08-14-2004, 01:22 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Aha! False alarm, Colin! I found out part of the problem - one of the earlier revisions corrupted the format of the data that was in the table. As a result, any of our future revisions were going to fail, because the new Queries couldn't interpret the data that was currently in those fields.

Once I cleared them out, your revised code (with the commas) worked perfectly! I was able to modify it for a duplicate set of data without any problems.


My remaining question to you is, do you know if it's possible to convert the old format into your new format? Or do I have no choice but to wipe the old data and start fresh?
Reply With Quote
  #8  
Old 08-15-2004, 06:06 AM
Colin F's Avatar
Colin F Colin F is offline
 
Join Date: Jul 2004
Location: Switzerland
Posts: 1,551
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

You would have to make a small script, something like this:

PHP Code:
$threads $DB_site->query("SELECT threadid,whoviewed FROM " TABLE_PREFIX "thread WHERE whoviewed != ''");
while (
$thread $DB_site->fetch_array($threads))
{
$vieweduserids explode(" "$thread['whoviewed']);
$changeduserids implode(","$vieweduserids);
$DB_site->query("UPDATE thread SET whoviewed = '$changeduserids' WHERE threadid = $thread[threadid]");

You might have to change the explode part to fit whatever the data looks like now.
Reply With Quote
  #9  
Old 08-15-2004, 12:57 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Colin F

You would have to make a small script, something like this:


You might have to change the explode part to fit whatever the data looks like now.
I'll give it a try as soon as the rest of the modification is complete.


Thank you for all of your help, Colin!
Reply With Quote
  #10  
Old 08-17-2004, 10:56 PM
Ocean's Avatar
Ocean Ocean is offline
 
Join Date: Mar 2004
Posts: 208
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:
Originally Posted by Colin F

You would have to make a small script, something like this:

<snip>

You might have to change the explode part to fit whatever the data looks like now.
So, if I have this script saved as a PHP file:

PHP Code:
 
<?php
 
$threads 
$DB_site->query("SELECT threadid,whoviewed FROM " TABLE_PREFIX "thread WHERE whoviewed != ''"); 
while (
$thread $DB_site->fetch_array($threads)) 

$vieweduserids explode(" "$thread['whoviewed']); 
$changeduserids implode(","$vieweduserids); 
$DB_site->query("UPDATE thread SET whoviewed = '$changeduserids' WHERE threadid = $thread[threadid]"); 

 
?>

... what is the recommended way of running this script?

Is it just a matter of calling it from a URL? (i.e. www.mydomain.com/forums/customscript.php)

If so, are there any arguments that need to be passed? I'd be concerned as to whether it processed the correct board or not. (as I also might have www.mydomain.com/forum2)


Thanks!
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 11:08 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.05789 seconds
  • Memory Usage 2,372KB
  • Queries Executed 11 (?)
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
  • (2)bbcode_code
  • (6)bbcode_php
  • (4)bbcode_quote
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (1)pagenav
  • (1)pagenav_curpage
  • (1)pagenav_pagelink
  • (10)post_thanks_box
  • (10)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (10)post_thanks_postbit_info
  • (10)postbit
  • (10)postbit_onlinestatus
  • (10)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_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
  • pagenav_page
  • pagenav_complete
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete