簡體   English   中英

PHP-即使在session_start之后也無法添加會話變量

[英]PHP - Can't add session variable even after session_start

關於不添加會話變量的大多數答案已經在用戶發現會話沒有開始的情況下結束。

我遇到一個問題,即使在session_start之后也無法添加會話變量。

相關代碼:

login.php

<?php 
    require("../common.php"); 
    if(!empty($_SESSION['user'])) { 
        echo "true";
        header("Location: dashboard.php"); 
        die("Redirecting to dashboard.php"); 
    } 
    $submitted_username = ''; 
    if(!empty($_POST)) { 
        $info = " SELECT id, username, password, salt, email, access FROM users WHERE username = :username "; 
        $params = array( ':username' => $_POST['username'] ); 
        try { 
            $stmt = $db->prepare($info); 
            $result = $stmt->execute($params); 
        } catch(PDOException $ex)  { 
            die("Failed to run query"); 
        } 
        $login_ok = false; 
        $row = $stmt->fetch(); 
        if($row) { 
            $check_password = hash('sha256', $_POST['password'] . $row['salt']); 
            for($round = 0; $round < 65536; $round++)  { 
                $check_password = hash('sha256', $check_password . $row['salt']); 
            }  
            if($check_password === $row['password']) { 
                $login_ok = true; 
            } 
        } 
        if($login_ok) { 
            unset($row['salt']); 
            unset($row['password']); 
            $_SESSION['user'] = $row;
            $_SESSION['access'] = "1";
            header("Location: dashboard.php"); 
            session_write_close();
            die("Redirecting to: dashboard.php"); 
        }  else { 
echo "<div id=\"loginfail\" class=\"gradwin\">\n";
echo "  <p class=\"dark1\">LOGIN FAILURE</p>\n";
echo "</div>\n";
            $submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8'); 
        } 
    } 
?> 
<div id="loginbox" class="gradwin">
    <p class="darktitle">HITS Login</p> 
    <form action="index.php" method="post" name="formLogin"> 
    <!-- fake fields for Chrome autofill... -->
    <input style="display:none" type="text" name="fakeusername"/>
    <input style="display:none" type="password" name="fakepassword"/>
        <p class="dark1">Username:</p>
        <input type="text" name="username" autocomplete="off"><br>
        <p class="dark1">Password:</p> 
        <input type="password" name="password" autocomplete="off"><br><br>
        <input type="submit" value="Login" name="loginForm"><br><br>
    </form> 
    <a class="dark" href="register.php">Register</a>
</div>

common.php

<?php 

    $username = "MYNAME"; 
    $password = "MYPASS"; 
    $host = "localhost"; 
    $dbname = "MYDB"; 
    $conn = new mysqli($host, $username, $password, $dbname);
    $options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'); 

    try { 
        $db = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $username, $password, $options); 
    } catch(PDOException $ex) { 
        die("Failed to connect to the database: " . $ex->getMessage()); 
    } 
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
    header('Content-Type: text/html; charset=utf-8'); 
    session_start(); 

我被重定向到dashboard.php頁面,所以我知道有一個會話開始了。 session_start位於common.php文件中。 我放了...

echo '<pre>';
var_dump($_SESSION);
echo '</pre>';

...在dashboard.php文件中。 我可以看到所有相關的用戶數據,但看不到訪問數據。 我的數組如下所示:

array(1) {
  ["user"]=>
  array(3) {
    ["id"]=>
    string(2) "11"
    ["username"]=>
    string(2) "ba"
    ["email"]=>
    string(9) "ba@ba.com"
  }
}

您在調用session_start()之前發出的標頭。 session_start()必須在發送任何標頭之前進行:

header('Content-Type: text/html; charset=utf-8'); 
session_start(); 

應該

session_start(); 
header('Content-Type: text/html; charset=utf-8');

或者,更好的是,將其移至文件頂部。

嘗試在重定向/位置標頭之前添加session_write_close()。 我注意到在某些情況下重定向可能導致會話無法正確寫入。

IIRC,對die()exit()調用將停止存儲會話數據。 其他關閉函數和析構函數將被觸發,但session_write_close()不會觸發

您將需要在die() session_write_close()之前運行session_write_close()或重寫該部分以不使用die()

這里有更多信息。 https://bugs.php.net/bug.php?id=49462&edit=1

您的代碼在這里:

if(!empty($_SESSION['user'])) {
    $_SESSION['access'] = "1";
    header("Location: dashboard.php"); 
    die("Redirecting to dashboard.php"); 
} 

我認為錯誤在於if語句,該語句在大括號內運行代碼。 您已經啟動了僅在會話變量'user'不為空時運行的代碼,這很好。 但是,您從未為其設置變量,因此代碼從不設置會話變量'access'來存儲輸入1,因此該數組將轉儲空的會話變量。

嘗試這個 :

<?php 
require("../common.php"); 


    if(empty($_SESSION['user'])) {
        $_SESSION['access'] = "1";
        header("Location: dashboard.php"); 
        die("Redirecting to dashboard.php"); 
    } 

愚蠢的錯誤!

我在服務器上有兩個版本的login.php文件。 其中一個名為inc_login.php,我正在對其進行修改。 index.php正在查看另一個。 我弄清楚了,一切運轉良好。

任何其他有無法解決的問題的人,請注意:您可能正在做像我這樣愚蠢的事情。

暫無
暫無

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

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