Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
  #1  
Old 07-29-2008, 09:51 PM
jesus likes pie jesus likes pie is offline
 
Join Date: Apr 2005
Posts: 342
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default what's going on with this code???

I nearly got this to work perfectly but there's a problem driving me NUTS:

Here's the plugin code (hook: profile_updateprofile)

PHP Code:
$user $db->query_first("
            SELECT field5
            FROM " 
TABLE_PREFIX "userfield
            WHERE userid = " 
$vbulletin->userinfo['userid'] . "
        "
);


        if (
$user['field5'] == 'Windows Vista Ultimate')
        {
        
$membergroupids $userdata->fetch_field('membergroupids');
        if (
$membergroupids != "")
        {
            
$membergroupids str_replace(", 10"""$membergroupids);
            
$membergroupids str_replace("10"""$membergroupids);
            
$membergroupids $membergroupids ", 9";
        }
        else
        {
            
$membergroupids '9';
        }

        
$userdata->set('membergroupids'$membergroupids);
        }
        else 
// ($user['field5'] == 'Windows Vista Home Premium')
        
{
        {
        
$membergroupids $userdata->fetch_field('membergroupids');
        if (
$membergroupids != "")
        {
            
$membergroupids str_replace(", 9"""$membergroupids);
$membergroupids str_replace("9"""$membergroupids);
            
$membergroupids $membergroupids ", 10";
        }
        else
        {
            
$membergroupids '10';
        }

        
$userdata->set('membergroupids'$membergroupids);
        }
        } 
Goal: There is a field I have for Operating System selection. It's a single selection dropdown (field5). Depending on what the user selects I want to move them into a specific secondary usergroup. They should not be able to be in 2 OS usergroups at the same time so if they switch the OS selection the code is supposed to remove all instances of the other OS-related usergroup IDs and then it updates with the new usergroup ID.

The current code is of course incomplete. I only have 2 selections because I was testing if it would work as designed so far. And it's nearly there.

The problem:

I select one of the options (let's say windows ultimate) and click update --> it will correctly modify the database. So far so good. However, if I go back and change from ultimate to home premium then the databse will not be altered. I cannot understand WHY this happens. Now here's the kicker: if I go back to edit my profile, the field IS set to home premium, so without touching anything and then clicking update THEN the database will get modified to reflect the usergroup changes.

Effectively you need to update your profile twice for it to work. No idea why.

And it gets a bit stranger...

If you only update once (so the databse has not changed yet in regards to the usergroup) and then return to the field selection but switch back to Ultimate and click update, the databse SHOULD not get modified since you put the field selection to correspond with what the databse is showing. HOWEVER...it DOES get modified and you get put into the home premium usergroup when it should be in the ultimate usergroup. And then it gets really confused because it now switched the IDs which correspond to the usergroups and furthermore it no longer requires that you update twice in order for it to modify the database usergroup records.

So once vB reverses the code to make ultimate updates give out the home premium usergroup (and vice verca) it no longer needs you to update twice.


Any ideas on WHY this is happening???

--------------- Added [DATE]1217395058[/DATE] at [TIME]1217395058[/TIME] ---------------

bump..
Reply With Quote
  #2  
Old 07-30-2008, 09:37 AM
Marco van Herwaarden Marco van Herwaarden is offline
 
Join Date: Jul 2004
Posts: 25,415
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Without looking at all the code, i can make a guess why it fails.

You retrieve field5 in the top of your plugin with a query. The database has however not been updated yet at this point, and thus still holds the old value. Only after the update has been completed the new value will be in the database.

What you should do is, is retrieve the "old" value from the database, and if not the same as the value selected on the page (ie. user made a new choice), process it based on the page value, not the current database value.
Reply With Quote
  #3  
Old 07-30-2008, 02:45 PM
jesus likes pie jesus likes pie is offline
 
Join Date: Apr 2005
Posts: 342
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Is there a hook which is after the database has been updated?

If not, how can I know/select the value selected on the page by the user?
Reply With Quote
  #4  
Old 07-30-2008, 03:11 PM
RLShare RLShare is offline
 
Join Date: Jun 2008
Posts: 499
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It would add needless queries to do it after the database was updated. Just process the information that is passed to the script from the form. If you do not know how to process form data google for processing forms with php.. Also VB has an input class for sanitizing the data.

https://vborg.vbsupport.ru/showthread.php?t=119372
Reply With Quote
  #5  
Old 07-30-2008, 03:24 PM
jesus likes pie jesus likes pie is offline
 
Join Date: Apr 2005
Posts: 342
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Yeah I tried doing it the normal way with PHP but it wasn't really working but I'll take a look at that link..thanks.
Reply With Quote
Reply

Thread Tools
Display Modes

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 12:41 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.13732 seconds
  • Memory Usage 2,206KB
  • 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
  • (1)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (5)post_thanks_box
  • (5)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (5)post_thanks_postbit_info
  • (5)postbit
  • (5)postbit_onlinestatus
  • (5)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
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete