我正在尝试通过Ajax请求修改Cookie但它不起作用。它修改了Session而不是cookie。这是我的代码:
HTML:
<li class="en_GB" id="1" onclick="changeLanguage('en_GB;1')"><span></span>ENGLISH</li>
使用Javascript:
function changeLanguage(lang){
$.ajax({
url: 'lib/loadLanguageList.php',
data: {lan: lang},
type: 'POST',
success: function(data){
location.reload();
}
});
}
PHP(loadLanguageList.php)/动作:
if(isset($_POST['lan']) && preg_match("/([a-z]+_[A-Z]+;[0-9]+)/", $_POST['lan'])){
setUserLanguage($_POST['lan']);
}
PHP(loadLanguageList.php)/ function EDITED *: (根据@MikeBrant的建议,我编辑了这个功能)
function setUserLanguage($lan){
$locale['value'] = "";
$locale['id'] = "";
if(isset($lan)){
$lan = explode(";", $lan);
$locale['value'] = $lan[0];
$locale['id'] = $lan[1];
} else if (!isset($_COOKIE["locale"])){
$lan = $this->getUserLanguage();
$locale['value'] = $lan[0]['value'];
$locale['id'] = $lan[0]['id'];
}
setcookie("locale","",time()-2592000);
setcookie("locale_id","",time()-2592000);
setcookie("locale",$locale['value'],time()+60*60*24*30);
setcookie("locale_id",$locale['id'],time()+60*60*24*30);
print_r($locale);
$_SESSION['locale'] = $locale['value'];
$_SESSION['locale_id'] = $locale['id'];
require_once(ROOT."/lib/utils/localization.php");
}
但是Cookie没有被删除,print_r
打印$locale
变量应该是。我不明白为什么setcookie
功能不起作用。
答案 0 :(得分:0)
首先,让我们将函数重写为在代码路径流方面更好的逻辑意义(即我们简化了条件)。
function setUserLanguage($lan){
$locale['value'] = "";
$locale['id'] = "";
if(isset($lan)){
$lan = explode(";", $lan);
$locale['value'] = $lan[0];
$locale['id'] = $lan[1];
if(!isset($_COOKIE["locale"])){
setcookie("locale",$locale['value'],time()+60*60*24*30);
setcookie("locale_id",$locale['id'],time()+60*60*24*30);
} else {
$_COOKIE["locale"] = $locale['value'];
$_COOKIE["locale_id"] = $locale['id'];
}
} else if (!isset($_COOKIE["locale"])){
$lan = $this->getUserLanguage();
$locale['value'] = $lan[0]['value'];
$locale['id'] = $lan[0]['id'];
setcookie("locale",$locale['value'],time()+60*60*24*30);
setcookie("locale_id",$locale['id'],time()+60*60*24*30);
}
$_SESSION['locale'] = $locale['value'];
$_SESSION['locale_id'] = $locale['id'];
require_once(ROOT."/lib/utils/localization.php");
}
现在让我们来看看这里的用例。假设用户已经设置了locale
个Cookie,他们正在尝试更改它。
此用户将通过此条件:
if(isset($lan))
并且应该失败这个条件
if(!isset($_COOKIE["locale"]))
这意味着将执行此代码块:
$_COOKIE["locale"] = $locale['value'];
$_COOKIE["locale_id"] = $locale['id'];
这将仅在脚本执行期间更改cookie值,因为对浏览器的响应中没有任何内容会触发cookie值的更改。
我的猜测是你要总是打电话给setcookie()
。
另外我认为代码的整个(!isset($lan))
部分可以被删除而有利于抛出某种错误,因为拥有“set”函数而不传递值似乎没有多大意义。