在PHP中设置权限

I have a table called admin_permissions with the following columns:

  1. sequence
  2. page_name
  3. level_user
  4. level_admin
  5. level_support
  6. level_accounts

the last 4 columns are the different levels

I have this code which checks the permissions:

$permission_sql="SELECT * from admin_permissions where page_name = '".$_SERVER["REQUEST_URI"]."' ";
$permission_rs=mysql_query($permission_sql,$conn);
if(mysql_num_rows($permission_rs) == 0)
{
    echo '<h2 align="center">An Error has occurred!</h2>';
    exit();
}
else
{
    $permission_result=mysql_fetch_array($permission_rs);
    if($usertype_user != $permission_result["level_user"] or 
    $usertype_support != $permission_result["level_support"] or 
    $usertype_admin != $permission_result["level_admin"] or 
    $usertype_accounts != $permission_result["level_accounts"])
    {
        echo '<h2 align="center">Access Denied</h2>';
        echo '<h2 align="center">Please contact your administrator quoting \'Permission Error\' and number \''.$permission_result["sequence"].'\'</h2>';
        exit();
    }
    else
    {

    }
}

the $usertype_... either equal '' or 'yes' and the database results either equal '' or 'yes'

the user i am logged in as, has $permission_result["level_admin"] equal to yes so the above if statement should be false but its not, its saying its true

how can i get the above code to work

*P.S. I am not worried about SQL Injection on this particular code

please remove 'or' try with ||, for checking or condition use the symbol "||" , for checking and condition use "&&"

$permission_sql="SELECT * from admin_permissions where page_name = '".$_SERVER["REQUEST_URI"]."' ";
$permission_rs=mysql_query($permission_sql,$conn);
if(mysql_num_rows($permission_rs) == 0)
{
    echo '<h2 align="center">An Error has occurred!</h2>';
    exit();
}
else
{
    $permission_result=mysql_fetch_array($permission_rs);
    if(($usertype_user != $permission_result["level_user"]) || 
    ($usertype_support != $permission_result["level_support"])|| 
    ($usertype_admin != $permission_result["level_admin"])|| 
    ($usertype_accounts != $permission_result["level_accounts"]))
    {
        echo '<h2 align="center">Access Denied</h2>';
        echo '<h2 align="center">Please contact your administrator quoting \'Permission Error\' and number \''.$permission_result["sequence"].'\'</h2>';
        exit();
    }
    else
    {

    }
}

This statement

if($usertype_user != $permission_result["level_user"] or 
$usertype_support != $permission_result["level_support"] or 
$usertype_admin != $permission_result["level_admin"] or 
$usertype_accounts != $permission_result["level_accounts"])

is true if at least one of these permissions doesn't match, it is false only if all these permissions match. In your case, at least one of user, support, admin, accounts don't match level_user, level_support, level_admin, level_accounts, so check it: you may have admin match (yes==yes or ''==''), but you might be missing something else.

You probably want something like this:

if(
  ($permission_result["level_user"] and $usertype_user!='yes') or
  ($permission_result["level_support"] and $usertype_support!='yes') or
  ($permission_result["level_admin"] and $usertype_admin!='yes') or
  ($permission_result["level_account"] and $usertype_accounts!='yes')
)

Notes

Have a look at type jugling in php: if you have " " instead of "" somewhere, it is evaluated as true

The difference between or and || or and and && is only in precedence, see the manual, doesn't matter in this case.

I'm not sure if $_SERVER["REQUEST_URI"] has to be url encoded; to be sure, you may use mysql_real_escape_string on it - or better, as the comments complain about mysql_* deprecation, mysqli_real_escape_string - or, if you don't use some exotic charset, just addslashes.