包含文件的文件包含在相对路径的文件中:有时只工作

时间:2013-05-26 03:21:55

标签: php path include require

我的网站结构是这样的。

HTDOCS文件夹:/WEB/mysite/htdocs/

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

EDIT ADMIN文件夹:/WEB/mysite/htdocs/admin/edit

HTACCESS保护文件夹:/WEB/mysite/htdocs/admin/flock/

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

情况1

以下script1.php放在Admin文件夹中:

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

现在我将script1.php包含在编辑管理文件夹中的scripttest.php中:

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

它没有任何错误。

情况2

现在我将script2.php放在Test文件夹中:

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

并从始终位于Edit admin文件夹中的scripttest.php调用它:

<?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.

这两种情况是一回事。不是吗? 为什么情况二不起作用?

2 个答案:

答案 0 :(得分:1)

相对路径就像是相对路线,如果我告诉我向前走两步,向左走一步,如果你每次都在同一个地方开始,那么你只会走到正确的位置。 php的起始位置是主脚本的执行开始的地方。为了让生活更加健康,您需要建立一些相对于您可以包含的航路点。

一些常见的是:

  1. $_SERVER["DOCUMENT_ROOT"] - 这是您的域根目录(与转到http://www.mysite.com/相关的文件系统路径)
  2. __DIR__ - 一个常量,是当前文件的目录。
  3. 通常最好创建一个常量来建立一个对你的项目有意义的位置......例如。

    // 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");
    

    希望这有帮助。

答案 1 :(得分:0)

不,他们不一样。在这种情况下的相对路径基于启动包含链的文件的位置。使用__DIR__常量使路径相对于调用每个包含的文件:

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