包括在PHP中

时间:2011-08-09 09:46:54

标签: php file include

我在项目中包含了很多页面,我遇到包含内部路径不正确的问题,有没有办法从root包含文件, 我试着这样做

require_once("$_SERVER['DOCUMENT_ROOT']/crm/includes/opendb.php");
require_once("./includes/opendb.php");
require_once("../includes/opendb.php");
require_once("includes/opendb.php");

并且所有包含文件的错误,任何建议PLZ?

修改

我有2个文件夹,控制器和包含,在控制器内我从include文件夹调用opendb.php,我在下面的答案中说明了

set_include_path('../includes/');
include 'opendb.php';

set_include_path('includes/');
include 'opendb.php';

但是同样的错误

Warning: include(opendb.php) [function.include]: failed to open stream: No such file or directory in C:\AppServ\www\crm\controllers\Customer.controller.php on line 

5 个答案:

答案 0 :(得分:2)

"$_SERVER['DOCUMENT_ROOT']/crm/includes/opendb.php"不正确:您不能在双引号内的数组键周围使用撇号。尝试其中之一:

require_once( $_SERVER['DOCUMENT_ROOT']."/crm/includes/opendb.php" );
require_once( "$_SERVER[DOCUMENT_ROOT]/crm/includes/opendb.php" );
require_once( "{$_SERVER['DOCUMENT_ROOT']}/crm/includes/opendb.php" );

答案 1 :(得分:1)

有许多可能的解决方案(从include_pathclass autoloading)但是我认为设置绝对路径往往在实践中更好地工作:它简单,直观且不易被破坏系统管理员和第三方库。

你没有说为什么$_SERVER['DOCUMENT_ROOT']对你不起作用,但我发现它只有99%的时间有效:一些主机提供商没有设置它或将它设置为错误的值。此外,应用程序可能不直接位于文档根目录中。为了解决这个问题,我通常会在所有脚本之上编写一个settings.php文件,该文件是手动加载的

// One of...
require(dirname(__FILE__) . '/conf/settings.php');
require(dirname(__FILE__) . '/../conf/settings.php');
require(dirname(__FILE__) . '/../../conf/settings.php');

settings.php中,我创建了两个PHP常量:

define('FS_ROOT', $_SERVER['DOCUMENT_ROOT'] . '/my-app/');
define('WEB_ROOT', '/my-app/');

我更喜欢常量而非变量,因为它们在所有范围内都可用(并且它们无论如何都是常量值)。设置它们的值时,您可以根据需要使用尽可能多的逻辑(例如,您可以计算my-app部分而不是硬编码),但这是一般的想法:

require_once(FS_ROOT . 'utils/email.php');
echo '<script type="text/javascript" src="' . WEB_ROOT . 'js/validate.js"></script>';

答案 2 :(得分:0)

您可以使用set_include_path()更改包含路径。

假设你有这个文档结构:

php/include.php
php/include2.php
file.php

php/include.php有以下代码:

include 'include2.php';

如果您要在php/include.php中加入file.php,请执行以下操作:

include 'php/include.php';

这会导致include2.php出错,因为您不在php/文件夹中。

但如果你这样做:

set_include_path('php/');
include 'include.php';

它会起作用。

答案 3 :(得分:0)

我猜文件includes/opendb.php是用于连接数据库的配置吗?

如果我是对的,那么最好使用OOP和MVC来分离视图和逻辑,并尝试寻找依赖注入容器(DIC)来配置服务等。

之后,您将能够为PHP类使用自动加载器并在模板中进行更改(包括其他模板等)。这样可以防止您烦恼require_once("includes/opendb.php");

答案 4 :(得分:0)

如果$_SERVER[ 'DOCUMENT_ROOT' ]不起作用(在PHP + IIS等某些配置上不起作用),请使用以下任何一种技巧:

$_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/',
       substr($_SERVER['SCRIPT_FILENAME'], 0, 0-strlen($_SERVER['PHP_SELF'])));

$_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/',
     substr(str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']),
     0, 0-strlen($_SERVER['PHP_SELF'])));

要解决相对使用dirname(__FILE__)的文件:

require_once( dirname(__FILE__).'/../includes/opendb.php' );