你好,我想通过我想要构建的脚本来疯狂。
一切背后的逻辑:
我有一个页面,我使用会话。现在,当用户第一次进入网站时,它会查看是否有http_accept_language
。在这种情况下,将创建会话并保存首选语言。如果浏览器中没有设置,则将手动完成,作为默认语言设置。之后,它将直接指向正确的路径。
所以我有这个部分:
if (!isset($_SESSION['pref_lang'])){
if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
$max = 0.0;
$languages = explode(",", (strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"])));
foreach($languages as $language){
$language = explode(';', $language);
$q = (isset($language[1])) ? ((float) $language[1]) : 1.0;
if ($q > $max){
$max = $q;
$pref_language = $language[0];
}
}
$pref_language = trim($pref_language);
}
elseif (!isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
$pref_language = "en";
}
$_SESSION['pref_lang'] = $pref_language;
$pref_language = $_SESSION['pref_lang'];
if ($basename === "index" ){
header ('Location: http://www.domain.com/'.$pref_language.'/'.$basename);
}
}
现在,如果会话已经存在,我想提供一个选项来更改每个站点上的语言设置。因此,我有两个不同的页脚,将包含在PHP中,并取决于$ pref_language但所有包含相同的部分:
<form action="'.$_SERVER['PHP_SELF'].'" method="post">
<input type="submit" id="de" name="de"/><div>german/div>
</form>
<form action="'.$_SERVER['PHP_SELF'].'" method="post">
<input type="submit" id="en" name="fr"/><div>french</div>
</form>and so on...
并在php解析器顶部:
if (isset($_SESSION['pref_lang'])){
if (isset($_POST["de"]) ){
$pref_language = "de";
$_SESSION['pref_lang'] = $pref_language;
var_dump($_POST);
}
elseif (isset($_POST["fr"]) ){
$pref_language = "fr";
$_SESSION['pref_lang'] = $pref_language;
var_dump($_POST);
}
}
echo "session exist:".$_SESSION['pref_lang']."<br/>";
$pref_language = $_SESSION['pref_lang'];
var_dump($_POST);
}
现在当调用页面并按下按钮更改语言时,它将回显var_dump:
array(1) { ["fr"]=> string(2) "fr" }
但是当在另一个空白页面上通过print_r调用会话时,它不会改变。即使重新加载网址,也会将其设置为默认值。
所以,如果有人可以给我一个提示来解决这个问题我真的会感到沮丧。
答案 0 :(得分:0)
在重置之前先尝试取消设置$ _SESSION ['pref_lang'],如下所示:
if (isset($_SESSION['pref_lang'])){
unset($_SESSION['pre_lang']);
if (isset($_POST["de"]) ){
$pref_language = "de";
$_SESSION['pref_lang'] = $pref_language;
var_dump($_POST);
}
elseif (isset($_POST["fr"]) ){
$pref_language = "fr";
$_SESSION['pref_lang'] = $pref_language;
var_dump($_POST);
}
}
echo "session exist:".$_SESSION['pref_lang']."<br/>";
$pref_language = $_SESSION['pref_lang'];
var_dump($_POST);
}
答案 1 :(得分:0)
从您手动设置语言的位置删除if (isset($_SESSION['pref_lang']))
,它在逻辑上无用。
if ( isset($_POST['de']) ){
$pref_language = "de";
$_SESSION['pref_lang'] = $pref_language;
} else if ( isset($_POST['fr']) ){
$pref_language = "fr";
$_SESSION['pref_lang'] = $pref_language;
}
echo "session exist:".$_SESSION['pref_lang']."<br/>";
$pref_language = $_SESSION['pref_lang'];
var_dump($_POST);
var_dump($_SESSION) //see what this contains as well
}
您还可以通过更改表单来简化整个过程:
<form action="'.$_SERVER['PHP_SELF'].'" method="post">
<input type="submit" id="de" name="setlang" value="de"/><div>german/div>
</form>
<form action="'.$_SERVER['PHP_SELF'].'" method="post">
<input type="submit" id="fr" name="setlang" value="fr" /><div>french</div>
</form>
然后PHP可以变成:
if( isset($_POST['setlang']) ) {
switch($_POST['setlang']) {
case 'fr':
$_SESSION['pref_lang'] = 'fr';
break;
case 'de':
$_SESSION['pref_lang'] = 'de';
break;
case 'en':
default:
$_SESSION['pref_lang'] = 'en';
break;
}
}
同样,在输出中使用$_SERVER['PHP_SELF']
并不是一个好习惯,因为人们可以将代码注入您的页面,即:
http://yoursite.com.com/form.php/%22%3E%3Cscript%3Ealert(‘xss attack’)%3C/script%3E%3Cbr%20class=%22irrelevant
请参阅:PHP_SELF and XSS