我有两个单独的if语句,第一个if语句不起作用,但第二个是。 第一个if语句适用于我的其他页面,我不确定如何正确编写代码,因为我是PHP的初学者。
<?php
session_start();
if($_SESSION['loggedin'] != 'true') {
header("location:login.php");
}
if ($_SESSION['admin']=='N') {
header("location:errorpage.php");
}
?>
答案 0 :(得分:1)
您的条件中 true 是什么?它可以是 bool 类型或字符串类型。
如果您这样设置:
$_SESSION['loggedin'] = TRUE;
$_SESSION['loggedin'] = 'true';
你有两个不同的变量集。
您可以使用==或===来比较它以包含变量类型。
例如:
$_SESSION['test_1'] = TRUE;
$_SESSION['test_2'] = 'true';
var_dump( $_SESSION );
array(2) { ["test_1"]=> bool(true) ["test_2"]=> string(4) "true" }
答案 1 :(得分:0)
$ _ SESSION [ '的loggedIn']?
为什么不在登出时清除每个SESSION var以及是否设置了SESSION变量=&gt;用户已登录。
并在header()之后使用; exit();
尝试var_dump($_SESSION['loggedin'])
并修改您的问题。
或许你的loggedin var不是一个字符串而是一个布尔值,所以你可以做if(!$_SESSION['loggedin'])
答案 2 :(得分:0)
尝试使用布尔值而不是字符串。我还会使用const作为admin变量。我会做以下事情;
$ _ SESSION [&#39; loggedin&#39;] = true / false;
$ _SESSION [&#39; admin&#39;] = true / false;
public class Priviledges
{
public CONST Admin = 0;
public CONST User = 1;
public CONST Contributor = 3;
//change this to however you want to do it :)
public static function isAdmin($val)
{
if ($val == Priviledges::Admin)
{
return true;
}
else
{
return false;
}
}
}
然后当你设置管理会话变量时,你可以去;
$_SESSION['admin'] = Priviledges::Admin;
if(!$_SESSION['loggedin'])
{
header("location:login.php");
exit()
}
else if (!Priviledges::isAdmin($_SESSION['admin']))
{
header("location:errorpage.php");
exit()
}
else
{ //do your stuff if none of these conditions are met.. }
答案 3 :(得分:0)
在发送&#34;位置&#34;后,始终添加exit()
或die()
HTTP标头:
<?php
session_start();
if($_SESSION['loggedin'] !== 'true') {
header("location:login.php");
exit();
}
if ($_SESSION['admin'] === 'N') {
header("location:errorpage.php");
exit();
}
检查:php - Should I call exit() after calling Location: header?。
来自aaronsaray博客:
请记住,仅仅因为浏览器足够智能而不能显示 内容,并不意味着这不危险。所以,它有点儿 如果此页面只显示用户搜索选项,则表示不太危险 或一些信息。如果这是一个页面,那就更危险了 执行一个动作。这是因为整个PHP页面都将执行 如果你没有发表die()声明。
在其他情况下,如果您希望仅在先前条件为假时评估条件,则可以使用&#34; else if&#34;。