2010-12-27 5 views
2

ユーザーが自分のサイトに接続したときにユーザーの国と言語をCookieに保存します。しかし、クッキーが保存されると、ユーザーが正しい言語を取得できるようにページをリダイレクト/リフレッシュします。しかし、ユーザーがクッキーを無効にすると、無限ループが発生します。私はのinclude_onceをwrintingすることにより、この問題を解決するだろうと思ったが、サイトの更新以来、それはここ ユーザーがクッキーを受け入れないときにループが発生する

は私のコードです...すべての幾重にもinclude_one:

lang_set.php 

include("php functions\GeoIP\geoipcity.inc"); 
include("php functions\GeoIP\geoipregionvars.php"); 
include("php functions\ip.php"); 

if (!isset($_COOKIE['country'])) // om land ikke er registrert (første gang bruker requester siden) 
{ 
    $gi = geoip_open("php functions/GeoIP/GeoLiteCity.dat",GEOIP_STANDARD); 
    $country = geoip_country_code_by_addr($gi, ip()); 

    if ($country == "") { 
     setcookie("country", 'US'); 
     $country = "US"; 
     //reloader og setter språk en_US 
     header("Location: ".$_SERVER["REQUEST_URI"]." "); 
    } 
    else 
    { 
     //sett land basert på geoip og reload siden 
     setcookie("country", trim($country)); 
     header("Location: ".$_SERVER["REQUEST_URI"]." ");   
    } 

    $country_cookie = false; 

//land ikke satt  
} else { 
    //bruker har _COOKIE country 
    $country_cookie = true; 

    if ((!isset($_COOKIE['lang'])) or (!$country_cookie)){  

     //bruker har country cookie men ikke språk 
     //sett språk og reload 

     if($country_cookie){ 
      $country = $_COOKIE['country']; 
     } 

     if ($country == "NO"){    //Norge 
      setcookie("lang", "no_NO");         
     }     
        /* 
        elseif ($country == "SE" || $country == "FI"){  //Sverige 
         setcookie("lang", "se_SE");         
        }  

        elseif ($country == "DA"){   //Danmark 
         setcookie("lang", "dk_DK");         
        }      
        */ 
        elseif 
        (
        $country == "US"     //Alle engelsktalende land 
        || $country == "AG" || $country == "AI" || $country == "AS" || $country == "AU" || $country == "BE" 
        || $country == "CA" || $country == "FJ" || $country == "GB" || $country == "HK" || $country == "IE" 
        || $country == "JM" || $country == "NF" || $country == "NZ" || $country == "SG" || $country == "UM" 
        || $country == "RW" || $country == "SC"){  

        setcookie("lang", "en_US");      
        } 
        /* 
        elseif ($country == "FR"   //Alle fransktalende land 
        || $country == "AD" || $country == "BI" || $country == "BJ" || $country == "CD" || $country == "CF" 
        || $country == "CG" || $country == "GA" || $country == "GF" || $country == "GN" || $country == "GP" 
        || $country == "HT" || $country == "KM" || $country == "LB" || $country == "MC" || $country == "MG"   
        || $country == "NC" || $country == "NE" || $country == "PF" || $country == "PM" || $country == "RE" 
        || $country == "TD" || $country == "VA" || $country == "ML" || $country == "MQ"){    

        setcookie("lang", "fr_FR");  
        } 

        elseif ($country == "ES"   //Alle spanske land 
        || $country == "AR" || $country == "MX" || $country == "PA" || $country == "PE" || $country == "PR" 
        || $country == "PY" || $country == "CL" || $country == "CO" || $country == "CR" || $country == "CU" 
        || $country == "DO" || $country == "EC" || $country == "GQ" || $country == "GT" || $country == "HN"   
        || $country == "NI" || $country == "SV" || $country == "UY" || $country == "VE"){     

        setcookie("lang", "es_ES"); 
        } 

        elseif ($country == "DE"   //Alle tyske land 
        || $country == "AT" || $country == "BE" || $country == "CH" || $country == "HU" || $country == "IT" 
        || $country == "LI" || $country == "LU" || $country == "PL" ){     

        setcookie("lang", "de_DE"); 
        } 

        elseif ($country == "ZH"   //Alle kinesiske land 
        || $country == "CN" || $country == "HK" || $country == "MO" || $country == "SG" || $country == "TW"){     

        setcookie("lang", "zh_ZH"); 
        }   

        elseif ($country == "PT" || $country == "BR"){    
        setcookie("lang", "pt_PT"); 
        }      

        elseif ($country == "RU" || $country == "MO"){     
        setcookie("lang", "ru_RU"); 
        } 

        elseif ($country == "YI"){     
        setcookie("lang", "yi_YI"); 
        } 
        */ 

        //sett default språk engelsk om jeg ikke gjensjender landet 
        else { 

        setcookie("lang", "en_US"); 

        } 

      header("Location: ".$_SERVER["REQUEST_URI"]." "); 
    }// !isset språk 

} 

