Log in

View Full Version : whats going on here? :(


Logikos
07-22-2004, 05:17 AM
Yes im having abit of a problem with some hacking here. Maybe someone can help me out. Worth a shot huh? :p Okay here it goes.



I started to work on a hack that will remember if a user has clicked the I Agree on a T.O.S. Page. I was told to use a session or a setcookie. But then i decided to go ahead and do it this way:


add a field to the user table called 'tos' or 'agree' or something - enum ('n','y');

set all current and new users to 'n';

on the usercp.php page, once they successfully enter it, check this field - if it's set to 'n' then show the user agreement form - if it's set to 'y' then let them go to there user cp panel.


So heres what i did.

I ran this SQL Query:

ALTER TABLE user ADD tos ENUM('n','y') DEFAULT 'n';



And this is what you put in the begining of the usercp.php after permissions are checked.


//connetion info
$query = mysql_query("select tos from user where id='$user[userid]'") or die(mysql_error());
$row=mysql_fetch_array($query);
$user = $row[tos];

if ($user=='n')
{
// this will fetch the agreement template
eval('print_output("' . fetch_template('clients_tos') . '");');
}
else
{
//All the usercp.php code here
}


then the agreement template is this:

<form action="tos.php" method="post">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr><td>

<!-- My Agreement Terms Here -->


<input type="checkbox" name="agree" value="y" /><strong>I have read, and agree to abide by tos rules.</strong>

<input type="submit" value="I Agree">
</td></tr>
</table>

</form>



Then i made a tos.php file with this:


<?php
if ($_POST['agree'] == 'y')
{
echo $user[userid];
mysql_query("update user set tos = 'y' where id='$user[userid]'");
echo 'redirect code';
}
?>


But when i go to the usercp.php i get this error now from the or die(mysql_error()

Unknown column 'id' in 'where clause'

Any ideas? Someone told me to do this sql

ALTER TABLE user ADD id BIGINT NOT NULL;

and when i did that i had this problem. lets say no users have clicked i agree yet. And user A logs in and see the new agreement, then clicks the i agree button. Then he is redirect back to the usercp page. which is perfect. But now when user B logs in, he don't see it cause user A has clicked yes. This is vice versa also. Seems if any one person clicks yes, it sets yes to all.

i was told it may be that the $user array isn't returning the user data.

Any other ideas why? Thanks guys!!!!!!!!

assassingod
07-22-2004, 07:13 AM
mysql_query("update user set tos = 'y' where id='$user[userid]'");


That should be

mysql_query("update user set tos = 'y' where userid='$user[userid]'");


The column is called userid, not id :)

Also, you can require global.php and you wont have to use mysql_query:


<?php

require_once('./global.php');

if ($_POST['agree'] == 'y')
{
echo $user[userid];
$DB_site->query("update user set tos = 'y' where userid='$user[userid]'");
echo 'redirect code';
}
?>

Xenon
07-22-2004, 07:28 AM
Steve is right :)

just a suggestions, when you add yes/no options, i would suggest to use the useroptions bitarray for that.
Just a hint of course, enum isn't bad :)

Logikos
07-22-2004, 07:47 AM
Steve is right :)

just a suggestions, when you add yes/no options, i would suggest to use the useroptions bitarray for that.
Just a hint of course, enum isn't bad :)
How would i do that? And thanks Steve, can't belive i didn't see that. Kinda late :p

Xenon
07-22-2004, 08:05 AM
at first you have to edit init.php

there you will find this codeblock:

// Defined constants used for user field.
$_USEROPTIONS = array(
'showsignatures' => 1,
'showavatars' => 2,
'showimages' => 4,
'coppauser' => 8,
'adminemail' => 16,
'showvcard' => 32,
'dstauto' => 64,
'dstonoff' => 128,
'showemail' => 256,
'invisible' => 512,
'showreputation' => 1024,
'receivepm' => 2048,
'emailonpm' => 4096,
'hasaccessmask' => 8192,
//'emailnotification' => 16384, // this value is now handled by the user.autosubscribe field
'postorder' => 32768,
);

you can add more options there, you just have to make sure, that your values, are 2 ^x and bigger than the currently existing ones, so in your special case here, i suggest something like:

// Defined constants used for user field.
$_USEROPTIONS = array(
'showsignatures' => 1,
'showavatars' => 2,
'showimages' => 4,
'coppauser' => 8,
'adminemail' => 16,
'showvcard' => 32,
'dstauto' => 64,
'dstonoff' => 128,
'showemail' => 256,
'invisible' => 512,
'showreputation' => 1024,
'receivepm' => 2048,
'emailonpm' => 4096,
'hasaccessmask' => 8192,
//'emailnotification' => 16384, // this value is now handled by the user.autosubscribe field
'postorder' => 32768,
'tosagree' => 1048576,
);

and then instead of:
$DB_site->query("update user set tos = 'y' where userid='$user[userid]'");

you have to use:
$DB_site->query("UPDATE user SET options = options | $_USEROPTIONS[tosagree] WHERE userid = $user[userid]");


There is a thread at the mod hints and tips iirc explaining how to work with bitarrays :)

Logikos
07-22-2004, 08:08 AM
Thank you very much Xenon! Will look into this right now. Who needs sleep! (2 days and counting....)

Xenon
07-22-2004, 08:48 AM
You're welcome :)

Hmm, who needs sleep? Would you be so kind to explain the word sleep? I don't recognize it ^^

Andreas
07-22-2004, 08:51 AM
@Xenon
I don't think it is a good idea to use currently unused bits in standard bitfields for custom hacks. Sooner or later Jelsoft will use them for other options, which will cause problems then.

Xenon
07-22-2004, 09:00 AM
That's why i left out a few bits between :)

the way Jelsoft did it was to make it easier for custom additions, and so i would recommend to follow their way ;)

Logikos
07-22-2004, 09:20 AM
would require deleting the old query and adding a new one?

Logikos
07-22-2004, 10:30 AM
i got it all working! :) Thanks for the help.

Xenon
07-23-2004, 08:01 AM
you're welcome :)