使用issetphp函数来确定是否在超全局会话数组中设置了密钥


Using isset php function to determine is a key is set in the super global Session array

我有一个名为login.php的页面。login.php处理用户信息。如果在数据库中找到传递的用户信息,则启动新会话。然后将名称和密码添加到超级全局会话阵列中

if(correct_password($name, $password, $users, $users_size)) {
session_start();
$_SESSION["name"] = $name;
$_SESSION["password"] = $password;
header("Location: account.php");

验证后,用户被重定向到account.php。我想确保用户登录,即在他们可以访问account.php之前设置"名称"索引。为了做到这一点,我有以下代码

if(!isset($_SESSION["name"])) {
    header("Location: index.php");
    die;
}

假设此代码用于检查是否设置了"name"索引。如果没有设置,则意味着用户没有登录,因此应该返回到index.php。然而,即使用户登录,If似乎总是true。我甚至测试了

echo isset($_SESSION["name"]);
die;

简化事情。完成此操作后,屏幕上不会显示任何内容,这意味着isset评估为false。如果我尝试在account.php中打印全局会话数组,它会起作用。数据打印出来,显示名称字段填充了从login.php提交的数据。

我对isset有什么误解?或者我在别的地方搞砸了。

提前谢谢。

您还需要在检查该值的页面顶部设置session_start();,而不仅仅是设置该值的位置。

session_start();
if(!isset($_SESSION["name"])) {
    header("Location: index.php");
    die;
}

这也适用于您:

if( false == isset( $_SESSION ) && false == isset( $_SESSION['name'] )
    header("Location: index.php");
    die;
}

将用户名和密码存储在cookie和会话中不是一个好主意试试这个会帮你解决

if (isset($_SESSION['name']) && null != $_SESSION['name']){
    //name is exist don't forgot validate username against database
}

大家好,谢谢大家回答这个问题。你所有的答案都奏效了。我认为它们不起作用的原因是我忘记在用户登录后销毁会话。所以即使在注销后,名称索引仍然设置好。