【问题标题】:Iteration not working in array for PHP迭代在 PHP 的数组中不起作用
【发布时间】:2013-03-25 14:46:24
【问题描述】:

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

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

【问题讨论】:

  • 简单的问题,但$row["UserName"] 是一个数组吗? While 循环应该为 3 个用户循环 3 次,您应该与 if ($currentUser == $row["UserName"]) 进行比较
  • 哦,in_array 是最后一分钟添加的。我只是使用“==”来实际比较它们。有没有其他方法可以做到这一点?我尝试使用 array_values,但也没有用。
  • 但是 $currentUser 是一个字符串吗?如果是,则 == 必须有效。

标签: php mysql session login


【解决方案1】:

不是解决问题的方法。

首先,您的数据库架构看起来好像没有标准化 - 用户是一个实体,页面是不同的实体,谁有权访问应该在第三个表中定义哪些页面(分解 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'])
. "'");

【讨论】:

    【解决方案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
    

    【讨论】:

    • 所以我尝试运行整个查询,并检查它是真还是假,但查询没有返回任何内容,我不知道为什么,因为当我在 WorkBench 中测试它时它工作正常。
    • 对不起,我应该更清楚。您可能想要的是: $query = mysql_query("SELECT UserName FROM tblUsers WHERE PageOne = 1 AND UserName='".mysql_real_escape_string($currentUser)."'") 或 die (mysql_error());
    • 该查询在 MySQL Workbench 中有效,但在我尝试在我的代码中运行时无效。 mysql_real_escape_string($currentUser) 确实返回了正确的字符串,所以我不确定为什么查询不打印任何内容..
    【解决方案3】:

    在 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");
    

    【讨论】:

    • 奇怪的是,这不起作用......它似乎仍然进入 else 语句,即使我的 PageOne 为 currentUser 设置为 1。
    • 感谢您的编辑。但是,如果我无法访问该行,我将如何拒绝用户。如果我只是把骰子放在外面,无论如何它都会拒绝。 :( 谢谢
    • 如果你把它放在一个函数中,如果你找到了用户就返回,如果用户当前存在,它永远不会到达 die()。如果用户不存在,则结束while循环并执行die()。试试看:)
    • 很抱歉一直打扰你,但是当我尝试它时,它总是会死,即使它不应该死。原因是,如果我在 if 语句中回显,它仍然只获取该行的第一个元素。谢谢!
    • 但是在问题中你说你有: User1User2you have access 所以你迭代行,检查值,只有当你知道当前用户不是你拥有的 3 个用户时,你才会死在表中
    猜你喜欢
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 2010-10-20
    • 2021-12-08
    • 1970-01-01
    • 2014-01-12
    • 2020-11-23
    • 2014-09-18
    相关资源
    最近更新 更多