我在项目中包含了很多页面,我遇到包含内部路径不正确的问题,有没有办法从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
答案 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_path到class 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' );