【问题标题】:why $_POST is not changing Session?为什么 $_POST 不改变会话?
【发布时间】:2012-12-21 17:48:23
【问题描述】:

您好,我对我想要构建的脚本感到疯狂。

一切背后的逻辑:

我有一个使用会话的页面。现在,当用户第一次进入该站点时,它会查看是否有 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 调用会话时,它不会改变。即使重新加载 url,它也会被设置回默认值。

所以如果有人可以给我一个提示来解决我真的很感激。

【问题讨论】:

  • 疯狂的问题.. 你的页面顶部有session_start() 吗?
  • 在您的第二个代码块中,我认为您的意思是 !isset(),因为您正在检查是否设置会话。
  • 我想它就是这样。但目标是正确的。第一部分检查是否有会话,第二部分告诉如果没有怎么办。

标签: php html forms session


【解决方案1】:

尝试在重置之前先取消设置 $_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);
}

【讨论】:

  • 唯一添加的行是 unset($_SESSION['pref_lang']);因此,如果它抛出错误,可能是因为其余代码。它给你的错误是什么?
  • 抱歉,我添加了错误的括号。但是代码不起作用。
【解决方案2】:

把你手动设置语言的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

【讨论】:

    猜你喜欢
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 2016-05-27
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多