我正在将PHP站点从开发转移到生产服务器并测试新的数据库连接。我有一个config.php
页面只有这个(但有实际数据):
<?php
// Database Constants
defined('DB_SERVER') ? null : define('DB_SERVER', 'xxx.xxx.xxx');
defined('DB_PORT') ? null : define('DB_PORT', 'yyy');
defined('DB_USER') ? null : define('DB_USER', 'zzz');
defined('DB_PASS') ? null : define('DB_PASS', 'abcdefg');
defined('DB_NAME') ? null : define('DB_NAME', 'lmnop');
?>
然后我initialize.php
拥有我的所有define()
常量,并调用我的所有类。
<?php
// Define core paths
// DIRECTORY_SEPARATOR is a PHP pre-defined constant
// (\ for Windows, / for Unix)
defined('DS') ? null : define('DS', DIRECTORY_SEPARATOR);
defined('SITE_ROOT') ? null : define('SITE_ROOT', 'http://...etc');
defined('LIB_PATH') ? null : define('LIB_PATH', SITE_ROOT.'/_includes');
// load config file first
require_once(LIB_PATH."/config.php");
etc...
?>
到目前为止,这么好。 (我正在使用URL而不是故意使用DIR路径,顺便说一句。)
但是当我创建一个test.ph
p页面来运行查询时,我收到的错误是找不到DB_SERVER。我可以在config.php
中回显某些内容,它会显示在test.php
页面的顶部,因此它会调用config.php
文件。这是真正疯狂的踢球者:
当我从config.php
复制所有内容并将其粘贴到initialize.php
时,请不要更改内容,然后注释掉config.php
文件...查询有效。出于某种原因,它不会让我从config.php
中提取这些变量定义。
有谁知道为什么?
答案 0 :(得分:4)
你不能从URL include()
,因为这样做是为了尝试运行生成的代码,在这种情况下,它只是一个空白文件。您需要使用本地路径。获取当前文件的目录,例如:
define('LOCALPATH', dirname(__FILE__));
答案 1 :(得分:2)
inlude
s(和require
)operate on file system paths,而不是网址:
define('SITE_ROOT', 'http://...etc')
错了。应该有路径,或者您的LIB_PATH
需要以不同的方式定义。正如手册解释的那样,你也可以让它在url上运行,但我怀疑你是这样做的。
答案 2 :(得分:1)
您需要启用allow_url_fopen或allow_url_include(自PHP 5.2起)才能使用include
的网址。
但这不是一个好主意。您应该只允许您自己控制的文件系统中的文件。否则,可能会发生恶意代码从您包含的远程文件注入并执行到您的系统上。
答案 3 :(得分:0)
这永远不会起作用:require_once()和所有其他php-include调用仅适用于本地文件。 (更新:这不是真的)
在阅读评论之后进行编辑,该评论说实际 可以使用网址包含某些内容:您希望在文件中包含实际的代码。如果你像现在这样在网址中包含某些东西,你可能会包含运行该文件而不是实际的php内容的结果。
所以看起来您可以通过两种方式解决您的问题:
答案 4 :(得分:0)
您可以包含来自网址的文件,但您必须了解正在发生的事情。
Web服务器将处理您作为URL包含的php文件,因此您实际包含的唯一内容是包含url的php文件的输出。
哪个 - 在你的情况下 - 在你回应之前什么也没有。