如何通过Ajax + PHP更改cookie?

时间:2014-01-20 16:01:38

标签: javascript php jquery ajax cookies

我正在尝试通过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功能不起作用。

1 个答案:

答案 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”函数而不传递值似乎没有多大意义。