Php 会话不在本地主机中工作,但在live server中工作(Codeigniter)
我从昨天开始就面临这个问题,但我无法解决这个问题。问题是会话在本地环境中不工作,但是当为了测试目的,我将相同的文件放在一个实时服务器上时,它们都可以正常工作 如果我的config.php文件: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['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
限制。这是在rootindex.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 [