将变量值更改保存到file.php

时间:2012-03-02 12:30:01

标签: php file

我有一个名为variables.php的文件

<?php
   $dbhost = 'localhost';
   $dbuser = 'root';
   $dbpass = 'password';
   $dbname = 'database_name';
?>

我知道我可以使用include访问这些变量然后使用它们,因为我使用任何其他变量但我想知道,我该如何更改这些变量值。我不是指$dbhost = "other_value";。我的意思是如何将新值保存到该文件中。我正在阅读有关php和文件打开/写入/关闭的内容,但我无法找到方法,如何放置自己并替换我想要的值。

我拥有的唯一信息是变量的名称,以及现在保存的值。我不确定在哪一行我能找到变量 - 如果这改变了什么。所以问题是,如何将(使用php)变量dbhost更改为用户将放入表单的任何其他内容。 (表单部分不是问题,假设用户值已保存到$_POST['uservalue']

提前致谢。

5 个答案:

答案 0 :(得分:8)

注意已添加04/2013:

这是一个坏主意。您不应该像这样修改配置文件。如果您具有可由用户管理的配置,则应将其存储在数据库中,或者在最坏的情况下,以通用文件格式(ini,XML等)存储。应用程序永远不应该修改存储数据库连接详细信息的配置文件,只能由管理员手动修改 - 因为文件是安全的并且这是一个非常罕见的事件非常重要。

对动态修改的文件调用include / require会遇到麻烦。


下面的原始答案

function change_config_file_settings ($filePath, $newSettings) {

    // Get a list of the variables in the scope before including the file
    $old = get_defined_vars();

    // Include the config file and get it's values
    include($filePath);

    // Get a list of the variables in the scope after including the file
    $new = get_defined_vars();

    // Find the difference - after this, $fileSettings contains only the variables
    // declared in the file
    $fileSettings = array_diff($new, $old);

    // Update $fileSettings with any new values
    $fileSettings = array_merge($fileSettings, $newSettings);

    // Build the new file as a string
    $newFileStr = "<?php\n\n";
    foreach ($fileSettings as $name => $val) {
        // Using var_export() allows you to set complex values such as arrays and also
        // ensures types will be correct
        $newFileStr .= "\${$name} = " . var_export($val, true) . ";\n";
    }
    // Closing ?> tag intentionally omitted, you can add one if you want

    // Write it back to the file
    file_put_contents($filePath, $newFileStr);

}

// Example usage:
// This will update $dbuser and $dbpass but leave everything else untouched

$newSettings = array(
    'dbuser' => 'someuser',
    'dbpass' => 'newpass',
);
change_config_file_settings('variables.php', $newSettings);

答案 1 :(得分:4)

例如,您有settings.php,并且已设置$your_variable='hi Mike';,您想将其更改为'hi Joshua'

<?php
$file='settings.php'; 

//read file
$content=file_get_contents($file);

// here goes your update
$content = preg_replace('/\$your_variable=\"(.*?)\";/', '$your_variable="hi Joshua";', $content);

//write file
file_put_contents($file);
?>

p.s.1)小心! ! !我不知道你为什么要这样做。你做的很危险!我还没有看到任何类似的编码。您可以很容易地被黑客入侵,因为有人可能会在PHP文件中编写一个变量,它将像函数一样执行并获取您的整个站点。

p.s.2)在保存之前不使用.php扩展名,而是使用其他内容(即“.txt”)和FILTER值!

p.s.3)使用MYSQL数据库,而不是写入文件。是的,这需要花费30分钟,但你会得到很多安全。

答案 2 :(得分:3)

也许您应该考虑将配置文件放在.ini文件中,如下所示:

dbhost = "localhost"
dbuser = "root"
dbpass = "password"
dbname = "database_name"

然后使用以下方法阅读文件:

$config = parse_ini_file( "/the/path/to/file.ini" );

然后您可以访问以下值:

connect_to_db( $config[ 'dbhost' ], $config[ 'dbuser' ] );

然后,您可以直接更改值,如:

$config[ 'dbhost' ] = 'new host';

然后你把文件写成:

$f = fopen( "/the/path/to/file.ini", "w" );
foreach ( $config as $name => $value )
{
    fwrite( $f, "$name = \"$value\"\n" );
}

fclose( $f );

请注意,如果值可能包含双引号,则在编写之前需要在循环中转义$value

$value = str_replace( '"', '\"', $value );

另外,请记住将.ini文件放在htdocs目录或任何其他可通过网页访问的目录之外,因为人们可以下载文件并查看其内容......

答案 3 :(得分:2)

我找不到更改这些值的任何理由。

我能想到的唯一理智的用例是从头开始创建这样的文件。

因此,您可以使用var_export()将正确转义的值准备好写入文件

答案 4 :(得分:1)

我成功了:

$file = 'file.php';
$content = file_get_contents($file);
$replacement = 'replace';
$content = preg_replace('/find/', $replacement, $content);
file_put_contents($file, $content);