簡體   English   中英

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:我刪除了home.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是否已設置,然后它是否不能評估為布爾值false-如果您的情況是1不為空,而0或''是,那么它將像魅力一樣工作。

因為如果不存在,則不能等於1,因此必須使用或(||)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM