2013-05-26 50 views
1

我的網站結構是這樣的。包括文件上的文件包含在相對路徑的文件中:有時僅工作

htdocs文件夾:/WEB/mysite/htdocs/

ADMIN文件夾:/WEB/mysite/htdocs/admin/

編輯管理文件夾:/WEB/mysite/htdocs/admin/edit

的.htaccess保護文件夾:/WEB/mysite/htdocs/admin/flock/

TEST文件夾:/WEB/mysite/htdocs/test/

形勢1

以下script1.php被放置在管理文件夾:

<?php 
require_once 'flock/sql.php' or die("Error"); 
?> 

現在我包括scripttest.php script1.php放置在編輯admin文件夾:

<?php 
require_once '../script1.php' or die ("Error"); 
?> 

它工作沒有任何錯誤。

情況2

現在我已經script2.php放置在測試文件夾:

<?php 
require_once '../admin/flock/sql.php' or die("Error"); 
?> 

而且從scripttest.php在編輯admin文件夾總是放在調用它:

<?php 
require_once '../../test/script2.php'; 
?> 

它不會工作了。這些都是錯誤的:

Warning: require_once() [function.require-once]: 
Unable to access ../admin/flock/sql.php in /WEB/mysite/htdocs/test/script2.php 
on line 2 

Warning: require_once(../admin/flock/sql.php) [function.require-once]: 
failed to open stream: No such file or directory in /WEB/mysite/htdocs/test/script2.php 
on line 2 

Fatal error: require_once() [function.require]: Failed opening required 
'../admin/flock/sql.php' (include_path='/usr/local/lib/php/:/WEB/mysite/') in 
/WEB/mysite/htdocs/test/script2.php on line 2. 

兩種情況是一樣的。他們不是嗎? 爲什麼情況二不起作用?

回答

1

相對路徑是一樣相對的方向,如果我告訴採取了兩個步驟,一步到左邊,你是唯一如果你每次都在同一個地方開始,最終會在正確的地方結束。用php開始的地方是主腳本執行的地方。爲了讓生活更健康,你需要建立一些你可以包含的路點。

一些常見的有:

  1. $_SERVER["DOCUMENT_ROOT"] - 這是您的域名根目錄下(即涉及到要http://www.mysite.com/文件系統路徑)
  2. __DIR__ - 這就是當前文件的目錄中的常數。

通常創建一個常量來確定一個對您的項目有意義的位置是個好主意......例如。

// site_config.php -- located in a config directory next to your document root. 
define("COMMON_INCLUDES", $_SERVER["DOCUMENT_ROOT"]."/includes"); 

的site_config.php將被包括在所有的網頁:

include($_SERVER["DOCUMENT_ROOT"]."/../config/site_config.php"); 

,當你需要一個資產出了包括你然後說

include(COMMON_INCLUDES."/header.php"); 

希望這可以幫助。

+0

謝謝。但是,如果我明白了這一點: 'include(COMMON_INCLUDES。「/ header.php」);' 將與'include $ _SERVER ['DOCUMENT_ROOT']。'/ includes/header.php'相同。那麼,如果'header.php'在另一個目錄中,我將不得不再次使用相對路徑?!那麼不是簡單地總是使用'include $ _SERVER ['DOCUMENT_ROOT']。'/ pathtothefile/file.php''並停止使用相對路徑? – Perocat

+0

它會更安全。添加我概述的常量的抽象是一個很好的方法來使用說,如果你有一個由於某種原因或另一個原因不能在網站的根生活的網站的開發版本。那麼對於那個你可以改變常量到'define(「INCLUDE_PATH」,$ _SERVER [「DOCUMENT_ROOT」]。「/ mydevsite/includes」);'當在不同環境中登臺時提供更大的靈活性。 – Orangepill

+0

在一邊注意另一件事,這種方法(建立一個靜態點包括關閉)爲你做的是防止'chdir'命令。當你在其中一個包含它的其中一個出現時,它烘烤你在它之後定義的所有相對路徑。 – Orangepill

0

不,他們是不一樣的。這種情況下的相對路徑基於從包含鏈啓動的文件的位置。使用__DIR__不斷做出路徑是相對於該文件,其中均包括被稱爲:

<?php 
// will evaluate to /WEB/mysite/htdocs/admin/flock/sql.php always 
require_once __DIR__ . '/flock/sql.php' or die("Error"); 
?> 
+0

謝謝您的回覆。 如果相對路徑基於從include鏈開始的文件的位置,則該文件是'scripttest.php':如果'scripttest.php'在'/ admin/edit /'和'script1.php'上, '/ admin /',那麼當script1.php運行'require_once'flock/sql.php''時,如果你寫的相對路徑是基於'scripttest.php',它會調用''/ admin/edit/flock/sql.php'',但實際上它調用了正確的路徑''/ admin/flock/sql.php',其中'sql.php'是! – Perocat

+0

沒有'script1.php'在'/ admin /'上,這是所有事情都被啓動的地方。因此script1.php直接或間接包含的任何內容都將與該路徑相關。因此,當script1導入flock/sql.php時,如果script1.php包含scripttest.php,它將包含flock/sql.php,那麼它將是'/ admin/flock/sql.php',然後再次引用相同的位置。 – Orangepill

+0

但'scripttest.php'包含'script1.php'和'script2.php',所以路徑從'scripttest.php'開始?或者是從第一個腳本開始的所有路徑都包含什麼? – Perocat