2014-06-23 30 views
-2

我最近開發了一個多語言網站。雖然我有一個小問題。每次點擊一個按鈕時,語言變量都需要改變。我用錨標籤(即<a href="?lang=En">English</a>)做了這個。URL中的未設置變量會給出錯誤

問題出現時,除了語言之外的其他變量被添加到URL。我希望重定向頁面而不必刪除其他變量,只需更改lang變量。所以如果url包含"var1=value&var2=value&lang=En",我想改變lang變量並保持原樣。 lang變量可以有3個值:En,Az,Ru

我試過到目前爲止的方法:

function URI_ADD_AZ(){ 
    $URI = $_SERVER['REQUEST_URI']; 

    if(isset($_GET['lang'])){ 
     $lang = $_GET['lang']; 
     unset($lang); 
    } 
    $new_URI = $URI . '?lang=Az'; 
    return $new_URI; 
} 

<a href="<?php URI_ADD_AZ?>">Azeri</a> 

問題:

每次點擊按鈕LANG變量剛剛被添加到URL不會改變:

/?lang=Az?lang=Az?lang=Az?lang=Az 

如何我可以確保它不會重複並避免重定向循環嗎?

+0

您沒有調用函數「URI_ADD_AZ();」而不是「URI_ADD_AZ」。打開'display_errors'並打開錯誤報告。 PHP應該抱怨一個未定義的常量。 '的error_reporting(E_ALL); ini_set('display_errors',1);' –

+0

這可能不是你問題的唯一來源,但首先要解決。 –

回答

1

URI_ADD_AZ功能張貼在問題不覆蓋或查詢字符串在URL中移除的lang=*預先存在的事件,因此「LANGS」的重複。此外,根據查詢字符串中鍵=值對的位置,不需要處理?&的需求。

這裏,爲了簡化工作並限制工作字符串以及引入錯誤的可能性,將取消$ _SERVER var QUERY_STRING,而不是整個REQUEST_URI,然後將PHP_SELF預置爲HREF值。

這裏的第一件事是取消lang=*,包括&取決於它的位置。僅當在字符串的開頭找到匹配項時,才使用條件引用來刪除尾部&

Next $ lang從$ _GET var中取回並驗證。如果有一個有效的$ lang,它會附加到查詢字符串,並考慮是否需要&

最後,如果不爲空,則生成的查詢字符串前綴爲?並返回。

function URI_ADD_AZ() { 
    $QS = preg_replace('/((^)|&)lang=[^&]*(?(2)&)?/', '', $_SERVER['QUERY_STRING']); 
    $lang = (isset($_GET['lang']) && in_array($_GET['lang'], array('En','Az','Ru')))? 'lang=' . $_GET['lang']: ''; 
    if ('' != $lang) { 
     if ('' == $QS) { $QS = $lang; } 
     else { $QS .= "&$lang"; } 
    } 
    if ('' != $QS) { 
     return '?' . $QS; 
    } 
} 
<a href="<?php echo $_SERVER['PHP_SELF'] . URI_ADD_AZ(); ?>">Azeri</a> 
+0

重做以修復過程中發現的小故障和其他缺陷。 – bloodyKnuckles

0

只需提供完整的URL: -

<a href="http://yourwebsite.com/<?php URI_ADD_AZ(); ?>">Azeri</a> 

,或者,如果你想這樣做沒有頁面重新加載,你將不得不使用「jquery.history.js」文件。 https://github.com/browserstate/history.js

History.pushState(null, 'title of my website', "?lang=<?php URI_ADD_AZ(); ?>); 

感謝