1

我的一个站点有一个 config.php 文件,其中包含运行该站点所需的信息。它看起来像这样:

<?php

$site_name="The Site";
$base_url = "http://site.com";
$upload_path = "/images";

?>

从中获取值很容易,我只使用 require'config.php';但我如何提供从 html 表单添加它的选项?意味着我如何更新值?我想到的一种方法是使用 fopen 和 fsave,有点像这样:

<?php
$filename = 'config.php';
$somecontent = "config here";


if (is_writable($filename)) {


    if (!$handle = fopen($filename, 'w')) {
         echo "Cannot open file ($filename)";
         exit;
    }

    // Write $somecontent to our opened file.
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Cannot write to file ($filename)";
        exit;
    }

    echo "Success, wrote ($somecontent) to file ($filename)";

    fclose($handle);

} else {
    echo "The file $filename is not writable";
}
?>

但这是执行此操作的标准方法吗?这就是所有这些 cms 编写配置文件的方式吗?

4

7 回答 7

4
$cfg['sitename'] = $_POST['sitename'];

$file     = "config.php";
$contents = "<?php\r\n\$cfg=".var_export($cfg,1).";\r\n?>";

file_put_contents($file,$contents);
于 2010-08-07T08:57:16.967 回答
3

好吧,我不喜欢重写 PHP 脚本 (config.php) 的想法。

我认为一个更好的解决方案是拥有一个 config.ini 文件(您必须保护对该文件的访问。您可以通过 .htaccess 文件执行此操作,或者您可以将文件移出 document_root 范围)然后读取该文件。

config.ini 内容:

 key1 = value
 key2 = value
 key3 = value
 key4 = value

笔记:

  • config.ini 会比 config.php 慢一点,但对于非关键站点来说就可以了
  • config.ini 应该是比使用数据库更好的选择
  • 作为 config.ini 的一个优势,我看到没有人可以将 php 脚本添加到您的 config.php
  • PHP包含用于解析ini文件的函数parse_ini_file (使用示例
  • 您可以将 ini 文件的内容划分为部分和模式:

 [Production]
 mysql_server = value
 mysql_username = value
 ...

[Development] mysql_server = value mysql_username = value ...

于 2010-08-07T08:44:15.480 回答
2

写入 .php 文件根本不是一个好主意。最好将您的配置存储在数据库、.ini 文件或 xml 文件中。使用这个“存储”进行配置可以很容易地读写。

注意:请注意,您应该将.ini、.xml 文件从您的文档根目录中移出,以避免从Web 访问它。

另外,我建议您检查 Zend Config http://framework.zend.com/manual/ru/zend.config.html以了解如何在 OOP MVC 框架中实现写入配置。

于 2010-08-07T08:43:00.897 回答
1

您可以使用模板引擎为 config.php 创建模板,例如 Smarty

配置文件

<?php
     // DB Settings
     $db_host = "{$db->host}";
     $db_user = "{$db->user}";
     $db_password = "{$db->password}";
     ...

并使用 Smarty 为您渲染config.php并捕获输出并保存到真实的配置文件中。

<?php
      $smarty->assign('db', $db);
      $output = $smarty->fetch('config.tpl');
      // ...save the output into config.php

使用这种方法的好处是您可以将配置文件的布局和内容分开,例如您可以在配置文件中添加额外的注释,或者轻松安排项目的顺序。

此外,使用这种方法,您可以按照其他人的建议轻松迁移到其他格式,例如INIXML格式。

于 2010-08-07T09:13:18.760 回答
1

我使用 tszming 的模板解决方案已经有一段时间了,它工作得很好——前提是你已经对 Smarty 或其他模板系统感到放心,否则仅仅为了保存你的配置可能会花费太多的精力。

一个更简单的解决方案是将所有配置选项放在一个数组中,并将其保存在一个编码为 JSON 的文件中。在每个脚本的开始你file_get_contents()json_decode()设置文件放入数组中。任何时候你想保存当前选项你json_encode()的选项数组并使用file_put_contents(). 这使 PHP 可以轻松地读取和写入配置,但您仍然可以使用文本编辑器对其进行编辑。

于 2010-08-07T20:30:29.963 回答
0

我想这就是大多数 CMS 的管理面板允许您直接写入配置文件的方式,但是:

  • 在执行此操作之前,您应该绝对确保提交者已通过管理员身份验证。
  • REGISTER_GLOBALS最好也将其关闭,尽管这更多的是一般的安全问题,而不是与此相关的特定问题。
于 2010-08-07T08:18:24.627 回答
0

根据个人经验,我的建议是将最基本的内容保留在配置文件(数据库连接)中,并将其他所有内容保留在数据库表中。你应该尽量避免在服务器上写东西,除非你真的必须这样做,否则你会遇到权限问题,安全问题等等......

当您想要分发这样的脚本时,它变得越来越重要。

其余的与上面的答案非常相似:

<?php
$config = "<?php\r\n";

$file     = "/path/to/config.php";

foreach ( $_POST [ 'config' ] as $config_label => $config_value ):
    $config .= "$$config_label = '{$config_value}'\r\n";
endforeach;

file_put_contents($file,$config);

祝你好运。

于 2010-08-07T11:17:52.203 回答