Изменить значение переменной, сохраненное в file.php - PullRequest
3 голосов
/ 02 марта 2012

Я получил файл с именем variables.php

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

Я знаю, что могу получить доступ к этим переменным, используя include, а затем использовать их, как и любую другую переменную, но я хочу знать, как я могу изменить значения этих переменных. И я не имею в виду $dbhost = "other_value";. Я имею в виду, как я могу сохранить новое значение в этот файл. Я читал о php и открытии / записи / закрытии файлов, но я не могу найти способ, как разместить себя и заменить значение, которое я хочу.

Единственная информация, которая у меня есть, это имя переменной и значение, сохраненное в ней прямо сейчас. Я не уверен, в какой строке я могу найти эту переменную - если это что-то меняет. Поэтому вопрос в том, как изменить (используя php) переменную dbhost на что-либо еще, что пользователь введет в форму. (часть формы не проблема, допустим, пользовательское значение было сохранено в $_POST['uservalue'])

Заранее спасибо.

Ответы [ 5 ]

8 голосов
/ 02 марта 2012

ПРИМЕЧАНИЕ Добавлено 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);
4 голосов
/ 23 мая 2013

например , у вас есть 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);
?>

ps1) БУДЬТЕ ОСТОРОЖНЫ!!!Я не знаю, почему вы делаете этот метод.Вы делаете очень опасную вещь!Я не видел ничего подобного.Вы можете легко быть взломаны, потому что кто-то может написать переменную в файле PHP, которая будет выполняться как функция и ПОЛУЧИТ ВАШ ВЕСЬ САЙТ.иначе (то есть '.txt') и значения FILTER перед сохранением!

ps3) Использовать базу данных MYSQL вместо записи в файл.Да, для этого нужно потратить 30 минут больше, но вы получите большую безопасность.

3 голосов
/ 02 марта 2012

Возможно, вам следует рассмотреть возможность размещения файла конфигурации в файле .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или любой другой каталог, доступный через Интернет, так как люди смогут скачать файл и увидеть его содержимое ...

2 голосов
/ 02 марта 2012

Я не могу найти причину для изменения этих значений.

Единственный разумный вариант использования, о котором я могу подумать, это создание такого файла с нуля.

Таким образом, вы можете использовать var_export(), чтобы правильно экранировать значения, готовые для записи в файл

1 голос
/ 06 ноября 2013

Я добиваюсь этого:

$file = 'file.php';
$content = file_get_contents($file);
$replacement = 'replace';
$content = preg_replace('/find/', $replacement, $content);
file_put_contents($file, $content);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...