Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在代码点火器中丢失会话数据_Php_Codeigniter_Session - Fatal编程技术网

Php 在代码点火器中丢失会话数据

Php 在代码点火器中丢失会话数据,php,codeigniter,session,Php,Codeigniter,Session,我面临会话数据方面的问题。登录网站后,我会丢失会话数据。我已经厌倦了在数据库中创建会话,也尝试了原生php会话类,但没有任何效果。我还从服务器上清除了tmp文件夹。 该网站使用CodeIgniter框架,托管在godaddy VPS上 请帮帮我。谢谢你 <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class CI_Session { var $session_id_ttl; /

我面临会话数据方面的问题。登录网站后,我会丢失会话数据。我已经厌倦了在数据库中创建会话,也尝试了原生php会话类,但没有任何效果。我还从服务器上清除了tmp文件夹。 该网站使用CodeIgniter框架,托管在godaddy VPS上 请帮帮我。谢谢你

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

class CI_Session {
    var $session_id_ttl; // session id time to live (TTL) in seconds
   var $flash_key = 'flash'; // prefix for "flash" variables (eg. flash:new:message)



function CI_Session()
{
    $this->object =& get_instance();
    log_message('debug', "Native_session Class Initialized");
    $this->_sess_run();
}

/**
* Regenerates session id
*/
function regenerate_id()
{
    // copy old session data, including its id
    $old_session_id = session_id();
    $old_session_data = $_SESSION;

    // regenerate session id and store it
    session_regenerate_id();
    $new_session_id = session_id();

    // switch to the old session and destroy its storage
    session_id($old_session_id);
    session_destroy();

    // switch back to the new session id and send the cookie
    session_id($new_session_id);
    session_start();

    // restore the old session data into the new session
    $_SESSION = $old_session_data;

    // update the session creation time
    $_SESSION['regenerated'] = time();

    // session_write_close() patch based on this thread
    // http://www.codeigniter.com/forums/viewthread/1624/
    // there is a question mark ?? as to side affects

    // end the current session and store session data.
    session_write_close();
}

/**
* Destroys the session and erases session storage
*/
function destroy()
{
    //unset($_SESSION);
    session_unset();
    if ( isset( $_COOKIE[session_name()] ) )
    {
          setcookie(session_name(), '', time()-42000, '/');
    }
    session_destroy();
}

/**
* Reads given session attribute value
*/    
function userdata($item)
{
    if($item == 'session_id'){ //added for backward-compatibility
        return session_id();
    }else{
        return ( ! isset($_SESSION[$item])) ? false : $_SESSION[$item];
    }
}

/**
* Sets session attributes to the given values
*/
function set_userdata($newdata = array(), $newval = '')
{
    if (is_string($newdata))
    {
        $newdata = array($newdata => $newval);
    }

    if (count($newdata) > 0)
    {
        foreach ($newdata as $key => $val)
        {
            $_SESSION[$key] = $val;
        }
    }
}

/**
* Erases given session attributes
*/
function unset_userdata($newdata = array())
{
    if (is_string($newdata))
    {
        $newdata = array($newdata => '');
    }

    if (count($newdata) > 0)
    {
        foreach ($newdata as $key => $val)
        {
            unset($_SESSION[$key]);
        }
    }        
}

/**
* Starts up the session system for current request
*/
function _sess_run()
{

    $session_id_ttl = $this->object->config->item('sess_expiration');

    if (is_numeric($session_id_ttl))
    {
        if ($session_id_ttl > 0)
        {
            $this->session_id_ttl = $this->object->config->item('sess_expiration');
        }
        else
        {
            $this->session_id_ttl = (60*60*24*365*2);
        }
    }

    session_start();

    // check if session id needs regeneration
    if ( $this->_session_id_expired() )
    {
        // regenerate session id (session data stays the
        // same, but old session storage is destroyed)
        $this->regenerate_id();
    }

    // delete old flashdata (from last request)
    //$this->_flashdata_sweep();

    // mark all new flashdata as old (data will be deleted before next request)
    //$this->_flashdata_mark();
}

/**
* Checks if session has expired
*/
function _session_id_expired()
{   
    if ( !isset( $_SESSION['regenerated'] ) )
    {
        $_SESSION['regenerated'] = time();
        return false;
    }

    $expiry_time = time() - $this->session_id_ttl;

    if ( $_SESSION['regenerated'] <=  $expiry_time )
    {
        return true;
    }

    return false;
}

/**
* Sets "flash" data which will be available only in next request (then it will
* be deleted from session). You can use it to implement "Save succeeded" messages
* after redirect.
*/
function set_flashdata($key, $value)
{
    $flash_key = $this->flash_key.':new:'.$key;
    $this->set_userdata($flash_key, $value);
}

/**
* Keeps existing "flash" data available to next request.
*/
function keep_flashdata($key)
{
    $old_flash_key = $this->flash_key.':old:'.$key;
    $value = $this->userdata($old_flash_key);

    $new_flash_key = $this->flash_key.':new:'.$key;
    $this->set_userdata($new_flash_key, $value);
}

/**
* Returns "flash" data for the given key.
*/
function flashdata($key)
{
    $flash_key = $this->flash_key.':old:'.$key;
    return $this->userdata($flash_key);
}

/**
* PRIVATE: Internal method - marks "flash" session attributes as 'old'
*/
function _flashdata_mark()
{
    foreach ($_SESSION as $name => $value)
    {
        $parts = explode(':new:', $name);
        if (is_array($parts) && count($parts) == 2)
        {
            $new_name = $this->flash_key.':old:'.$parts[1];
            $this->set_userdata($new_name, $value);
            $this->unset_userdata($name);
        }
    }
}

/**
* PRIVATE: Internal method - removes "flash" session marked as 'old'
*/
function _flashdata_sweep()
{
    foreach ($_SESSION as $name => $value)
    {
        $parts = explode(':old:', $name);
        if (is_array($parts) && count($parts) == 2 && $parts[0] == $this->flash_key)
        {
            $this->unset_userdata($name);
        }
    }
}
}

始终希望基于框架的格式创建会话。就连我也有同样的问题。当时我正在使用codeigniter 2.0版,所以我使用了框架会话定义。但据我所知,$\u SESSION全局变量在版本3

添加自定义会话数据

$this->session->userdata('item');
$this->session->set_userdata($array);
$this->session->userdata('item');
$this->session->unset_userdata('some_name');
检索会话数据

$this->session->userdata('item');
$this->session->set_userdata($array);
$this->session->userdata('item');
$this->session->unset_userdata('some_name');
检索所有会话数据

$this->session->all_userdata()
删除会话数据

$this->session->userdata('item');
$this->session->set_userdata($array);
$this->session->userdata('item');
$this->session->unset_userdata('some_name');
查看此文档,您可以获得清晰的视图

当有任何页面重定向时,请在重定向代码后保留“退出”。 这就是我解决问题的方法(页面重定向后丢失会话数据)。请参见下面的示例

header("Location: example.php");
exit;

$this->session->userdata的转储结果是什么?第一个转储包含插入的数据。但是页面重定向后的第二个转储只包含会话id,而不是前一个转储(会话id自动更改),您可以在此处发布生成会话代码。您是否使用$this->session->set_userdata()?在_session_id_expired函数中,if条件始终为true,这意味着$_session['Regenerated']中没有数据,为什么不使用codeigniter本身的会话库?数组([session_id]=>5788ffe0d0b78f2b7cd7c7c8b948cdca9f[ip_address]=>“我的ip_address”[user_agent]=>Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.36(KHTML,如Gecko)Chrome/49.0.2623.112 Safari/537.36[上次活动]=>1461318458[用户数据]=>[用户类型]=>“某些日期”[用户名]=>“某些数据”[utype]=>“某些数据”),现在我正在使用默认框架会话。检查页面重定向之前和页面重定向之后的两个结果。数组([会话id]=>22d66f3d73121c6aee2e856cf92a2f65[ip_地址]=>my_ip_地址][user_agent]=>Mozilla/5.0(Windows NT 6.1)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/49.0.2623.112 Safari/537.36[上次_活动]=>1461318503[user_数据]=>)告诉我每次重新加载页面时是否调用函数REGENATE_id()?否。如果($this->_session_id_expired())始终失败,因此从未调用函数REGENATE_id()