我正在构建的Web应用程序中有一个config.inc
文件。它包含一个包含MySQL数据库等配置值的数组。我希望通过使用一个简单的表单来输入这些数据,这个表单要求服务器,数据库的登录/密码等,然后将这些写入配置文件。
有这样做的首选方法吗?我不知道如何写入文件,并更新数组。
答案 0 :(得分:2)
你只想写作,对吗?它是序列化数组还是已解析?
读取配置文件的一种方法是parse_ini_file()。我不一定称之为首选,但这是一种方法。你仍然需要写这个文件。
另一种方法是编写一个“config.inc.php”并将其包含在内,为了编写它你只输出实际的PHP代码(例如$ var =“myval”;)。
这是一种可以编写一个简单的“输出”函数的方法,它接受一组配置值并将它们输出为name = value,假设$ config是一个关联数组。
foreach ($config as $name => $value) {
$output .= $name . '=' . $value . "\n";
}
if (!file_put_contents($filename, $output)) {
die("Error writing config file.");
}
有很多不错的方法可以做到这一点。这真的是基于你的要求。是否需要以特定格式存在或者您是否有余地?
答案 1 :(得分:1)
建议不要通过应用程序修改PHP配置文件,应使用CSV文件或数据库表。 如果您想将其保存在CSV文件中,我建议您为每种配置类型保留一个CSV文件(例如数据库配置的CSV文件),并始终使用file_put_contents覆盖前一个文件
保存数据示例:
$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it
$csvData = array();
foreach ($csvStructure as $field) {
$csvData[] = $_POST[$field]; // so it'd get $_POST["dbUser"],$_POST["dbPasword"], etc..
}
file_put_contents("filename",implode("\t",$csvData));
加载数据示例:
$csvStructure = array("dbUser","dbPassword","dbHostname","dbPort"); // array used for both loading data and saving it
$dbConfig = array();
$csvData = explode("\t",file_get_contents("filename"));
foreach ($csvStructure as $key => $field) { // $key would have the location of the requested field in our CSV data (0,1,2, etc..).
$dbConfig[$field] = $csvData[$key]; // populate $dbConfig["dbUser"],$dbConfig["dbPasword"], etc..
}
答案 2 :(得分:1)
我相信使用ini文件是一个明智的选择,因为用户,密码,架构,路径等通常会手动修改,所以使用var_export
不是因为手工修改它它不是那么干净,如果你在PHP语法中犯了错误,可能会使你的应用程序崩溃。
但解析大的ini文件可能会很昂贵,因此可以使用var_export()
或serlialize()
缓存ini。我认为这是一个更好的选择,只有当缓存文件不存在时才读取ini。
答案 3 :(得分:0)
好吧,要写一个文件,fwrite()php函数完全符合你的要求。从其PHP.NET文档页面(参见下面的示例)。
现在,关于输出到该文件的内容的问题 - 我假设该文件必须作为配置.php文件包含在项目的其余部分中。我想你会做这样的事情 - 你根据提交的表格动态地用PHP代码创建字符串:
$strDatabaseConfig = "\$databaseConfig = array('" . $_POST['login'] . "," . $_POST['password'] . "');";
这是fwrite的片段:
$filename = 'test.txt';
$somecontent = "Add this to the file\n";
// Let's make sure the file exists and is writable first.
if (is_writable($filename)) {
// In our example we're opening $filename in append mode.
// The file pointer is at the bottom of the file hence
// that's where $somecontent will go when we fwrite() it.
if (!$handle = fopen($filename, 'a')) {
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";
}
答案 4 :(得分:0)
这是一种方式:来自WordPress的wp-admin/setup-config.php
。
答案 5 :(得分:0)
答案 6 :(得分:0)
我更喜欢带有一堆定义语句的文件。
这些是全局可用的常量(当然也是不可变的),这是配置设置所需的。
常量提供更好的内存管理和读取效率,因为它们不需要变量所需的额外内存,因此可以更改。
答案 7 :(得分:-4)
假设您的config.inc文件如下所示:
$config = array(
'blah' => 'mmm',
'blah2' => 'www',
//...
);
您想要更新它,因此您创建一个简单的表单,用当前值填充文本字段。覆盖当前配置的PHP脚本可能如下所示:
$newConfig = ...; // data from form - of course validate it first
$config = ...; // data from config.inc
$config = array_merge($config, $newConfig);
file_put_contents('config.inc', '<?php $config = ' . var_export($config, true));
你已经完成了。