我创建了一个功能,可以检查用户在特定页面上的权限。它应该返回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';
答案 0 :(得分:3)
解决问题的方法之一是以更简洁的方式重写您的查询,以便您只传递一次帐户值
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 演示