我正在尝试在Codeigniter中使用原生的$ _SESSION数组,因为我无法使用$ _COOKIES数组, 所以我做了自己的课,但似乎Codeigniter继续保存cokkies数据导致如果我禁用浏览器cookie我无法检索$ _SESSION数据:O !!不可思议....我不明白为什么? codeigniter是停止还是删除所有设置的$ _SESSION数据?
有人还在使用$ _SESSION数组,中止默认的$ _COOKIE数组选项吗?我的意思是,我希望会话数据不是cookie数据,但似乎是不可能的:哦!!! ?? !!
我已将CI原始Session.php库重命名为Cookie.php,并且我将两个个人类重命名为应用程序/库,并将其默认加载到autoloader.php
session_start();
class Session {
function set_data($key,$data)
{
if(!$key)
{ echo 'first param passed is null in session set_data';}
if(!$data)
{ echo 'second param passed is null in session set_data';}
if(isset($key) && isset($data))
{
if(isset($_SESSION[$key]))
{
unset($_SESSION[$key]);
}
return $_SESSION[$key] = $data;
}
function keep_data($key)
{
if(!$key)
{ echo 'first param passed is null in session keep_data';}
if(isset($_SESSION[$key]))
{
return htmlentities($_SESSION[$key]);
}
}
class Settings {
function setsitelanguage()
{
$CI =& get_instance();
if($CI->session->keep_data('lang'))
{
$CI->config->config['language'] = $CI->session->keep_data('lang');
}
else
{
$CI->config->config['language'] = "en";
}
}
比我有2个控制器
class Home extends Controller {
function Home()
{
parent::Controller();
$this->settings->setsitelanguage();
}
function index()
{
$this->load->view('home/home_view');
}
function session()
{
echo $this->session->keep_data('lang');
}
}
class Auth extends Controller {
function usersetlang()
{
$lang = $this->uri->segment(3);
return $this->session->set_data('lang',$lang);
}
}
如http://mysite/index.php/home/session
所示,我可以通过auth.php检索与session.php一起存储的语言网站
唯一的问题是使用全局$_SESSION[]
是不够的,因为如果我尝试检索数据,禁用我的浏览器cookie $_SESSION[]
数据不会出现!
答案 0 :(得分:6)
$ _ SESSION变量可能不在cookie本身,但PHP仍然需要能够跟踪用户的会话,以便$ _SESSION变量是持久的,并且它使用cookie进行跟踪。
如果关闭cookie,PHP会尝试来维持会话状态,方法是在URL中传递会话变量,但它不是很可靠。
底线 - 如果您想在网络环境中使用会话数据,则需要启用Cookie。遗憾。
你说你不能使用cookies,但你没有真正解释原因。这些天人们想要关闭cookie是相当不寻常的,因为它们几乎无处不在。
答案 1 :(得分:5)
如果我们$_SESSION
,我们可以使用session_start();
问题是,$_SESSION
不会在codeigniter上的页面上工作。
快速修复:
由于mvc中的页面是由控制器触发的,我们可以这样做
public function __construct(){
self::$instance =& $this;
foreach (is_loaded() as $var => $class) {
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core');
$this->load->initialize();
log_message('debug', "Controller Class Initialized");
session_start();
}
到CI_Controller
system/core/Controller.php
班级
有效!
答案 2 :(得分:3)
是的,你可以那样做
创建此表:
CREATE TABLE IF NOT EXISTS `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(16) DEFAULT '0' NOT NULL,
user_agent varchar(50) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id)
);
并在配置中更改此内容:
$config['sess_use_database'] = FALSE;
到
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';
应与您的表名匹配。
澄清 - 默认情况下,CI的会话系统使用cookie来存储数据。不知道为什么,它只是。您可以使用数据库表来更改此安全性等。
您访问的会话值完全相同,但不受Cookie最大文件大小或安全风险的限制。
您当然可以使用普通的$ _SESSIONS并创建自己的脚本 - 记住CI是一个框架,您不需要使用它。
答案 3 :(得分:2)
CodeIgniter什么时候“阻止”$ _SESSION?如果要使用会话,则必须启动它。要做到这一点,你需要在某处编写session_start()。为什么不在你的index.php?
CodeIgniter只是PHP,而不是一些邪恶的黑魔法师。
答案 4 :(得分:0)
有一个存储PHPSESSID浏览器端的cookie。
答案 5 :(得分:0)
如果您无法通过Cookie传播会话ID,则可以通过URL进行传播。