我希望有人能帮我。我尝试使用admin或writer登录到admin面板,并阻止示例用户登录,但是当我使用此代码时,出现了一些问题:
<?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'或'writer')这也让示例用户登录到管理面板,我需要帮助阻止用户登录到这个页面
谢谢您。
3条答案
按热度按时间jexiocij1#
请注意,如果你的第一个条件是真的,那么它永远不会检查你的第二个条件或声明。
复制并使用它
yizd12fk2#
我想你少了一个状况良好的零件。将此添加到代码中:
所以应该是这样的:
wvmv3b1j3#
sql查询的预期代码可能是:
重要提示:您甚至可以(而且应该)通过为会话id使用准备好的语句来改进这一点,而不是直接使用值。否则,找到设置id方法的人可以使用sql注入以您意想不到的方式操作您的数据库。
现在回到查询:
如果要检查列中的几个可能值,则不能只写
role = 'admin' OR 'writer'
,但必须分别检查每个值。这意味着它应该是role = 'admin' OR role = 'writer'
. 否则,sql server将尝试'writer'
,一个字符串文本,作为布尔值,而这并不像人们想象的那样。相反,它总是正确的,基本上使查询无用。检查多个值的另一种方法是
IN
关键字。它允许这样的条件role IN ('admin', 'writer')
如果角色是“admin”或“writer”,则为true。混合and和or遵循预定义的运算符优先规则,and比or强。像这样的情况
a AND b OR c
为真,如果:满足条件a和b
或满足条件c。这尤其意味着既不能满足a也不能满足b。
要强制执行优先级,请使用括号:
a AND (b OR c)
只有在下列情况下才满足此条件:满足条件a和条件b
满足条件a和条件c
满足条件a,同时满足条件b和c。