0

こんにちは、作成したいスクリプトに夢中です。

すべての背後にあるロジック:

セッションを使用するページがあります。これで、ユーザーが初めてサイトにアクセスしたときに、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 に依存する 2 つの異なるフッターがありますが、すべて同じ部分が含まれています。

<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 をリロードしても、デフォルトに戻されます。

ですから、それを解決するためのヒントを私に与えることができる人がいれば、私は本当に感謝しています.

4

2 に答える 2

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 と XSS

于 2012-12-21T18:20:28.973 に答える