PHP 会话:未定义的索引


Php session: undefined index

我阅读了许多其他有关此的主题,但仍然无法弄清楚我的问题是什么。它正在工作,然后我的电脑崩溃了,现在它似乎不再记住会话变量了。所以这是我的代码

登录页面,我在其中创建会话(如果用户已通过身份验证(

<?php session_start(); 
if(!empty($_POST['subject'])) //SPAM
    exit;
include "functions.php";
$con=Connection();
$usr = mysqli_fetch_array(mysqli_query($con, "SELECT usrname, usrpw FROM users"));
if(password_verify($_POST['usrname'], $usr[0]) && password_verify($_POST['usrpw'], $usr[1])){
    session_regenerate_id(true);
    echo "crea session";
    $_SESSION['logged'] = hash('sha256', 'L9oT8s5iF3yX1uW');
    $_SESSION['remote_ip'] = $_SERVER['REMOTE_ADDR'];
    $_SESSION['year'] = date('Y');
    echo "<h12>welcome!<br/><br/>";
    echo"<a href='home.php'>Home</a></h12>";
}else{
    session_destroy();
    echo "<h12wrong data.<br/></br>";
    echo"<a href='login1.php'>try again</a></h12>";
}
mysqli_close($con); ?>
<html>
<head>
<title> Login </title>
<link type="text/css" rel="stylesheet" href="css/styles.css" title="Style" media="all" />
</head>
</html>

这些是登录(并创建会话变量(后我的"主页"页面中的第一行代码。其他行是html,所以我省略了它。

<?php session_start();
    if(!isset($_SESSION['logged']) && $_SESSION['logged'] != 1)){
        echo "not logged ".$_SESSION['logged'];
        exit; 
    }
?>

登录页面有效(它进入 if stat. 作为"创建会话"字符串将被打印(,但一旦我进入主页它会抛出此错误: 注意:未定义的索引:记录在第 2 行(我正在检查会话变量是否设置(。我尝试注释掉除"已记录"以外的所有会话变量,但仍然无法解决。

谢谢

编辑:抱歉,关于括号,我只是在这里写了一个错误(我用数字 1 更改了字符串,但我忘记删除括号(。仍然不工作。

我试过这个,但仍然抛出错误(实际上回声在"未记录"后不会打印任何内容(

if(!isset($_SESSION['logged'])){
        echo "not logged ".$_SESSION['logged'];
        exit; 
    }

编辑 2 :我删除了家里的所有代码.php并制作成这样:

<?php session_start();
    echo $_SESSION['logged'];
?>

它仍然会告诉我"记录"索引未定义

我想,你的意思是if(!isset($_SESSION['logged']( || $_SESSION['logged'] != 1(((第一次检查会话变量是否存在,下一次检查值(

使用 isset 时,我通常以相反的方式进行,以便将来更好地阅读我的逻辑:

让我们刹车一下,这意味着使用的已登录:

isset($_SESSION['logged']) && $_SESSION['logged'] == 1

然后我用 ! 使语句仅在用户未登录时才有效:

!(isset($_SESSION['logged']) && $_SESSION['logged'] == 1)

请记住,您必须添加括号,否则 ! 只会反转 isset,而不是整个内容。

如果您真的想走这条路,以上所有内容,但说实话,最好在您的情况下使用 empty:

if (empty($_SESSION['logged']))

这将检查是否设置了 thingy,然后如果它没有计算为 bool false - 在你的情况下,1 不为空,0 或 '' 为空,所以它会像一个魅力一样工作。

因为如果不存在,则不能与 1 不同,您必须使用 or (||(

<?php session_start();
if(!isset($_SESSION['logged']) || $_SESSION['logged'] != 1){
    echo "not logged ".$_SESSION['logged'];
    exit; 
}
?>

试试这个,它会帮助你:

  1. 删除额外的)
  2. 使用||而不是&&

使用适当的条件

if(!isset($_SESSION['logged']) || $_SESSION['logged'] != 1)