【问题标题】:Using includes in php在 php 中使用包含
【发布时间】:2011-11-05 12:40:17
【问题描述】:

我有一个名为 header 的文件(我网站的标题)。我在所有网站中都使用该文件。问题是它包含以下内容:

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

这意味着可能会抛出错误,这取决于谁调用了头文件。

我有目录,子目录和子目录的子目录..有没有一种简单的方法可以防止这种情况发生..而不是将饱和字符串包含并将其放在每个页面上而不是头文件中

Warning: require_once(/untitled/sanitize_string.php) [function.require-once]: failed to open stream: No such file or directory in C:\xampp\htdocs\PoliticalForum\StoredProcedure\User\headerSite.php on line 7

致命错误:require_once() [function.require]:在 C:\xampp\htdocs\ 中打开所需的 '/untitled/sanitize_string.php' (include_path='.;C:\xampp\php\PEAR') 失败政治论坛\StoredProcedure\User\headerSite.php 第 7 行

【问题讨论】:

  • 请发sanitize_string.php的内容。它很可能包含没有正确处理缺失变量等错误的代码。这是要解决的问题。
  • 使其相对于定义的路径,例如您网站的文档根目录。我使用一个常量来做到这一点;有几种方法可以确定路径。

标签: php include dreamweaver


【解决方案1】:

您可以考虑在使用include 时设置一个全局include path

【讨论】:

  • 所以这是最好的解决方案,尽管我牺牲了速度。其他人给我的答案不相关..即使我使用魔术常量,一旦我使用 ../ 它告诉文件去一个目录并在那里查找文件..仍然抛出异常
  • @WithFlyingColors:绝对路径你没有任何例外
  • 那么为什么大家不使用绝对路径而不是相对路径呢?!
  • 绝对路径很脆弱。每次移动文件时,都必须返回文件以更改绝对路径。如果您将文档安排在模块化、独立的结构中,则相对路径会更加灵活。当然,如果您更改模块的位置,则必须更新相对路径。对于一个相当标准的项目,PHP 包含路径,如 OS PATH,提供了最灵活的解决方案。
  • hmm.. 我更喜欢采用传统方式和最佳实践,因此我将避免包含路径,而使用绝对路径。我不移动文件。所以我只需要包含文件,比如我为图像或链接的 src 属性编写路径?
【解决方案2】:

对于 php 5.3 你可以这样做:

include_once(__DIR__ . '/../untitled/sanitize_string.php');

__DIR__ 是当前文件的目录

对于旧版本,您可以使用

include_once(dirname(__FILE__) . '/../untitled/sanitize_string.php');

__FILE__ 是当前文件的路径

假设你有以下结构:

/app/path/public/header.php
/app/path/public/user/profile.php
/app/path/untitled/sanitize_string.php

如果您的header.php 包含santitize_script.php,其相对路径如下:

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

php 解释器将尝试将该文件相对地包含到当前工作目录中,因此如果您执行类似http://localhost/header.php 的请求,它将尝试从/app/path/public/../untitled/sanitize_string.php 包含它并且它会起作用。

但是,如果您尝试执行类似http://localhost/user/profile.php 的请求并且profile.php 包含header.php,那么header.php 将尝试包含来自/app/path/public/user/../untitled/sanitize_string.php 的文件,这将不再有效。 (/app/path/public/user 现在是当前工作目录)

这就是为什么在包含文件时使用绝对路径是一种很好的做法。在 header.php 中使用时,__DIR____FILE__ 常量将始终具有相同的值:分别为 /app/path/public/app/path/public/header.php,无论此后在何处使用 header.php

【讨论】:

  • DIR 给你什么?那么如果我得到当前目录或文件呢?
  • 如果您碰巧知道脚本将始终从网络服务器运行,并且您想管理相对于网络服务器文档根目录的包含路径(这样您就不必调整 '. ./' 每个目录的前缀),您可以编写相对于 GetVar('DOCUMENT_ROOT') 而不是 dirname(FILE) 的路径。
  • 我不知道 GetVar('Document_root") 做了什么,我不明白这有什么帮助...include_once(dirname(FILE) .'/../untitled/ sanitize_string.php'); 因为如果我的文件在同一个目录中,会发生什么,它会想到上一个文件夹。这是一个错误..为什么不只使用文档路径?!?为什么是相对路径发明的?
  • @WithFlyingColors 如果您的文件与 header.php 位于同一目录中,您显然会使用类似 include_once(__DIR__ . '/untitled/sanitize_string.php'); 的语法包含它
  • 如果它在同一个目录中,我可以使用:untitled/sanitize_string.php..为什么你需要魔法常数..它没有用,与我的问题无关。我看到的唯一解决方案是像有远见的人所说的那样更改 php.ini 中的 include_path 或者小心我如何使用我的包含。所以如果我在整个站点中使用绝对路径..我没有问题吗?
【解决方案3】:

使用绝对路径...

include_once('/home/you/www/include.php');

【讨论】:

  • +1 - 或者如果您想避免使用绝对路径,请使用 header.php 中的 __FILE__ 常量并使其相对于它。
【解决方案4】:

使用yes123所说的绝对路径。

include_once(dirname(__FILE__)."/../untitled/sanitize_string.php");

【讨论】:

  • 我明白了:宁:include_once(C:\xampp\htdocs\PoliticalForum\StoredProcedure\User/../untitled/sanitize_string.php) [function.include-once]: 无法打开流: 在第 7 行的 C:\xampp\htdocs\PoliticalForum\StoredProcedure\User\headerSite.php 中没有这样的文件或目录警告:include_once() [function.include]: Failed opening 'C:\xampp\htdocs\PoliticalForum\StoredProcedure \User/../untitled/sanitize_string.php' 用于包含 (include_path='.;C:\xampp\php\PEAR') 在 C:\xampp\htdocs\PoliticalForum\StoredProcedure\User\headerSite.php 第 7 行
【解决方案5】:

您将不得不在此处使用绝对路径,而不是相对路径。我经常使用旧的 Server vars 设置一些常量来表示重要的目录。像这样:

define('MY_DIR',$_SERVER['DOCUMENT_ROOT'].'/path/to/yer/dir');

然后,修改你的包含语句:

include_once(MY_DIR.'/your_file.php');

【讨论】:

  • 这样,如果你的文件系统的布局由于某些奇怪的原因发生变化,PHP 仍然会知道在哪里找到文件。
猜你喜欢
  • 2017-08-25
  • 1970-01-01
  • 2012-05-13
  • 2013-05-02
  • 2018-09-12
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多