2014-12-06 85 views
1

我读过很多关于这方面的其他话题,但仍然无法弄清楚我的问题。它正在工作,然后我的电脑崩溃了,现在看来它不再记忆会话变量了。所以这是我的代码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; 
    } 
?> 

登录页作品(是不言而喻的,如果统计内的“创建会话”字符串将被打印出来。),但只要我去主页它会抛出这个错误:注意:未定义索引:记录在第2行(我正在检查会话变量是否设置)。 我试着注释掉所有会话变量,除了“记录”,但仍然无法解决。

感谢

编辑: 对不起,约我只是犯了一个错误写在这里括号(我改变了字符串我有数字1,我​​忘了删除括号)。还是行不通。

我尝试这样做,仍然引发错误(其实后“没有登录”回声不会打印出任何东西)2

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

编辑: 我home.php删除了所有的代码并提出它是这样的:

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

它仍然会告诉我, '记录' 索引是未定义

+0

在你的第二个代码中,您有一个')'在if语句(在结束了)(此外,我会用||) – Rizier123 2014-12-06 14:00:00

+0

我的错误写在这里。这不是 – 2014-12-06 14:20:03

+0

所以这意味着你的会话索引不会被设置!所以你的第一个代码框中的if语句不会被输入! (我认为你没有你的用户名hased!所以不要使用'password_verify'作为用户名) – Rizier123 2014-12-06 14:24:24

回答

0

我想,你的意思是,如果 (isset($ _ SESSION [ '记录']! )|| $ _SESSION ['logged']!= 1)) (首先检查会话变量是否存在,下一个检查值)

+0

你的代码中仍然有语法错误! – Rizier123 2014-12-06 14:04:20

+0

删除最后“)” – nerox8664 2014-12-06 14:06:01

+0

我在这里写的错误。这并不是说 – 2014-12-06 14:20:19

0

当使用isset时,我通常会以相反的方式进行操作,以更好地阅读我的逻辑未来:

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

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

然后我用了整个事情有!使声明仅在用户未登录时才起作用:

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

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

以上所有的,如果你真的想要走这条路,但说实话这是更好地使用你的情况为空:

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

这将检查如果thingy被设置,然后如果它不计算bool false - 你的case 1不是空的,0或者是'',所以它会像魅力一样工作。

+0

谢谢,我尝试了检查与isset,它告诉我,这不设置(然后输入若) – 2014-12-06 14:27:34

+0

我没有说,只是检查与isset,但空。 php的empty()方法在内部实现了对isset的检查。 – 2014-12-06 15:36:41

+0

ops ..sorry ..现在我尝试了空,它评估为真(然后它是空的) – 2014-12-06 15:40:10

0

,因为如果不存在不能从1是不同的,你必须使用或(||)

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

尝试但仍然thorws错误 – 2014-12-06 14:21:02

0

试试这个它会帮助你:

  1. 移除额外)
  2. 使用||不是&&

使用适当的条件

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