PDA

View Full Version : what's going on with this code???


jesus likes pie
07-29-2008, 09:51 PM
I nearly got this to work perfectly but there's a problem driving me NUTS:

Here's the plugin code (hook: profile_updateprofile)

$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 1217395058 at 1217395058 ---------------

bump..

Marco van Herwaarden
07-30-2008, 09:37 AM
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.

jesus likes pie
07-30-2008, 02:45 PM
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?

RLShare
07-30-2008, 03:11 PM
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

jesus likes pie
07-30-2008, 03:24 PM
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.