【问题标题】:PHP not letting me pull defined variables from external config.phpPHP 不允许我从外部 config.php 中提取定义的变量
【发布时间】:2009-09-22 13:41:15
【问题描述】:

我正在将 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.php 页面来运行查询时,我收到了一个错误,即找不到 DB_SERVER。我可以在config.php 中回显某些内容,它将出现在test.php 的页面顶部,因此它正在调用config.php 文件。这是真正的疯狂踢球者:

当我从config.php 复制所有内容并将其粘贴到initialize.php 时,不要更改任何内容,然后注释掉config.php 文件...查询有效。出于某种原因,它不允许我从config.php 中提取这些变量定义。

有人知道为什么吗?

【问题讨论】:

  • 错误信息到底是什么意思?
  • 顺便说一句,如果您的配置文件检查是否定义了常量,则无需使用require_once,它很慢且没有必要。

标签: php variables include


【解决方案1】:

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

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

【讨论】:

  • 谢谢,瑞恩。我知道我错过了一些非常基本的东西。当我将它从本地开发服务器移到生产服务器时,我切换到 URL,因为我的大学虚拟主机不配合告诉我路径名。但这完全正确。而且我想我可以使用 realpath() 为自己提取路径名,对吧?再次感谢!
【解决方案2】:

inludes(和requireoperate on file system paths,不在网址上:

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

错了。应该有路径,或者您的LIB_PATH 需要以不同方式定义。正如手册所述,您也可以使其对 url 进行操作,但我怀疑您是否这样做。

【讨论】:

  • +1。它看起来像它的工作的原因是因为回显出现在页面顶部,并且通过 url 包含页面包括回显的呈现输出。
  • 这不是真的,他们在任何路径上运行,他的定义没有错。只是结果不是他所期望的,因为他包含已处理的 php(本例中没有)而不是代码。
  • 在这种情况下与 wrong 有什么区别,jeroen?
【解决方案3】:

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

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

【讨论】:

  • 很高兴能评论一下为什么这个答案被否决。
【解决方案4】:

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

在阅读说明实际上可以使用 url 包含某些内容的评论后进行编辑:您希望从文件中包含实际的 代码。如果您像现在一样包含来自 url 的内容,您可能会包含运行该文件的结果而不是实际的 php-content。

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

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

【讨论】:

  • 不完全正确。行为是不同的,但它是可能的。从文档中:如果在 PHP 中启用了“URL fopen 包装器”(它们在默认配置中),您可以使用 URL 指定要包含的文件。
  • 是的,Andre:继续阅读 *如果目标服务器将目标文件解释为 PHP 代码,则可以使用与 HTTP GET 一起使用的 URL 请求字符串将变量传递给包含的文件。严格来说,这与包含文件并使其继承父文件的变量范围不同。该脚本实际上正在远程服务器上运行,然后将结果包含到本地脚本中。 *
  • 是的,这就是我说行为不同的原因。我是说“require_once() 和所有其他 php-include 调用仅适用于本地文件”这句话并不完全正确。 PS:反对票不是我的。
【解决方案5】:

可以包含来自 url 的文件,但您必须了解发生了什么。

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

在你的情况下——在你回显某些东西之前什么都不是。

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多