【问题标题】:Codeigniter Sessions not working after migration迁移后 Codeigniter 会话不起作用
【发布时间】:2018-04-03 05:05:01
【问题描述】:

我有一个使用 CodeIgniter 3.1.6 构建的应用程序。我正在生产服务器上的子域上进行测试。我将主域指向该文件夹,并将 config.php 中的 $base_url 更改为正确的 URL。 (config.php 中的$cookie_domain 从未设置过。)

但是,会话数据现在不起作用。我尝试了一些测试,可以在一个控制器中设置和读取会话数据。

$this->session->set_userdata('name', $name);
echo $this->session->userdata('name');

但是,这不适用于跨 URL。例如:

// controllers/Contact.php
$this->session->set_userdata('name', $name); 

// controllers/Welcome.php
echo $this->session->userdata('name');

关于为什么这可能不适用于其他域的任何想法?

【问题讨论】:

  • 您确定$name 变量不为空吗?当你var_dump($this->session->name) 时你会得到什么?
  • @Vickel。谢谢,在您的链接中,它表明 CodeIgniter 3.1.6 和 PHP 7.1 在使用会话数据时存在问题。没有意识到域正在运行 7.1。将其发布为答案,我会 +1
  • @user1949366 你的意思是 但是这在 URL 中不起作用

标签: php codeigniter session


【解决方案1】:

已经报告了几个 PHP 版本 7.1 和 CI 3.1.6 不支持不支持 $this->session->set_userdata('name', $name); 的问题

好吧,$this->session->set_userdata('name', $name); 可以工作,但是函数 userdata() 只接受一个参数并期望它是一个字符串

如果你查看会话库 (/system/libraries/Session/Session.php),你会发现近行

747:

/**
 * Userdata (fetch)
 *
 * Legacy CI_Session compatibility method
 *
 * @param   string  $key    Session data key
 * @return  mixed   Session data value or NULL if not found
 */
public function userdata($key = NULL)
{
    if (isset($key))
    {
        return isset($_SESSION[$key]) ? $_SESSION[$key] : NULL;
    }
    elseif (empty($_SESSION))
    {
        return array();
    }

    $userdata = array();
    $_exclude = array_merge(
        array('__ci_vars'),
        $this->get_flash_keys(),
        $this->get_temp_keys()
    );

    foreach (array_keys($_SESSION) as $key)
    {
        if ( ! in_array($key, $_exclude, TRUE))
        {
            $userdata[$key] = $_SESSION[$key];
        }
    }

    return $userdata;
}

但您也可以使用原生 $_SESSION 来获取像 $name=array('firstname'=>'mr smith') 这样的数组,如下所示:

设置:

$_SESSION['name']=$name; 

$this->session->set_userdata('name', $name);

得到:

echo $_SESSION['name']['firstname']; //etc..

【讨论】:

    【解决方案2】:

    打开: 系统/库/Session/Session.php

    session_start(); to // session_start();
    

    还有变化:

        ini_set('session.use_trans_sid', 0);
        ini_set('session.use_strict_mode', 1);
        ini_set('session.use_cookies', 1);
        ini_set('session.use_only_cookies', 1);
        ini_set('session.hash_function', 1);
        ini_set('session.hash_bits_per_character', 4);
    

      /* ini_set('session.use_trans_sid', 0);
        ini_set('session.use_strict_mode', 1);
        ini_set('session.use_cookies', 1);
        ini_set('session.use_only_cookies', 1);
        ini_set('session.hash_function', 1);
        ini_set('session.hash_bits_per_character', 4); */
    

    最后编辑打开/index.php 添加到顶部:

    session_start(); 
    

    已解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 2017-02-25
      • 2013-11-26
      • 1970-01-01
      • 2013-04-12
      • 2015-11-17
      相关资源
      最近更新 更多