【问题标题】:PHP parse_ini_file problemsPHP parse_ini_file 问题
【发布时间】:2015-05-06 20:51:07
【问题描述】:

我有一个如下所示的 config.ini 文件:

[database]
username = user1
password = pass1
dbname = db1

我想用 PHP 解析它,但我没有运气。我正在尝试的代码是:

$inifile = parse_ini_file($_SERVER['DOCUMENT_ROOT'] . "/cfi/config.ini", true);
var_dump($inifile);

PHP 是包含的一部分,这就是为什么我尝试添加 $_SERVER['DOCUMENT_ROOT'] 以确保它可以找到配置文件。

var_dump 的结果总是 bool(false)

我做错了什么?

编辑:

我已经添加了 / 并且它现在肯定指向配置文件。但是还是有bool(false)

的结果

【问题讨论】:

  • 我认为您无法打开文件。可能是您在 $_SERVER['DOCUMENT_ROOT'] 中缺少 / 。 '/' 。 “cfi/config.ini”
  • 我不确定在文档根目录中保留配置文件是否是个好主意;最好把它放在外面。
  • Lee,您可能需要调整文件的权限,让 PHP 输出 fileperms($filename); 值,这可能会告诉您您的文件不允许打开或查看-创作者派对(即PHP)。
  • 将错误报告添加到文件顶部,紧跟在打开 PHP 标记之后,例如 <?php error_reporting(E_ALL); ini_set('display_errors', 1);,然后是其余代码,看看它是否会产生任何结果。
  • 那些文件权限是-rw-r--r--,应该可以正常工作;您是否也检查了指向该文件的目录权限?顺便说一句,如果从该函数返回 false,它也应该显示错误消息。

标签: php


【解决方案1】:

我的代码也有同样的问题。在尝试了一些失败后,我注意到我的密码中有一个特殊的字符('^')是导致错误的原因。它是通过将值放在双引号 ("") 内来修复的。

例如:

[database]
username = "user1"
password = "pass1"
dbname = "db1"

希望这可以帮助像我这样的人。

【讨论】:

    【解决方案2】:

    Lee,如果您尝试访问的文档位于文件夹 root/cfi/config.ini 中,这看起来很像它超出了 $_SERVER['Document_Root']; 变量的范围 - 看起来像:

    /home/accountname/websitefolder/

    您的 ini 文件听起来就像它位于文件夹中一样

    /home/accountname/root/cfi/

    这意味着你不会到达它。如果地址正确,您可以调试:

    if(file_exists($_SERVER['DOCUMENT_ROOT'] . "/cfi/config.ini")){
    print fileperms($_SERVER['DOCUMENT_ROOT'] . "/cfi/config.ini");
    }
    else {
    die("does not exist at this location");
    }
    

    fileperms 函数将反馈文件的访问权限,如果文件位于正确的位置,可能会阻止 PHP 读取它。

    ini文件结构:

    另外, 您需要确认您的 ini 文件是正确的结构,ini 文件需要是有效的 ini 结构,如 php.ini 文件,请参阅http://php.net/manual/en/function.parse-ini-file.php

    (编辑:为了 BoltClock 的编辑,我想保留上面关于 ini 文件结构的声明,因为这实际上是导致 OP 问题的原因,但是我已经改写了它。谢谢)

    补充:

    错误跟踪对于找出出错的原因至关重要: 来自 SO - How to log errors and warnings into a file? 上的这篇帖子 - 以及 Fred-ii 的明智建议 - 任何人都可以将以下内容添加到他们的文件顶部以获得一些错误反馈:

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    ini_set("log_errors", 1);
    ini_set("error_log", "/tmp/php-error.log");
    

    这对于那些知道的人来说看起来有些过分,但上面的代码会:

    report all errors
    display these errors to the browser
    log these errors to the log file
    set where the log file lives. 
    

    显示 日志文件不是必需的,但我将两者都放入,以便人们可以选择他们的方法。生产服务器应始终禁用向浏览器显示错误。

    现在,您有一个包含许多错误的日志文件,您需要您的 (S)FTP 程序在文件夹中查找它,上面提到的文件夹/tmp/ 不在您的网站域文件夹中,而是在一个伴侣文件夹,在它旁边,所以你需要 (S)FTP 来访问它。登录,找到文件夹,归档并下载。用文本编辑器打开它,它会给你你的错误。从服务器中删除该文件,当出现新错误时将生成一个新文件。

    【讨论】:

    • 这更有意义。让我们看看OP怎么说。 手指交叉 ;-)
    • 感谢 Martin,我已确保文件位于正确的区域,例如您提供的 /home/accountname/websitefolder/ 示例。我已经尝试过 file_exists 并且它返回了一个 1。所以我猜这意味着它找到了它?
    • 好的 Lee,下一步 - 您是否在代码中添加了错误日志记录?去做吧。然后下一步,使用 chmod() 函数将文件设置为类似于 0750 和 php.net/manual/en/function.chmod.php 的内容。这将尝试强制文件对所有人可读。
    • @Lee Great,将此答案标记为已解决;-) 另一个幸福的结局。
    • @Fred-ii- 很高兴与您一起解决问题,我已将您的错误报告建议添加到我的答案中,说实话,错误日志应该是关于 SO PHP 的任何问题的第一个呼叫点!!
    【解决方案3】:

    我不确定它是否会导致您的整体问题,但我认为 DOCUMENT_ROOT 不包含尾部斜杠,因此您需要在“cfi”之前添加一个。

    您可以通过以下方式检查:

    echo $_SERVER['DOCUMENT_ROOT'] . "cfi/config.ini";
    

    【讨论】:

    • 清除所有 cmets。请将评论限制在与答案内容相关的内容上;对于其他一切,有Meta Stack Overflow
    猜你喜欢
    • 2013-05-10
    • 2011-08-09
    • 2012-06-17
    • 1970-01-01
    • 2021-10-15
    • 2012-12-11
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多