php 会话丢失了在调用parent.location.reload()之后存储的变量

kgsdhlau  于 2022-10-30  发布在  PHP
关注(0)|答案(1)|浏览(154)
public function set_userdata($data, $value = NULL)
    {
        if (is_array($data))
        {
            foreach ($data as $key => &$value)
            {
                $_SESSION[$key] = $value;
            }

            return;
        }

        $_SESSION[$data] = $value;
    }

上面是代码生成会话,这里是存储的真实的变量的屏幕截图。

if(!$result->uid) {

            $this->member_model->scripts("잘못된 아이디 또는 비밀번호입니다");
        } else {
            $userdata['uid'] = $result->uid;
            $this->session->set_userdata($userdata);
            echo "<script>";
            echo "parent.location.reload();";
            echo "</script>";
            exit;

        }

但是,在通过parent.location.reload();,它转到构造函数,它丢失了会话变量..是这样吗??
这是从**parent.location.reload()**调用的代码的一部分

public function __construct() {

        parent::__construct();

        $this->load->library('session');
        $this->load->model('member_model');
        $this->load->model('setting_model');
        $this->load->helper('iny_common_helper');
        $this->load->helper('url');

        if($this->session->userdata('uid')) {
            $this->memberInfo = $this->member_model->get_member_infoByUid($this->session->userdata('uid'));
        }
        if($this->memberInfo->no) { 
            $this->member_model->memberInfo = $this->memberInfo;
        }

因此,在这里,它获得了不同的会话值,并丢失了一个变量,即“uid”。

由于它得到不同的会话值,我不能调用**$this-〉session-〉userdata('uid')**。请留下任何想法或评论!!提前感谢。
--编辑与新增

if (isset($_COOKIE[$this->_config['cookie_name']])
            && (
                ! is_string($_COOKIE[$this->_config['cookie_name']])
                OR ! preg_match('/^[0-9a-f]{40}$/', $_COOKIE[$this->_config['cookie_name']])
            )
        )
        {
            unset($_COOKIE[$this->_config['cookie_name']]);
        }

        session_start();

        // Is session ID auto-regeneration configured? (ignoring ajax requests)
        if ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) OR strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')
            && ($regenerate_time = config_item('sess_time_to_update')) > 0
        )
        {
            if ( ! isset($_SESSION['__ci_last_regenerate']))
            {
                $_SESSION['__ci_last_regenerate'] = time();
            }
            elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time))
            {
                $this->sess_regenerate((bool) config_item('sess_regenerate_destroy'));
            }
        }

以上是**$this-〉load-〉library('session')调用的session.php文件的一部分;**

j2qf4p5b

j2qf4p5b1#

我想你有点搞不清楚了。家长。位置。重新加载。()是一个javascript结构,它触发当前窗口的父页面的重载。在您的例子中,它将触发登录页面的重载,因为您不在一个内嵌在父页面中的iframe中,您在一个页面中,您没有家长。您需要将下面的代码替换为重定向到登录页面(或当前主页)的页面重定向

echo "<script>";
    echo "parent.location.reload();";
    echo "</script>";

您可以使用php或javascript。
php:

header('Location: https://example.com/');

浏览器:

echo "<script>";    
window.location.replace("https://example.com/");
echo "</script>";

我会用php:),在你的例子中,else分支会变成:

} else {
    $userdata['uid'] = $result->uid;
    $this->session->set_userdata($userdata);
    header('Location: https://example.com/');
    exit;
}

exitexample.com(或die())语句很重要,应该存在,header()函数也只有在第一次输出时才起作用(之前没有echo,print等),否则你需要使用javascript重定向。

相关问题