class Index extends CI_Controller {
private $data = array();
private $content_data = array();
public function __construct() {
parent::__construct();
if (isset($_GET['m2w'])) {
$stw = switch_to_web();
}
if (isset($_GET['w2m'])) {
$stm = switch_to_mobile();
}
// load mobile or desktop view
}
// Called within an helper function
function switch_to_web() {
return set_cookie('load-web', 'true', '86500');
}
function switch_to_mobile() {
return delete_cookie('load-web');
}
function is_mobile() {
// return true;
$CI = & get_instance();
if ($CI->input->cookie('load-web'))
return false;
$CI->load->library('user_agent');
if ($CI->agent->is_mobile()) {
return true;
}else
return false;
}
我有上面的代码块来确定是否加载移动或Web视图。
预期执行顺序:
实际执行顺序:
我不对的是什么?
答案 0 :(得分:0)
CI的cookie使用PHP的本地setcookie()方法。 Cookie必须先在HTTP标头中发送,然后才能在本机$_COOKIE
变量中使用。
来自PHP文档:
设置好cookie后,可以使用$ _COOKIE或$ HTTP_COOKIE_VARS数组在下一页加载时访问它们。
以下是CI中的cookie()
方法:
function cookie($index = '', $xss_clean = FALSE)
{
// Simply fetch from the $_COOKIE array and do XSS_Clean if needed.
return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
}
简而言之,您正确设置了Cookie,但在您下次请求之前它将无法使用。这都是因为新值不在$_COOKIE
数组中。
你有多种方法可以解决这个问题。
set_cookie
方法,以便将新值添加到$_COOKIE
数组中。is_mobile
功能以检查$_GET['m2w']
值。 (不仅仅是cookie。)个性化,我认为第二种解决方案是最干净,最容易做到的,但我不知道你项目的全部范围。
希望这有帮助!