Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Перезапись PHP-файла


Автор: Burrr 6.8.2009, 20:45
Проблема следующая. В CMS есть файл config.php, который содержит переменные для подключения к базе данных. Допустим такие:
Код
$db_host = "localhost";
$db_user = "user";
$db_password = "123456";
$db_name = "testdb";


Когда пользователь устанавливает CMS на хостинг, он вписывает в конфиг свои параметры подключения к базе (а также еще пару настроек). Делать это приходится руками, что конечному пользователю неудобно.

Появилась идея написать простой мастер установки, где юзер сможет вбить необходимые параметры в текстовые поля формы. После этого нужно будет записать введенные данные в config.php. Это вызывает ряд вопросов:
1) Как лучше всего осуществить перезапись? file_put_contents подойдет?
2) Могут ли быть конфликты при перезаписи PHP-файла? Как их можно избежать?
3) Что вообще посоветуете для красивого решения этой задачи?

Автор: SneG0K 6.8.2009, 21:50
Burrr, а может лучше на XML? Это еще легче будет.

Автор: Burrr 6.8.2009, 22:01
SneG0K, к сожалению не имею опыта работы с XML из PHP. Посоветуете пару простых примеров для быстрого старта?

Автор: SneG0K 6.8.2009, 23:05
Burrr, simpleXML. Рядом http://forum.vingrad.ru/forum/topic-268762/10.html тема. Тоже не имея опыта быстро понял суть.

Автор: bars80080 7.8.2009, 13:48
ну, проще всего сделать через шаблон

есть такой файлик:

Код

$db_host = "{HOST}";
$db_user = "{USER}";
$db_password = "{PASS}";
$db_name = "{DB}";


при приёме от пользователя данных из формы просто считываем шаблон и заменяем в нём значения:

Код

// обработка данных формы...

// ...

// считывание шаблона
$fp = fopen('temp.txt', 'r');
$s = fread($fp, 4096);
fclose($fp);

// вставка данных в шаблон
$ar1 = array('{HOST}','{USER}','{PASS}','{DB}');
$ar2 = array($_POST['host'], $_POST['user'], $_POST['pass'], $_POST['db']);
$result = str_replace($ar1, $ar2, $s);

// запись конфига
$fp = fopen('config.php', 'w');
fwrite($fp, $result);
fclose($fp);

Автор: enof 7.8.2009, 14:26
bars80080, а если потом нужно будет изменить значения?
Код

<pre><?php
$file = file_get_contents("config.php");
preg_match_all('#\$(.*)\s*=\s*"(.*)";#Ui', $file, $out, PREG_SET_ORDER);
print_r($out);      //Список переменных
$file = preg_replace('#(\$db_host\s*=\s*")(.*)(";)#Ui', "\\1new_value\\3", $file); //Замена значения $db_host на new_value
file_put_contents("config.php", $file);
?>

Автор: Burrr 7.8.2009, 15:10
bars80080, enof, 
Спасибо! С этим кодом всё понятно.
А конфликта не будет, при одновременном обращении к файлу и попыткой его перезаписи?

Автор: bars80080 7.8.2009, 15:14
Цитата(enof @  7.8.2009,  14:26 Найти цитируемый пост)
а если потом нужно будет изменить значения?

а что мешает повторить процедуру?


Цитата(Burrr @  7.8.2009,  15:10 Найти цитируемый пост)
А конфликта не будет, при одновременном обращении к файлу и попыткой его перезаписи?

ну, смотря насколько большой трафик посетителей сайта предполагается. в общем случае даже не стоит и заморачиваться, если у одного пользователя выскочит ошибка, то сразу перезагрузившись он окажется где надо. если очень надо, то есть методы блокировки
http://www.php.ru/manual/function.flock.html

Автор: enof 7.8.2009, 15:20
bars80080,  сорри, не заметил, что шаблон в другом файле находится.

Автор: Burrr 7.8.2009, 16:54
enof, bars80080, спасибо вам! 
Держите плюсы в репу smile

Топик - клоц.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)