如何包含一个超过2个目录的文件。我知道你可以使用../index.php
来包含一个2个目录的文件,但你如何为3个目录做回来呢?
这有意义吗?
我试过了.../index.php
,但它没有用。
我在/game/forum/files/index.php
中有一个文件,它使用PHP include来包含一个文件。它位于/includes/boot.inc.php
; /
是根目录。
答案 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');
答案 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;表示升级多少
答案 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目录可以由代理文件处理
..... | _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');