2011-12-17 110 views
0

我正在構建PHP CMS,但遇到變量問題。我希望能夠在外部文件vars.php中包含所有變量,並且只需將該文件包含在需要變量的每個文件中。變量都與URL和文件夾路徑有關。全局變量遍歷PHP中的文件和文件夾

我正在運行的問題是,如果我將變量設置爲完整的URL(例如:$uploadDir = "http://www.example.com/uploads/";),腳本不會做他們應該做的。如果我使用絕對路徑(例如:$uploadDir = "/uploads/";$uploadDir = "/full/server/path/uploads/";),也是如此。

如果我使用完整的網址,它似乎至少嘗試工作,但沒有。如果我使用完整的服務器路徑或絕對路徑,那麼我得到一些關於該路徑的錯誤不被允許。這些文件都存儲在/edit//edit/(sub-folder-name)/,如果有幫助。

我會尋找一些代碼示例,我將使用它,並儘快更新這篇文章。

謝謝。

UPDATE:

一些從這個代碼片斷的變量不包括在內,只是沒想到我應該發表一個巨大的PHP腳本。

$pageDir例子:

// The below 2 lines are actually in vars.php, which is included in this file. 
$pageDir = "http://www.example.com/edit/pages/"; 
$url = "http://www.example.com/"; 

if ($_POST["page"] && $execute == TRUE) { 
    $live = $_GET["p"] . ".php"; 
    // The below line is how this used to be set up. 
    // $handle = fopen("pages/$page", "w"); 
    // The below line is how the new version should be set up. 
    $handle = fopen("$pageDir/$page", "w"); 
    fwrite($handle, $_POST["page"]); 
    fclose($handle); 
    // The below line is how this used to be set up. 
    // echo("<p>Page successfully saved. <a href=\"../$live\" target=\"_blank\">Click here to view this page.</a></p>\n");  
    // The below line is how the new version should be set up. 
    echo("<p>Page successfully saved. <a href=\"$url/$live\" target=\"_blank\">Click here to view this page.</a></p>\n");  
    $execute = FALSE; 
} 
+0

您使用URL而不是服務器路徑對打開和保存文件有點混淆。 (和[這可能會幫助](http://stackoverflow.com/questions/4369/how-to-include-php-files-that-require-an-absolute-path)。) – 2011-12-17 16:56:12

回答

4

不要使用文件系統功能的URL。這將使他們做一個HTTP請求,而不是從文件系統加載文件。

此外,如果您使用/absolute路徑,那麼將指向文件系統根目錄,而不是您的網絡服務器document root。 PHP文件系統函數不能在虛擬路徑名稱上運行,而是在真實的系統文件結構上運行。

但是,您可以使用:

$pageDir = "/edit/pages/"; 
readfile("$_SERVER[DOCUMENT_ROOT]/$pageDir/$page"); 

這可能是你想要的。

其他注意事項:儘管模因,全球變量沒有什麼問題。然而,你不應該將共享範圍擴大到數十個範圍。相反,請爲文件夾定義像$dir["page"]這樣的數組。或define()常數。

+1

「全球沒有錯變量*謹慎使用和適當考慮*時。「問題不在於全局變量本身,而在於編碼實踐(或缺乏)通常伴隨着較差實施。 – 2011-12-17 16:59:44

+0

我認爲這主要是所有代碼都在'全局'範圍內執行,並且不可避免的來自多個模板式php腳本的左側代碼,與過於通用的var名稱配對。在OP案件中可能不成問題,但有時候更少。 – mario 2011-12-17 17:02:54

+0

如果所有事情都被適當隔離,完全有可能在全球範圍內做所有事情。我知道我已經收到了一些代碼(越來越遙遠),我回過頭去查看,我仍然很驚訝它按預期工作,*不知何故*。有了像CMS這樣的東西,希望所有事情都可以按照部署的編程風格進行適當的規劃和隔離。一些實踐可能比其他實踐更少(顯着)容易出錯。 – 2011-12-17 17:12:43

1

你正在嘗試在這個片段做的是

因爲它是一個HTTP URL,你不能寫任何東西給它(您可以發送POST請求的一些方式,但我敢肯定,你不希望出現這種情況)

你必須使用對文件系統操作實際文件系統路徑(如存儲在文件中的東西;))

要做到這一點,你可能要使用$ _ SERVER [「DOCUMENT_ROOT」]變量,或者你可以做一招:

$my_dir = dirname(__FILE__);

變量$my_dir然後將包含目錄名當前腳本中。

此外,您可能需要使用一些數據庫如MySQL或MongoDB中(非常非常不同的東西)來存儲內容。如果你不」不知道這些,你應該讀一些例子,他們很棒。 ;)