Php会话:未定义的索引

时间:2014-12-06 13:57:18

标签: php session-variables

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

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

<?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>

这些是我&#34; home&#34;中的第一行代码。登录后的页面(并创建会话变量)。其他行是html所以我省略了它。

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

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

感谢

编辑: 对不起,关于括号我在这里写错了(我用数字1更改了字符串,我忘了删除括号)。仍然没有工作。

我尝试了这个并且仍然抛出了错误(实际上,回声赢得了#34之后的任何打印;没有记录&#34;)

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

编辑2: 我删除了home.php中的所有代码并将其设为:

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

它仍会告诉我&#39;已记录&#39; index未定义

4 个答案:

答案 0 :(得分:1)

我想,你的意思是 if(!isset($ _ SESSION [&#39;已记录&#39;])|| $ _SESSION [&#39;已记录&#39;]!= 1)) (首先检查会话变量存在,下一个检查值)

答案 1 :(得分:0)

使用isset时,我通常会反过来这样做,以便将来更好地阅读我的逻辑:     

让它踩下来,这意味着已登录使用:

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

然后我把整个事情包起来!使语句仅在用户未登录时才起作用:

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

记住你必须添加括号,否则!只会反转isset,而不是整个事物..

以上所有内容如果您真的想要这样做,但说实话,在您的情况下使用空白会更好:

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

这将检查是否设置了thingy,然后如果它没有评估bool false - 你的情况1不是空的0和&#39;&#39;是的,所以它会像魅力一样发挥作用。

答案 2 :(得分:0)

因为如果不存在,则必须使用或(||)

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

答案 3 :(得分:0)

试试这会对您有所帮助:

  1. 删除额外的)
  2. 使用||而非&&
  3. 使用适当的条件

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