2014-06-14 56 views
0

我正在使用WAMP服務器上的localhost上的腳本。我想讓我的網站多語種,所以我定義的函數,你可以看到如下:在PHP中設置函數中的地址在PHP中

function p($name,$langIn = 'fa_IR') 
{ 
    switch ($langIn) { 
     case 'en_US': 
      require('/inc/languages/en_US/all_lang_en_US.php'); 
     break; 
     default: 
      require('/inc/languages/fa_IR/all_lang_fa_IR.php'); 
    } 

    if(isset($lang[$name])) 
     echo $lang[$name]; 
    else 
     echo '<span style="color: red;">Error!</span>'; 
} 

存儲在localhost/aroozi/inc/functions/global_func.php功能。所需的地址上正常工作localhost/aroozi但是當我張貼在報名表值localhost/aroozi/processors/register.php它不工作,因爲我在頁面的標題中使用localhost/aroozi/inc/header.php功能p()腳本將停止工作:

<!Doctype html> 
<head> 
. 
. 
. 
<title><?php p('title',$lang); ?></title> 
. 
. 
. 

我的基本問題是我如何設置一個地址,以便在腳本的所有目錄中都能正常工作?

+0

'函數P()'不應該被輸出的文本本身。相反,它應該返回它。 'function p(){... return $ lang [$ name]; ...}' 而在你的HTML文件中,你應該使用'<?= p('title',$ lang); ?>'代替。 –

+0

有什麼區別?它現在在根目錄下認真工作,它不需要'echo'命令。此外,我是測試你的解決方案,不幸的是它不工作。 – AmirHussein

+0

@MarioWerner我認爲這是分裂頭髮一點。該功能旨在雙向工作。 – JakeGould

回答

1

我的基本問題是如何設置一個地址,以便在腳本的所有目錄中都可以使用 ?

問題是你依賴於相對路徑,如require('/inc/languages/…),這不是很好的做法。你可以堅持努力平衡在哪裏設置/../甚至../../。避免它的最好方法是在主配置中設置一個基本路徑。

所以,你會設置這樣的一個配置文件:

$BASE_PATH = '/full/path/to/your/codebase/here/'; 

如果你不知道你的文件系統的基本路徑,只需將下面這行代碼在你的PHP代碼;像index.php

echo "Your path is: " . realpath(dirname(__FILE__)) . "<br />"; 

然後加載該頁面。附近的某處頂部將是這樣的文字:

你的路徑是:/全/路徑/到/你/用那一套代碼庫/位置/

然後你就可以改變你的代碼是什麼像這樣:

include_once 'config.php'; 

function p($name,$langIn = 'fa_IR') 
{ 
    global $BASE_PATH; 

    switch ($langIn) { 
     case 'en_US': 
      require_once($BASE_PATH . 'inc/languages/en_US/all_lang_en_US.php'); 
     break; 
     default: 
      require_once($BASE_PATH . 'inc/languages/fa_IR/all_lang_fa_IR.php'); 
    } 

    if(isset($lang[$name])) 
     echo $lang[$name]; 
    else 
     echo '<span style="color: red;">Error!</span>'; 
} 

注是我所做的更改如下:

  • 設置在這個例子中爲config.php。將它放在代碼中任何有意義的地方。
  • 設置global $BASE_PATH;內的功能,使$BASE_PATH可以很容易地加載在該功能。
  • 更改require調用require_once,因爲它只是更好的做法&幫助代碼避免多個require調用可能導致您的腳本被炸出的情況。
  • 設置$BASE_PATH . 'inc/languages/require_once調用實際使用$BASE_PATH概念。

是的,好像更多的工作來設置,其通過相對路徑加載config.php再下一行使用$BASE_PATH,但好處是,一旦這些config.php線設置,你不再需要擔心它。然後$BASE_PATH可以設置爲滿足您所在的任何設置的需求。

編輯:根據評論,原來的海報並不理解文件系統路徑&一個Web服務器URL之間的區別。爲了儘可能清楚,這是因爲在Windows中報告的原始的海報的文件系統路徑:

C:\wamp\www\aroozi 

這是訪問該網頁的網址是WAMP URL通過網絡瀏覽器:

http://localhost/aroozi 

當對http://localhost/aroozi的文件發出請求時,Web服務器將在文件系統中查找C:\wamp\www\aroozi。所以該路徑被認爲是文件系統上的基本路徑。

因此,使用我上面的例子,這將設置爲如下使用Apache PHP;將Windows路徑有他斜槓,因爲PHP &阿帕奇逆轉WAMP通過Unix/Linux操作系統路徑設置工作:

$BASE_PATH = '/wamp/www/aroozi'; 

還是使用原來的海報的配置設置在constants.php

定義( 'BASE_PATH','/ WAMP /網絡/ aroozi');

然後把剛纔在前面加上要麼$BASE_PATHBASE_PATHrequire/include SUFF這樣的:

require_once($BASE_PATH . 'inc/languages/en_US/all_lang_en_US.php'); 

或者這樣:

require_once(BASE_PATH . 'inc/languages/en_US/all_lang_en_US.php'); 
+0

但我以前做過。我在'localhost/aroozi/inc /常量中有一個配置文件。這個內容:'define('ROOT','/ aroozi');'。我測試了你的想法,但是我沒有看到任何正確的結果:'require(ROOT。/ inc/languages/fa_IR/all_lang_fa_IR.php');'。即使我把'require'改成'require_once'! (對不起,我發表評論) – AmirHussein

+0

'define('ROOT','/ aroozi');'是你的URL根目錄嗎?或者文件系統根?我相信這是100%不一樣的URL根路徑。 URL路徑位於Web瀏覽器中。文件系統路徑位於服務器文件系統上。您需要根據'echo「的輸出設置文件系統基本路徑。您的路徑是:」。 realpath(dirname(__ FILE__))。 「
」;' – JakeGould

+0

你說的函數返回'C:\ wamp \ www \ aroozi'。這不是一個網址。不是嗎? – AmirHussein