考慮這個項目結構:
/path/to/projectroot/index.php
header.php
include/inc.php
如果有index.php的
include('include/inc.php');
和inc.php有
include('header.php');
你會得到這個錯誤,因爲在inc.php行要尋找
/path/to/projectroot/include/header.php (doesn't exist)
不
/path/to/projectroot/header.php (does exist)
有幾個方面的人解決這個問題。
1:絕對路徑
第一,也是最簡單的方法是使用絕對路徑。
如果有index.php的
include('include/inc.php');
和inc.php有
include('/path/to/projectroot/header.php');
這會工作。
2:定義
#1類似的絕對路徑,如果有index.php的
define('PROJECT_ROOT', '/path/to/projectroot/');
include(PROJECT_ROOT.'include/inc.php');
和inc.php有
include(PROJECT_ROOT.'header.php');
這會工作。
更新:正如pichan在評論中指出,你可以使用"magic" constants這裏的index.php中的一個,那麼:
指數。PHP
define('PROJECT_ROOT', __DIR__.'/');
include(PROJECT_ROOT.'include/inc.php');
和inc.php
include(PROJECT_ROOT.'header.php');
注意我們添加了尾部斜槓__DIR__
在這裏,因爲:
此目錄名稱沒有結尾的斜線,除非它是根目錄。
3:包括隱藏的錯誤
如果inc.php有
@include('header.php'); # Try this directory
@include('../header.php'); # Try parent directory
這會工作[1]。
4:除非另有規定
如果有index.php的
$rel_prefix_to_root = '../';
include('include/inc.php');
和inc.php有
if(!isset($rel_path_to_root)){ $rel_path_to_root = ''; }
include($rel_path_to_root . 'header.php');
這樣的工作假設當前目錄。
我對這些方法
1和2採取基本上是相同的,但2是有點更容易,更常見的大項目,因爲它可以讓你做一個常量定義和使用它的位點寬。它還允許您在多個服務器上部署項目(放置在多個路徑中),只需要在項目範圍內更改一行,而不是每個文件中的一行選項1.
3很糟糕,請勿做到這一點。有時你會看到它,你甚至可能會在網上看到它的教程。不要這樣做。
4應該可以避免使用1或2.但是如果你有一些複雜的包含,這種方法可能是必需的。
一些注意事項:
[1]這是一個可怕的想法。它有效,但不要這樣做。
如果您不想使用絕對路徑,一種方法是在「外部」腳本中定義一個變量,然後將其用於包含的「內部腳本」中。例如:'include_prefix =;'在外部腳本中,'if(isset('include_prefix')){include($ include_prefix。「」); ''在bootstrap.php中。然而,如果安全性和可靠性受到嚴重關注,我認爲絕對路徑是最好的方法。 –
jedwards
2012-07-08 14:43:29
對不起,我應該澄清我相信我有的麻煩是,而不是簡單地能夠去包括(「thatfilebackinrootdirectory.php」);例如,它工作...它給我一個錯誤,說沒有這樣的文件或目錄,我假設,因爲我已經從根目錄上去了一個目錄,它現在不知道如何從它的位置引用到public_html php文件? – Kalcoder 2012-07-08 14:45:18
你對錯誤出現的原因是正確的。在那裏有很多解決方案 - 我會在一秒內回答更多細節。 – jedwards 2012-07-08 14:46:23