PHP不允许我从外部config.php中提取已定义的变量

时间:2009-09-22 13:41:15

标签: php variables include

我正在将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中提取这些变量定义。

有谁知道为什么?

5 个答案:

答案 0 :(得分:4)

你不能从URL include(),因为这样做是为了尝试运行生成的代码,在这种情况下,它只是一个空白文件。您需要使用本地路径。获取当前文件的目录,例如:

define('LOCALPATH', dirname(__FILE__));

答案 1 :(得分:2)

inlude s(和requireoperate on file system paths,而不是网址:

define('SITE_ROOT', 'http://...etc')

错了。应该有路径,或者您的LIB_PATH需要以不同的方式定义。正如手册解释的那样,你也可以让它在url上运行,但我怀疑你是这样做的。

答案 2 :(得分:1)

您需要启用allow_url_fopenallow_url_include(自PHP 5.2起)才能使用include的网址。

但这不是一个好主意。您应该只允许您自己控制的文件系统中的文件。否则,可能会发生恶意代码从您包含的远程文件注入并执行到您的系统上。

答案 3 :(得分:0)

这永远不会起作用:require_once()和所有其他php-include调用仅适用于本地文件。 (更新:这不是真的)

在阅读评论之后进行编辑,该评论说实际 可以使用网址包含某些内容:您希望在文件中包含实际的代码。如果你像现在这样在网址中包含某些东西,你可能会包含运行该文件而不是实际的php内容的结果。

所以看起来您可以通过两种方式解决您的问题:

  • 包括使用本地路径(最简单的选项 - 您可以编辑您的问题以解释为什么它可能不适合您)
  • 让脚本回显你想要包含在各处的php内容(我建议不要这样做,因为任何调用你的配置URL的人都会以纯文本形式获得配置数据。)

答案 4 :(得分:0)

可以包含来自网址的文件,但您必须了解正在发生的事情。

Web服务器将处理您作为URL包含的php文件,因此您实际包含的唯一内容是包含url的php文件的输出。

哪个 - 在你的情况下 - 在你回应之前什么也没有。