我有两个独立的if语句,第一个if语句不起作用,但第二个起作用。第一个if语句适用于我的其他页面,我不确定如何正确地编写它,因为我是PHP的初学者。
<?php
session_start();
if($_SESSION['loggedin'] != 'true') {
header("location:login.php");
}
if ($_SESSION['admin']=='N') {
header("location:errorpage.php");
}
?>
在您的条件下,true是什么?它可以是bool类型或string型。
如果你这样设置:
$_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" }
$_SESSION['loggdin']?
为什么不在注销时清除每个SESSION变量,如果SESSION var设置为=>则用户已登录。并在header()之后使用;exit();
尝试var_dump($_SESSION['loggedin'])
并编辑您的问题。
或者,您的loggedin var不是字符串,而是布尔值,因此您可以执行if(!$_SESSION['loggedin'])
请尝试使用布尔值而不是字符串。我也会为管理变量使用const。我会做以下事情;
$_SESSION['loggdin']=真/假
$_SESSION['admin']=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.. }
发送"Location"HTTP标头后始终添加exit()
或die()
:
<?php
session_start();
if($_SESSION['loggedin'] !== 'true') {
header("location:login.php");
exit();
}
if ($_SESSION['admin'] === 'N') {
header("location:errorpage.php");
exit();
}
Check:php-在调用Location:header之后,我应该调用exit()吗?。
来自aaronsaray博客:
记住,仅仅因为浏览器足够智能,不会显示内容,并不意味着这不危险。所以,这有点如果该页面只是显示用户搜索选项,则危险性较小或者一些信息。如果这是一个页面执行动作。这是因为整个PHP页面将执行如果你不放一个die()语句。
在其他情况下,如果您希望仅在前一个条件为false时评估条件,则可以使用"else-if"。