Задать вопрос
@arturka_v_10

Как заменить переменные внутри класса через перезапись файла?

Привет, возникла специфичная для меня задача и решение ее через одно место.

В Общем есть такой вот файл cfg_test.php:
<?
class config {

	# Настройки сайта
	public $start_time = '1670000999';
	public $email = 'support@domain.zone'; // Почта

	# Админка 
	public $adm_dir = 'FolderAdm'; // Директория
	public $adm_name = 'Admin'; // Логин
	public $adm_pass = '00000000'; // 
  
}
?>


С прочтением и выводом формы проблем не возникло:
$configFile = './core/cfg_test.php';
$configContent = file_get_contents($configFile);
function FindAndConvert($var){
    // search in $var "public $1 = '$2';"
    preg_match_all('/public \$(\w+) = \'([^\']+)\'\;/', $var, $matches, PREG_SET_ORDER);
    
    // create & add Arr
    $foundPublicVar = [];
    foreach ($matches as $match) {
        $foundPublicVar[$match[1]] = $match[2];
    }
    return $foundPublicVar;
}

// Результат
$findFu = FindAndConvert($configContent);
//print_r($findFu); // Array ( [start_time] => 1670000999 [email] => support@domain.zone [adm_dir] => FolderAdm [adm_name] => Admin [adm_pass] => 00000000 )


вывод формы:
<form action="" method="post" class="m-0">
<?
foreach ($findFu as $row => $value) {
    echo '<input class="form-control mb-2" type="text" name="'.$row.'" placeholder="'.$row.'" value="'.$value.'" />';
}
?>
<button type="submit" name="savenewcfg" class="btn btn-success">Сохранить</button>
</form>


Однако имею проблему с записью обратно новых значений. Очевидно что лучшим решением было писать массив в другой файл, а в классе его читать, или же вовсе вместо отдельных полей предоставить вариант редактировать как в блокноте, но не дает покоя именно такой вариант.

Пробовал так:
<?
if (isset($_POST['savenewcfg'])) {

    // del butt [name]
	foreach ($_REQUEST as $rowArr) {
        unset($_REQUEST['savenewcfg']);
    }

    $newArrF = array();
    
    $conT = $configContent;
    foreach ($_REQUEST as $row => $value) {

        $str_r = "public \$".$row."= ";
        $str_r = $str_r."'".$value."';";
        //echo "<br>".$str_r;
        $fileContents = preg_replace('/public \$(\w+) = \'([^\']+)\'\;/', $str_r, $conT);
        echo json_encode($fileContents, true);
        file_put_contents($configFile, $fileContents);
    }
    
    //print_r($_REQUEST);
}


но меняет все строки на последнее совпадение:
class config {

	# Настройки сайта
	public $adm_pass= '00000000';
	public $adm_pass= '00000000'; // Почта

	# Админка 
	public $adm_pass= '00000000'; // Директория
	public $adm_pass= '00000000'; // Логин
	public $adm_pass= '00000000'; //
  
}


Подскажите в чем косячу
  • Вопрос задан
  • 96 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
В виду того что видимо на почве работы с битриксом у ТС появились серьезные проблемы со здравым смыслом - минутка готовых решений:
<?php
class config {
	public $start_time = '1670000999';
	public $email = 'support@domain.zone'; 
	public $adm_dir = 'FolderAdm'; 
	public $adm_name = 'Admin'; 
	public $adm_pass = '00000000'; 
  }
$configFile = './core/cfg_test.php'; //доступность файла оставим на совести автора вопроса
$cfg = new config();?>
<form method="post">
<?php 
foreach ($cfg as $key=>$value) {?>
	<input name="<?=$key?>" value="<?=$value?>">
<?php }?>
<button type="submit">do marasm</button>
</form>
<?php
if($_SERVER['REQUEST_METHOD']=="POST"){
	$new_cfg = (Object)$_POST;
        file_put_contents($configFile, var_export($new_cfg,1));
}
?>
Ответ написан
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
<?php
if (isset($_POST['savenewcfg'])) {

    $template = '<?php
class config {
    {{CONTENT}}
}';

    $content = '';
    foreach ($_REQUEST as $key => $value) {
        if($key === 'savenewcfg') {
            continue;
        }

        $content .= 'public $'.$key.' = \''.str_replace("'", "\'", $value).'\'; '."\n";
    }

    file_put_contents(
        $configFile,
        str_replace('{{CONTENT}}', $content, $template)
    );
}
Ответ написан
@arturka_v_10 Автор вопроса
Я упертый, мне нужно было решить в том ключе что я предполагал и оно сработало.

if (isset($_POST['savenewcfg'])) {

// del token & butt [name]
foreach ($_REQUEST as $rowArr) {
    unset($_REQUEST['token']);
    unset($_REQUEST['savenewcfg']);
}
//print_r($_REQUEST);
//$newArrF = array();

$replacements = array(); // Создаем пустой массив для замен
$fileContents = $configContent; // сохраняем оригинальный контент

foreach ($_REQUEST as $key => $value) {
 // Формируем строку замены и добавляем ее в массив замен
 $replacement = "public \$$key = '$value';";
 $replacements[] = $replacement;
 echo 'key ='.$key.' value='.$value; echo "<br>";
 $fileContents = preg_replace('/public \$('.$key.') = \'([^\']+)\'\;/', $replacement, $fileContents);  // Теперь применяем замены
 echo json_encode($fileContents, true);
}
// Записываем измененный контент обратно в файл
file_put_contents($configFile, $fileContents);

}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@SidVisceos
Ваш подход мне в принципе не нравится. Я бы подумал что с сериализацией переменной перед сохранением. Вдруг в переменной передастся что то типа:“ '; rmdir(../..);”
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы