2012-04-10 57 views
0

就我所知,基本上就是這樣。我可以包括或require_once有沒有腳本包含/ require_once,但如果這樣做,那麼PHP拋出我這個錯誤:PHP嘗試包含/需要包含/需要其他腳本的腳本時會引發致命錯誤

Warning: require_once(../constants/constants.php) [function.require-once]: failed to open stream: No such file or directory in C:\Home\Workspace\PHP\DD\src\log\test.php on line 7

Fatal error: require_once() [function.require]: Failed opening required '../constants/constants.php' (include_path='.;C:\Program Files\Xampp 1.7.7\php\PEAR') in C:\Home\Workspace\PHP\DD\src\log\test.php on line 7

的路徑是正確的。我擔心我可能搞砸了Apache Webserver的一些配置文件(我創建了一個.htaccess文件來使用mod_rewrite來創建一些更好的URL)。 .htaccess文件的內容就是這樣的:

Options +FollowSymLinks

RewriteEngine on

RewriteRule !.(gif|jpg|png|css)$ index.php

我的Apache文檔根目錄爲 「C:/家庭/工作區/ PHP」


UPDATE: 我發現,使用絕對路徑的作品,像這樣:

require_once $_SERVER['DOCUMENT_ROOT']."/DD/src/constants/constants.php";

我想我只是不使用相對路徑,然後。

+2

這與Apache無關。包含的嵌套include文件必須包含相對於自己的正確路徑。 '../ constants/constants.php'不在基於包含文件的正確位置。 – 2012-04-10 03:07:14

+0

@Michael你應該把這個作爲答案。 ;-)使用'dirname(__ FILE __)'來獲取當前的php文件的目錄,而不管當前的工作目錄如何,即使它們位於不同的目錄中,對於所有的php文件也是如此。 – Basti 2012-04-10 03:09:30

回答

3

原因是相對路徑來自具有第一個require/include的文件。舉例來說,如果我有一組文件看起來像這樣:

|--bar 
| |--foo 
| | |--foo.php 
| |--bar.php 
|--test.php 

如果test.php的已經

require("./bar/bar.php") 

和bar.php已經

require("./foo/foo.php") 

那麼這將失敗因爲相對URL必須與工作目錄(稱爲require/include的頂級文件)相關。如果我將bar.php更改爲require("./bar/foo/foo.php"),那麼程序將成功完成。如Basti所述,確保這種情況不會發生的最好方法是不使用相對URL。通常建議使用各種功能,如dirname(__FILE__)來構建URL。

最後一件事情是,.htaccess文件中的重寫規則不會執行任何操作,它只能操作客戶端URL。我希望能夠消除任何混亂。

+0

我想我明白了。我認爲使用相對路徑是一種很好的做法,但似乎我錯了。我嘗試使用dirname(__ FILE__),但它不起作用。儘管如此,$ _SERVER ['DOCUMENT_ROOT']似乎也可以做到。 感謝您的幫助! :) – drakenation 2012-04-10 03:40:45

+0

'dirname(__ FILE __)'。注意兩個'_'。有關更多信息,請參見[關於魔術常量的PHP手冊](http://php.net/manual/en/language.constants.predefined.php)。 – Basti 2012-04-10 04:01:14

+0

從5.3開始,php有'__DIR__',這相當於'dirname(__ FILE __)'。 – Maerlyn 2012-04-10 04:17:05