如何在两个目录中包含文件?

时间:2008-10-02 15:08:56

标签: php include filesystems

如何包含一个超过2个目录的文件。我知道你可以使用../index.php来包含一个2个目录的文件,但你如何为3个目录做回来呢? 这有意义吗? 我试过了.../index.php,但它没有用。

我在/game/forum/files/index.php中有一个文件,它使用PHP include来包含一个文件。它位于/includes/boot.inc.php; /是根目录。

19 个答案:

答案 0 :(得分:137)

..从当前选择父目录。当然,这可以链接:

../../index.php

这将是两个目录。

答案 1 :(得分:49)

要将文件包含在一个目录中,请使用'../file'。 对于两个目录,请使用'../../file'。 等等。

虽然,实际上你不应该执行相对于当前目录的包含。如果您想移动该文件怎么办?所有的链接都会破裂。确保您仍然可以链接到其他文件,同时保留这些链接的方法是:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT是一个服务器变量,表示代码所在的基本目录。

答案 2 :(得分:26)

. = current directory
.. = parent directory

因此../会让你一个目录而不是两个

链接../根据需要多次上升2级或更多级别。

答案 3 :(得分:16)

include dirname(__FILE__).'/../../index.php';

是您最好的选择,它可以避免您在其他解决方案中遇到的大多数相对路径错误。

实际上,它会强制include总是相对于放置此代码的当前脚本的位置(由于您定义了应用程序的体系结构,因此哪个位置很可能是稳定的) 。这与仅执行include '../../index.php' which will include relatively to the executing (also named "calling") script and then relatively to the current working directory不同,后者将指向包含您的脚本的父脚本,而不是从您包含的脚本的路径中解析。

从PHP文档:

  

根据给定的文件路径包含文件,如果没有给出,则包含   指定的include_path。如果在。中找不到该文件   include_path,include将最终检入调用脚本自己的   目录和失败前的当前工作目录。

我发现的最古老的帖子引用了这个技巧dates back to 2003, by Tapken

您可以使用以下设置进行测试:

创建这样的布局:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

parent.php中,输入:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

sub/included.php中,输入:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

访问parent.php时的结果:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

正如我们所看到的,在第一种情况下,路径是从调用脚本parent.php解析的,而使用dirname(__FILE__).'/path'技巧,包含是从脚本included.php完成的。代码放在哪里。

请注意,以下内容并不等同于上述诀窍,与其他地方的内容相反:

include '/../../index.php';

事实上,预先/可以正常工作,但它会像调用脚本中的include ../../index.php一样解决(不同之处在于,include_path如果失败则不会被追查)。 From PHP doc

  

如果定义了路径 - 是否绝对(以驱动器号开头)   或者在Windows上,或/在Unix / Linux系统上)或相对于   当前目录(以。或..开头) - include_path将是   完全忽略了。

答案 4 :(得分:15)

../是一个目录,对两个目录../../重复,甚至三个:../../../,依此类推。

定义常量可能会减少混淆,因为您将向后钻取到后面的目录

您可以定义一些常量:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

当使用'BD'或我的'基目录'时,它看起来像这样:

file(BD.'location/of/file.php');

define(); reference

答案 5 :(得分:13)

../../index.php 

答案 6 :(得分:10)

../../../includes/boot.inc.php

../的每个实例都意味着上/后一个目录。

答案 7 :(得分:7)

以下是访问不同目录的方法: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower

答案 8 :(得分:6)

你可以做../../directory/file.txt - 这会回到两个目录。

../../../ - 这有三个。等

答案 9 :(得分:6)

../../../index.php

答案 10 :(得分:5)

../../../includes/boot.inc.php

答案 11 :(得分:5)

非常 小心让用户选择文件。你真的不想让他们获得一个名为的文件,例如

../../../../../../../../../../etc/passwd

或其他敏感系统文件。

(对不起,我已经有一段时间了,因为我是一个linux系统管理员,而我认为这是一个敏感的文件,从我记忆中来看)

答案 12 :(得分:4)

我建议使用__DIR__来指定current php file directory。检查here是否有原因。

__DIR__ . /../../index.php

答案 13 :(得分:3)

如果您使用的是php7,则可以使用级别参数为2的dirname函数,例如:

dirname("/usr/local/lib", 2);

第二个参数&#34; 2&#34;表示升级多少

dirname referance

答案 14 :(得分:2)

如果您在include的开头包含/,那么include将被视为来自站点根目录的路径。

如果您的网站为http://www.example.com/game/forum/files/index.php,则可以将包含添加到/includes/boot.inc.php,这将解析为http://www.example.com/includes/boot.inc.php

您必须小心..遍历,因为某些Web服务器已将其禁用;当您想将站点移动到新的机器/主机并且结构稍有不同时,它也会导致问题。

答案 15 :(得分:2)

包括over目录可以由代理文件处理

  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___分贝
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';
    

答案 16 :(得分:2)

试试../../。您可以相应地修改它,因为它会将您带回两个目录。首先到达根目录然后访问所需的目录。

E.g。您在root/inc/usr/ap,还有另一个目录root/2nd/path。您可以从path访问ap目录,如下所示: ../../2nd/path首先转到root而不是所需的目录。如果不行,请分享。

答案 17 :(得分:1)

我看到了你的答案,我使用了带语法的包含路径

require_once '../file.php'; // server internal error 500

和http服务器(Apache 2.4.3)返回内部错误500。

当我改变路径

require_once '/../file.php'; // OK

一切都很好。

答案 18 :(得分:0)

尝试一下

此示例位于一个目录后

require_once('../images/yourimg.png');

此示例为两个目录后退

require_once('../../images/yourimg.png');