【问题标题】:Php session: undefined indexPHP会话:未定义的索引
【发布时间】:2014-12-06 13:57:17
【问题描述】:

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

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

<?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 行(我正在检查会话变量是否为 isset)。 我尝试注释掉除“logged”之外的所有会话变量,但仍然无法解决。

谢谢

编辑: 抱歉,关于括号,我在这里写错了(我用数字 1 更改了我的字符串,但我忘了删除括号)。还是不行。

我试过了,但仍然抛出错误(实际上,在“未记录”之后,回显不会打印任何内容)

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

编辑 2: 我把home.php里的所有代码都删了,改成这样:

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

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

【问题讨论】:

  • 在你的第二个代码框中你有一个) 在 if 语句中(最后)(我也会使用 ||)
  • 我在这里写错了。不是这样的
  • 这意味着您的会话索引未设置!所以你在第一个代码框中的 if 语句不会被输入! (我认为您没有使用您的用户名!所以不要使用password_verify 作为用户名)
  • 实际上是第一个 if 被输入,因为它打印出回显字符串..看起来它只是没有设置会话变量
  • 如果你在设置会话索引之前得到一个输出,但你无法访问它,那就太奇怪了!我几乎认为错误在代码的后面!也许您修改或取消设置此索引?!

标签: php session-variables


【解决方案1】:

我想,你的意思是 if(!isset($_SESSION['logged']) || $_SESSION['logged'] != 1)) (首先检查会话变量是否存在,然后检查值)

【讨论】:

  • 我在这里写错了。不是这样的
【解决方案2】:

在使用 isset 时,我通常会反其道而行之,以便将来更好地阅读我的逻辑:

让我们停下来,这意味着使用的人已经登录:

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

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

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

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

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

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

这将检查 thingy 是否已设置,然后检查它是否评估为 bool false - 你的情况 1 不是空的并且 0 或 '' 是,所以它会像一个魅力。

【讨论】:

  • 谢谢,我试着检查 isset,它告诉我它没有设置(然后输入 if)
  • 我不是说只检查isset,而是用空的。 php的empty()方法内部实现了对isset的检查。
  • ops..sorry..now 我尝试使用空,它的评估结果为真(然后它是空的)
  • 你设置过吗?你能在 password_verify 中调试一些东西吗?这样我们可以确保那里的代码被执行?
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    试试这个对你有帮助:

    1. 删除多余的)
    2. 使用|| 而不是&amp;&amp;

    使用适当的条件

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 2017-02-02
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2011-09-18
      相关资源
      最近更新 更多