我希望有人可以帮助我。我尝试使用admin或writer登录管理面板并阻止示例用户登录,但是当我使用此代码时,我遇到了一些问题:
<?php
session_start();
include_once("../include/config.php");
if(isset($_SESSION['id'])) {
$sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR 'writer'");
if(mysqli_num_rows($sql) != 1) {
header("Location: ../index.php");
} else {
echo '';
}
} else {
header("Location: ../index.php");
}
此代码允许我只使用admin登录,无法使用writer登录。 当我尝试但是这个('admin'OR'writer')这也让示例用户登录到管理面板,我需要帮助来阻止用户登录到这个页面
谢谢。
答案 0 :(得分:1)
我认为你错过了一个有条件的部分。 将其添加到您的代码中:
or `role` = 'writer'
所以它应该是这样的:
SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR `role` = 'writer'
答案 1 :(得分:0)
请注意,如果您的第一个条件为真,那么它永远不会在OR语句中检查您的第二个条件。
复制并使用它
if(isset($_SESSION['id'])) {
$sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR `role` = 'writer'");
if(mysqli_num_rows($sql) != 1) {
header("Location: ../index.php");
}else {
echo '';
}
}else {
header("Location: ../index.php");
}
答案 2 :(得分:0)
SQL查询的预期代码可能是:
$sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND (`role` = 'admin' OR `role`= 'writer')");
重要:您可以(并且应该)通过使用会话ID的预准备语句而不是直接使用该值来改进它。否则,找到设置ID的方法的人可以使用SQL injection以您不期望的方式操作数据库。
现在回到查询:
role = 'admin' OR 'writer'
,但您必须单独检查每个值。这意味着它应该是role = 'admin' OR role = 'writer'
。否则,SQL服务器将尝试将'writer'
(一个字符串文字)作为布尔值进行评估,而这并不是人们可能认为的那样。相反,它总是如此,基本上使查询无用。IN
关键字。它允许role IN ('admin', 'writer')
之类的条件,如果角色是“管理员”或“作家”,则属实。在预定义operator precedence rules之后混合AND和OR,AND比OR强。所以a AND b OR c
这样的条件是真的,如果:
要强制执行优先顺序,请使用括号:a AND (b OR c)
只有在以下情况下才能满足此条件: