session_regenerate_id()之后无法存储会话数据;

Yus*_*liq 7 php session

我有一个网页,我想在用户登录时重新生成会话ID.我遇到的问题是我运行session_regenerate_id();然后尝试附加$_SESSION['user'] = $row;$ row是一个数组.

我已经尝试了书中的所有内容,例如销毁会话然后重新开始.我一直在研究它至少2个小时,我没有解决方案.

我删除了很多不相关的php并留下了一些内容,所以你得到了我想要做的事情的要点,但这里是脚本

<?php
    session_start();
    if(!isset($_SESSION["CSRF"])){
        $_SESSION["CSRF"] = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
    }
    if(!empty($_POST)){
        if($_POST["action"]==="login"){
            //querying DB for $_POST values
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
            $login_ok = false;          
            $row = $stmt->fetch(); 
            if($row){ 
                $checked = //check password is okay
                if ($checked) {
                    $login_ok = true; 
                }
            }
            if($login_ok) { 
                session_regenerate_id();                
                unset($row['salt']); 
                unset($row['password']); 
                $_SESSION['user'] = $row;
            }
        }
    }       
Run Code Online (Sandbox Code Playgroud)

我也试过没有运气.

<?php
    session_start();
    if(!isset($_SESSION["CSRF"])){
        $_SESSION["CSRF"] = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
    }
    if(!empty($_POST)){
        if($_POST["action"]==="login"){

            //querying DB for $_POST values
            $stmt = $db->prepare($query); 
            $result = $stmt->execute($query_params); 
            $login_ok = false;          
            $row = $stmt->fetch(); 
            if($row){ 
                $checked = //check password is okay
                if ($checked) {
                    $login_ok = true; 
                }
            }
            if($login_ok) {                 
                unset($row['salt']); 
                unset($row['password']); 
                $_SESSION['user'] = $row;
                $arr = $_SESSION;               
                session_regenerate_id(true);
                $_SESSION = $arr;
            }
        }
    }   
Run Code Online (Sandbox Code Playgroud)

编辑

对不起,我没有澄清标题,但基本上我会尝试将当前会话存储在变量中,我将重新生成会话ID并添加尝试将存储的会话变量添加到新会话中,但会话ID不包含旧数据,我没有收到任何错误.

And*_*i B 0

您确定 $login_ok 设置为 true 吗?你可以在那里打印一些东西来确定。从我的测试(脚本的简化版本)来看,它似乎工作正常:

<?php
session_start();
$data = $_SESSION['data'];
$sid = session_id();
echo "Old data is $data<br>Sid is $sid<br>";
if($_GET["action"]==="login"){
    session_regenerate_id();                
    $_SESSION['data'] = $data + 1;
}
$data = $_SESSION['data'];
$sid = session_id();
echo "New data is $data\n<br>Sid is $sid\n<br>";  
Run Code Online (Sandbox Code Playgroud)