Php 会话不在本地主机中工作,但在live server中工作(Codeigniter)

Php 会话不在本地主机中工作,但在live server中工作(Codeigniter),php,codeigniter,session,Php,Codeigniter,Session,我从昨天开始就面临这个问题,但我无法解决这个问题。问题是会话在本地环境中不工作,但是当为了测试目的,我将相同的文件放在一个实时服务器上时,它们都可以正常工作 如果我的config.php文件: $config['sess_driver'] = 'files'; $config['sess_cookie_name'] = 'ci_session'; $config['sess_expiration'] = 7200; $config['sess_save_path'] = 'ci_sessions

我从昨天开始就面临这个问题,但我无法解决这个问题。问题是会话在本地环境中不工作,但是当为了测试目的,我将相同的文件放在一个实时服务器上时,它们都可以正常工作

如果我的config.php文件:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;
下面是我如何将数据保存在一个模型文件中

$this->session->set_userdata('user',$result); //$result works fine, it produces
right result
在我看来,我试图通过以下方式访问此功能:

$this->session->userdata['user']['name']; //name here is an element in result array
我得到这个错误:

严重性:通知

消息:未定义索引:用户

文件名:home/home.php

行号:2

令我惊讶的是,同样的代码在服务器上运行时没有任何错误

同样,为了能够知道Codeigniter会话保存的数据,我尝试了数据库方法

我在config.php文件中将代码改为如下

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
它不是插入一行数据,而是插入四行数据。请参见以下数据库屏幕截图(最后四行)

有人能指出错误吗?任何帮助都将不胜感激。

如果您阅读了
setuserdata
预期第二个参数是一个值,那么如果第一个参数是一个键,则会出现错误

使用Codeigniter方式,您将无法在其使用时实现您想要的:

像这样:

$result=array('name'=>'johndoe')

$this->session->set\u userdata($result)
$this->session->set_userdata('name','john doe')

像这样:

echo$this->session->userdata(['name'])

另一方面,使用vanilla php
$\u SESSION
可以这样实现:

设置:
$\u会话['user']=$result

获取:
echo$\u会话['user']['name']

有关$\u会话,请参见

注意:

令我惊讶的是,同样的代码在服务器上运行时没有任何错误

这是由于您的
ENVIRONMENT
设置所致,因为您在生产(live)服务器上有
error\u reporting
限制。这是在root
index.php
中设置的

更改
define('ENVIRONMENT',isset($_SERVER['CI_ENV'])?$_SERVER['CI_ENV']:'development')到:
定义('ENVIRONMENT','production')并且您也不会在本地主机上看到错误

更新:

实际上
$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;
}

你的问题有几个部分,我将依次回答

关于从会话中检索值
userdata()
是一种方法。您访问它的方式将其视为一个数组:

$this->session->userdata['user']['name']; // Bad
,应将要检索的值的键作为参数传递给
userdata
方法:

$user = $this->session->userdata('user');
// Now you can echo $user['name'];
更简单的是使用更新的语法:

$user = $this->session->user;
// Now you can echo $user['name'];
关于数据库中的4个会话记录 检查
时间戳
字段。它们显示了3个不同的时间,这意味着网站上有3个独立的事件。第一条记录出现在
1501911275
,6秒后又有2条记录,139秒后是最后一条记录。这些代表了对站点的3个独立请求-可能您访问了不同的页面,或者测试和重新加载

至于为什么会有多条记录,那是因为会话ID会定期重新生成。具体发生频率取决于您的配置,请参见配置选项。销毁它们的频率也取决于您的配置(请参阅文档同一部分中的
sess\u regenerate\u destroy
)——但通常较旧的会话记录会保留一段时间,稍后会通过垃圾收集进行清理。因此,虽然您只有1条“当前”会话记录,但旧记录可以保留一段时间

关于您的
sess\u save\u路径
从您问题的措辞来看,我认为您希望使用
文件
会话驱动程序,并且只尝试了
数据库
驱动程序进行测试。如果这是正确的,那么您的文件会话配置中存在一个问题,您应该修复该问题

:

$config['sess\u save\u path']只支持绝对路径

中的评论还说:

警告:仅支持绝对路径

您的配置指定会话数据应保存在
ci_sessions
中,这不是绝对路径:

$config['sess_save_path'] = 'ci_sessions'; // Bad
我不确定将如何解释,但我猜测该目录将不存在,并且web服务器将没有创建它的权限。我无法想象为什么它能在你的实时服务器上工作

将路径更改为绝对路径,并确保web服务器可以对其进行写入

遵循这些

在config.php中

Set $config['sess_save_path'] = NULL;

正如您所说,
$this->session->set_userdata('user',$result)//$结果很好,它产生的
高于
$result
应该是这样的吗

$result = array(
    'user'  => 'Ab',
    .....
    'logged_in' => TRUE
);

如何访问会话密钥 或


问题似乎出在PHP版本7.1上,因为CI 3.1.6不支持该PHP版本


我不确定这是否是正确的解释,但当我切换回PHP 5.6版时,一切都开始正常工作。

我认为使用错误语法访问会话数据会有问题。您可以使用以下语法设置会话数据并获取会话数据

set会话数据示例

$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);
$this->session->userdata('user')['name'];
获取存储的会话数据的示例

$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);
$this->session->userdata('user')['name'];
$config['sess\u regenerate\u destroy']=FALSE; .htaccess

DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?/$1 [

五十、 QSA]

我正在做大量的研发工作,但问题没有解决,但我突然检查了我的MySQL版本,当我更改SQL版本时,它就会工作。如果您有任何类似的问题,您可以检查您的版本以便获得结果。

添加调试行
print\r($this->session)
$this->session->userdata('user')['name'];
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?/$1 [