1

我有这个基本查询,显示哪个用户可以访问哪个页面。

$query = mysql_query("SELECT UserName FROM tblUsers WHERE PageOne = 1") or die (mysql_error());

本质上,这是对所有有权访问 PageOne 的用户进行检查。

我正在尝试比较$currentUser = $_SESSION['username'](正确显示登录的用户)是否是此人。

在获得所有用户之后,

我做了这个简单的循环来检查他们是否可以访问。

while ($row = mysql_fetch_assoc($query))
{
    if (in_array($currentUser,$row["UserName"]))
       echo "you have access"; //for testing purposes
    else
        die("you're not authorized");
}

当它不应该时,这将始终进入 else 语句。如果我尝试对此进行调试,我发现在查询中应该有三个用户,但$row["UserName"]只返回一个用户(第一个用户)。

但是,如果我摆脱 if/else 语句并简单地打印 $row["UserName"],它会打印正确的用户。

那么,我将如何解决这个问题?

谢谢你!

编辑

在 while 循环中,如果我运行 echo $row["UserName"],我会得到 User1User2User3 (其中 User3 是 CurrentUser)

要调试,我运行

if ($currentUser == $row["UserName"])
    echo "you have access";
else
    echo $row["UserName"]; 

我得到

User1User2你有权限

4

3 回答 3

2

您发布的代码仅在返回的第一行恰好与当前用户匹配时才有效。否则循环终止。你可能想要更像这样的东西:

$has_access = false;
while ($row = mysql_fetch_assoc($query))
{
    if ($currentUser==$row["UserName"])
    {
        $has_access = true;
        break;
    }
}
// check $has_access here ...

但是,如果我这样做,我会将整个检查移到您的 SQL 查询中并完全摆脱循环(未经测试):

$query = sprintf("SELECT UserName FROM tblUsers WHERE PageOne = 1 AND UserName = '%s'", mysql_real_escape_string($currentUser));
$result = mysql_query($query) or die (mysql_error());
$has_access = mysql_num_rows($result) > 0;
// check $has_access
于 2013-03-25T15:15:29.403 回答
2

不是解决问题的方法。

首先,您的数据库模式看起来好像没有标准化 - 用户是一个实体,页面是不同的实体,谁有权访问应该在第三个表中定义的页面(分解 N:M 关系)。

我正在尝试比较 $currentUser = $_SESSION['username']

为什么要获取每一行数据以查明当前用户是否具有访问权限:

$qry=mysql_query("SELECT COUNT(username) 
FROM tblUsers 
WHERE PageOne = 1 and username='" 
. mysql_real_escape_string($_SESSION['username'])
. "'");

请记住,您还应该使用未弃用的 API 重新实现代码。因此,它确实应该是:

$qry=mysqli_query("SELECT COUNT(username) as allowed_match
FROM users u
INNER JOIN permissions p
ON u.id=p.user_id 
WHERE p.page='PageOne'
and p.allowed = 1 
and u.username='" 
. mysqli_real_escape_string($_SESSION['username'])
. "'");
于 2013-03-25T15:18:08.867 回答
1

在 while 的每个循环中,它都会获取查询结果的值。另外,如果你在元素不等于当前用户的时候死掉,每次都会死掉,除非$currentUser是$row[]的第一个元素所以if应该是:

 public function checkUserInTable($tableNumber){

         $query = mysql_query("SELECT UserName FROM tblUsers WHERE PageOne = ".$tableNumber."") or die (mysql_error());

         while ($row = mysql_fetch_assoc($query)) {
              if($currentUser == $row["UserName"]){ 
                   echo "you have access"; 
                   return true; 
              } 
         } 

         return false; 
    }

函数调用:

if(checkUserInTable(1))
    echo "User Accepted";
else
    die("Error Message");
于 2013-03-25T14:51:24.760 回答