それはこれに簡単に修正する必要がありますしかし、私はこのコードを何度も変更しているので、私は私がshoudが尋ねると思った。

+0

セッションが開始される前にセッションが存在しないことを確認してから、停止してください。そうでない場合は、セッションを作成してCookieの作成を試みます。 – Robert

+0

代わりにin_array関数を使うべきです。 –

答えて

3

同じページにリダイレクトするのではなく、別のページにリダイレクトします(またはGETパラメータを持つ同じもの)。

<?php 
if (!isset($_COOKIE['lang'])) { 
    if (isset($_GET['redirected'])) { 
    $lang = getLang(); 
    } else { 
    $_COOKIE['lang'] = getLang(); 
    header("Location: ".$_SERVER['PHP_SELF']. '?redirected=1'); 
    exit(); 
    } 
} else { 
    $lang = $_COOKIE['lang']; 
} 
echo 'stuff in ' . $lang; 

はまた、あなたの国の検出コードを注意してください(ポーランドのユーザーは、おそらく、たとえば、ドイツ語の上に英語を好む)部分的に間違っています。

+0

それは完璧に働いた。そして、見栄えが良くなりました! – ganjan

0

クッキーが有効かどうかを伝える別のクッキーを持つことができます。そうでない場合は、リダイレクトしないでください。

チェックこのアウト: http://nik.chankov.net/2010/01/16/detecting-if-the-cookies-are-enabled-with-php/

+0

そのクッキーは保存されません。 – phihag

+1

そうですが、格納されていない場合はリダイレクトしないでください。ユーザーがサイトにまだアクセスしていないか、設定を行っていないため、他のものは保存されない可能性があります。クッキーが何であっても動作するかどうかは、この1つです。 – zsalzbank

0

クッキーを設定した後、ユーザーをリダイレクトするだけでなく、URLに「cookieset = true」をパラメータを追加。

はありません、あなたの検出コードにあなたが見ることができる場合:

  • ませCookieセット、および
  • URLパラメータ "cookieset =真"

が、あなたはクッキーが無効になっていることを知っています代わりにデフォルトの言語設定ページにリダイレクトする必要があります。

2

あなたはinclude_onceの機能を誤解していると思います。複数のページロードには適用されません.2回目にファイルをインクルードすると、そのファイルをインクルードすると無視されます。

ユーザーがCookieを無効にしている場合、Cookieのチェックは常にfalseを返します。あなたがするべきことは、リダイレクトする前にURLに "redirected = 1"という変数を追加することです。リダイレクトされた変数が設定されている場合は、それらを再度リダイレクトしないでください。代わりにエラーメッセージなどが表示されます。

たとえば、ページがhttp://example.com/foo.phpの場合は、http://example.com/foo.php?redirected=1に送信してください。

関連する問題