include_once,php中的相对路径

时间:2011-10-20 12:31:44

标签: php file include-path

我有3个文件:home,failed_attempt,login。

文件home和failed_attempt都是指登录文件。

令人讨厌的是他们犯了一个错误,说登录文件不存在。如果我这样做,home会抛出异常,但是fail_attempt不会。

  include_once("../StoredProcedure/connect.php");

include_once( “../名字/ sanitize_string.php”);

如果我这样做:

   include_once("StoredProcedure/connect.php");
   include_once("untitled/sanitize_string.php");

相反的情况发生,failed_attempt抛出异常,但是回家,不会。我该如何解决这个问题..

我是否通过把这个../告诉include包括一个页面,因此home.php不需要去一页因此它会引发异常..

我怎样才能这样做,以便两个文件都接受那些包含有效...也许与它们放置的位置无关......即没有那个../

目录结构:

PoliticalForum
->home.php
->StoredProcedure/connect.php
->untitled/sanitize_string.php
->And other irrelevant files

5 个答案:

答案 0 :(得分:8)

realpath()__DIR__之类的东西是您在PHP中创建路径时的朋友。

Realpath http://php.net/manual/en/function.realpath.php

魔术常数 http://php.net/manual/en/language.constants.predefined.php

由于include和require是语言结构(而不​​是函数),因此它们不需要括号。一般来说,您使用include来包含“模板”(输出文件)和require以包含PHP文件,例如类。

所以你可以使用类似的东西:

$sPath = realpath( __DIR__ . '/../relative/path/here');
if($sPath) { require_once $sPath; }

(在PHP< 5)

上使用dirname(__FILE__)代替__DIR__

在尝试要求文件之前评估路径是值得的,因为realpath()如果文件不存在则返回false并且尝试require false;解决PHP错误。

或者你可以使用绝对路径,如:

require /home/www/mysite.com/htdocs/inc/somefile.php

答案 1 :(得分:7)

以下是三种可能的解决方案。第二种方法实际上就是以巧妙的方式使用绝对路径的解决方法。

1:chdir进入正确的目录

<?php

// check if the 'StoredProcedure' folder exists in the current directory
// while it doesn't exist in the current directory, move current 
// directory up one level.
//
// This while loop will keep moving up the directory tree until the
// current directory contains the 'StoredProcedure' folder.
//
while (! file_exists('StoredProcedure') )
    chdir('..');

include_once "StoredProcedure/connect.php";
// ...
?>

请注意,这仅适用于StoredProcedure文件夹位于可能需要包含其所包含文件的任何文件的最顶层目录中。

2:使用绝对路径

在您说这不可移植之前,它实际上取决于您如何实现它。这是一个适用于Apache的示例:

<?php
include_once $_SERVER['DOCUMENT_ROOT'] . "/StoredProcedure/connect.php";
// ...
?>

或者,再次使用apache,将以下内容放在根目录中的.htaccess中:

php_value auto_prepend_file /path/to/example.php

然后在example.php中:

<?php

define('MY_DOC_ROOT', '/path/to/docroot');

?>

最后在你的文件中:

<?php
include_once MY_DOC_ROOT . "/StoredProcedure/connect.php";
// ...
?>

3:设置PHP的include_path

the manual entry for the include_path directive。如果您无法访问php.ini,那么可以在.htaccess中设置,只要您使用Apache并且PHP 安装为CGI,就像这样:

php_value include_path '/path/to/my/includes/folder:/path/to/another/includes/folder'

答案 2 :(得分:3)

对初学者来说,这将有助于理解。根据您的相对路径使用以下内容:

//include file directly from parent directory:
include_once(dirname(__FILE__) . '/../connect.php');

OR

//include file from parent's child directory:
include_once(dirname(__FILE__) . '/../StoredProcedure/connect.php');

OR

//include file from own child directory:
include_once('StoredProcedure/connect.php');

OR

//include sibling files from same directory:
include_once('connect.php');

答案 3 :(得分:2)

执行require(dirname(__FILE__) . '[RELATIVE PATH HERE]');

之类的操作

答案 4 :(得分:1)

其他人已正确回答了你的问题,但我认为我会做出其他贡献:自动加载器。

自动加载器允许您在尝试使用类时定义一个自动包含某些文件的函数。

文档在这里,可以比我更好地解释:http://php.net/manual/en/language.oop5.autoload.php

真的建议使用它们,会节省您的时间并且是更好的练习。