迭代不适用于PHP的数组

时间:2013-03-25 14:46:24

标签: php mysql session login

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

$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您有权访问

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

不是解决问题的方法。

首先,看起来您的数据库架构没有规范化 - 用户是一个实体,页面是不同的实体,谁有权访问应在第三个表中定义的页面(分解N:M关系)。 / p>

  

我正在尝试比较$ 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'])
. "'");

答案 2 :(得分: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");