无法登录到管理面板检查管理员或写入程序

toe95027  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(317)

我希望有人能帮我。我尝试使用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')这也让示例用户登录到管理面板,我需要帮助阻止用户登录到这个页面
谢谢您。

jexiocij

jexiocij1#

请注意,如果你的第一个条件是真的,那么它永远不会检查你的第二个条件或声明。
复制并使用它

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");
        }
yizd12fk

yizd12fk2#

我想你少了一个状况良好的零件。将此添加到代码中:

or `role` = 'writer'

所以应该是这样的:

SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND `role` = 'admin' OR `role` = 'writer'
wvmv3b1j

wvmv3b1j3#

sql查询的预期代码可能是:

$sql = mysqli_query($conn, "SELECT * FROM `users` WHERE `user_id` = '$_SESSION[id]' AND (`role` = 'admin' OR `role`= 'writer')");

重要提示:您甚至可以(而且应该)通过为会话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。

相关问题