MSSQL其中用户名的权限是必需的

时间:2014-12-27 15:15:56

标签: php sqlsrv

我创建了一个功能,可以检查用户在特定页面上的权限。它应该返回0或1.这是我在页面上使用的函数。 但这部分不是问题,因为这可以按预期工作。

$admin_model = $this->loadModel('AdminModel');
if($admin_model->checkAdmin($_SESSION['username']) == 0) {
    header('Location: ' . URL);
    exit();
}

这就是问题所在。我的帐户具有M的权限,因此这应该返回值1,但它返回0。

public function checkAdmin($account) {
    $sql = "SELECT * FROM ACCOUNTS WHERE
            account = :account AND authority = 'L' OR
            account = :account AND authority = 'M' OR
            account = :account AND authority = 'N' OR
            account = :account AND authority = 'O' OR
            account = :account AND authority = 'P'";
    $query = $this->db->prepare($sql);
    $query->execute(array(':account' => $account));

    return $query->rowCount();
}

我也尝试在SQL Management Studio中使用此查询,它可以正常工作。但为什么查询在PHP中不起作用?

SELECT * FROM ACCOUNTS WHERE
account = 'ibab' AND authority = 'L' OR
account = 'ibab' AND authority = 'M' OR
account = 'ibab' AND authority = 'N' OR
account = 'ibab' AND authority = 'O' OR
account = 'ibab' AND authority = 'P';

1 个答案:

答案 0 :(得分:3)

@MichaelBerkowski在评论中完美地展示了您的代码的直接问题,即在预准备语句中多次使用相同的命名参数,这是不允许的。

解决问题的方法之一是以更简洁的方式重写您的查询,以便您只传递一次帐户值

SELECT * 
  FROM accounts 
 WHERE account = :account 
   AND authority IN('L','M','N','O','P')
在您的原始查询中

BTW,您应该使用括号将AND组与OR分开。


更新:正如@ÁlvaroG.Vicario在评论中提到的那样,如果最终目标只是想知道您是否有任何记录,则无需返回整个结果集。您可以使用COUNT()。如果您计划拥有多个身份验证记录,甚至可以添加TOP 1(假设您使用的是SQL Server)。

SELECT TOP 1 COUNT(*) flag 
  FROM accounts 
 WHERE account = :account 
   AND authority IN('L','M','N','O','P')

它始终会在flag列中为您提供1或0。

这是 SQLFiddle 演示