当我尝试$_GET时,在URL中设置参数的链接没有按预期工作


Link that sets a parameter in the URL doesn't work as expected when I try $_GET

我有这个PHP代码设置cookie时,?setLang参数是在URL

if (isSet($_GET["setLang"])) {
    setcookie("lang",$_GET["setLang"]);
}
if (!isSet($_COOKIE["lang"])) {
    //negociate language and set locale
}else{
    //set locale to cookie
}
//translate with gettex

当我访问website.com/?setLand=en时,它完全按照预期工作。

问题是当我从website.com链接到这个表单中的URL:

<a href="?setLang=en">en</a>

当我点击它时,通过链接(而不是直接进入)gettext翻译不起作用,但除此之外,它按预期工作。

我的第一个想法是我必须强制某种刷新,所以我这样做了:

<a href="?setLang=en" onClick="window.location.reload( true );">en</a>

但是行不通。

我检查了代码,当你点击链接时,cookie实际上是设置的,所以它使我更加困惑。



完整的代码如下:

<?php
if (isSet($_GET["setLang"])) {
    setcookie("lang",$_GET["setLang"]);
}
if (!isSet($_COOKIE["lang"])) {
    $langs = array(
        'en-US',// default
        'fr',
        'fr-FR',
        'de',
        'de-DE',
        'de-AT',
        'de-CH',
    );
    $locale = substr(http_negotiate_language($langs), 0, 2);
}else{
    $locale = $_COOKIE["lang"];
}
//if (isSet($_GET["locale"])) $locale = $_GET["locale"];
if($locale == "en") 
    $locale = "en_US.utf8";
if($locale == "de") 
    $locale = "de_DE.utf8";
if($locale == "fr") 
    $locale = "fr_FR.utf8";
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
// Specify location of translation tables
bindtextdomain("translation", "locale");
// Choose domain
textdomain("translation");
// Translation is looking for in ./locale/de_DE/LC_MESSAGES/myPHPApp.mo now
// Print a test message
//echo _("title");
?>

和链接:

...
<a href="?setLang=en" onClick="window.location.reload( true );">en</a>
...

setcookie()在输出中增加了一个标题,并且不改变$_COOKIE的超全局。

if (isSet($_GET['setLang'])) {
    $locale = $_GET['setLang'];
    setcookie('lang', $locale);
} elseif (isSet($_COOKIE['lang'])) {
    $locale = $_COOKIE['lang'];
} else {
    $langs = array('en-US', 'fr', 'fr-FR', 'de', 'de-DE', 'de-AT', 'de-CH');
    $locale = substr(http_negotiate_language($langs), 0, 2);
}

当你有一个链接时,你不需要重新加载任何东西,因为链接将默认(如果你不说不要)引导到另一个页面。

你确定你指向正确的文件吗?尝试一些调试,比如在URL中发送您正在处理的确切文件,例如:

<a href="home.php?setLang=en">en</a>

对于调试建议,您可以使用PHP print_r,它将帮助您了解在$_GET中得到的内容。

只需在PHP代码的开头这样做:

<?php
print_r($_GET);
//the rest of your code
?>