0

我真的无法让这个工作。

用户帐户类型分配给 $_SESSION["user_type"]。

您有 2 种可以编辑订单的帐户类型。管理员(admin)和子管理员(sadmin)。

“content_id”是根据页面类型显示的信息。

这个说法有什么问题?

是的。ob_start();并且session_start();正在运行

//Disallow all users from edit orders. Except admins and Sub admins.
if ($_SESSION["user_type"] !== "admin" || $_SESSION["user_type"] !== "sadmin" && $_GET["content_id"] == "edit_order"){
  header ("location:home.php");
}
4

6 回答 6

1

以下是一些基础知识:

true  || *anything* = true
false || false      = false
false && *anything* = false
true  && true       = true

既然我们已经确定了这一点,让我们来实现您想要的。

可以编辑您的页面的用户是管理员或子管理员。相反,无法编辑您的页面的用户既不是管理员也不是子管理员。

这给了我们:非管理员和非子管理员并且正在尝试访问编辑页面的用户,发送到主页。

if ($_SESSION["user_type"] !== "admin" && $_SESSION["user_type"] !== "sadmin" && $_GET["content_id"] == "edit_order")
{
   header ("location:home.php");
}

顺便说一句,您!==用于检查用户类型但==检查内容 ID 的任何原因?

于 2013-08-28T15:18:35.547 回答
0

AND优先于OR.

你说:

condition1 || condition2 && condition3

PHP 将其解释为:

condition1 || (condition2 && condition3)

相反,你想要:

(condition1 || condition2) && condition3

您需要OR自己在条件周围加上括号。

于 2013-08-28T15:13:38.817 回答
0

我认为应该是

//Disallow all users from edit orders. Except admins and Sub admins.
if ($_SESSION["user_type"] !== "admin" && ($_SESSION["user_type"] !== "sadmin" && $_GET["content_id"] == "edit_order")){
  header ("location:home.php");
}
于 2013-08-28T15:14:32.117 回答
0

我想这就是你要的

//Disallow all users from edit orders. Except admins and Sub admins.
if (($_SESSION["user_type"] !== "admin" || $_SESSION["user_type"] !== "sadmin") && $_GET["content_id"] == "edit_order"){
  header ("location:home.php");
}

注意组合条件周围的额外括号

$_SESSION["user_type"] !== "admin" || $_SESSION["user_type"] !== "sadmin" 

这告诉 PHP 它可以是 admin 或 sadmin 但它必须是 edit_order

也就是说,我认为存在逻辑错误,您实际上的意思是,如果它不是管理员或 sadmin,那么您想要重定向,因此它应该是 AND 而不是 OR

if ($_SESSION["user_type"] !== "admin" && $_SESSION["user_type"] !== "sadmin" && $_GET["content_id"] == "edit_order")
于 2013-08-28T15:10:53.963 回答
0
//Disallow all users from edit orders. Except admins and Sub admins.
    if (($_SESSION["user_type"] !== "admin" || $_SESSION["user_type"] !== "sadmin") &&  $_GET["content_id"] == "edit_order"){
        header ("location:home.php");
}

http://www.php.net/manual/en/language.operators.precedence.php

注意:我认为您的条件不匹配,因为您的 user_type 始终与 admin 或 sadmin 不同(即使您是 admin 或 sadmin)

你只需要“&&”

//Disallow all users from edit orders. Except admins and Sub admins.
    if ($_SESSION["user_type"] !== "admin" && $_SESSION["user_type"] !== "sadmin" &&  $_GET["content_id"] == "edit_order"){
    header ("location:home.php");
}
于 2013-08-28T15:12:48.013 回答
-1

PHP 只会从左到右读取语句,分配truefalse在内部进行。

您需要做的是在括号中包含一些条件,以便将它们评估为一个。在你的情况下:

if (
    $_SESSION['user_type'] !== 'admin' ||
    ($_SESSION['user_type'] !== 'sadmin' && $_GET['content_id'] == 'edit_order')
) {
    header('Location: home.php');
}
于 2013-08-28T15:12:33.370 回答