How to change specific contents in the script of a //PHP file

Asked

Viewed 424 times

0

I wonder if someone has or can get me some script to change contents of a PHP file in specific lines without changing the others, it may be fopen, fwrite and fclose.

Actually want, along with data captured in form, alter some define.

inserir a descrição da imagem aqui

The input[name='url_site'] would change the line define('WFOX_SITE_URL', 'http://127.0.0.1/wfox');

The input[name='theme_site'] would change the line define('WFOX_SITE_THEME', WFOX_SITE_DIR . '/v1');

The input[name='name_site'] would change the line define('WFOX_SITE_NAME', 'Meu Projeto');

Full script [define_log.php]:

error_reporting(0);
session_start();
$user_id = $_SESSION['user_id'];
date_default_timezone_set('America/Fortaleza');

ini_set('default_charset', 'utf-8');

define('WFOX_BASE_DIR', __DIR__);
define('WFOX_SITE_DIR', WFOX_BASE_DIR . '/wfox-content');
define('WFOX_ADMIN_DIR', WFOX_BASE_DIR . '/wfox-admin');

define('WFOX_SITE_URL', 'http://127.0.0.1/wfox');
define('WFOX_SITE_ADM', WFOX_SITE_URL . '/wfox-admin');
define('WFOX_SITE_THEME', WFOX_SITE_DIR . '/v1');
define('WFOX_SITE_NAME', 'Meu Projeto');

include( WFOX_ADMIN_DIR . '/database/conn.php');
include( WFOX_ADMIN_DIR . '/api/wfox_bd_api.php');
include( WFOX_ADMIN_DIR . '/api/wfox_bd_post.php');
include( WFOX_ADMIN_DIR . '/api/wfox_bd_user.php');
include( WFOX_ADMIN_DIR . '/api/wfox_bd_upload.php');
include( WFOX_ADMIN_DIR . '/api/wfox_stats_chart.php');
  • Just an idea: file_get_contents , explode PHP_EOL, will have an array with all lines, foreach going through this array and checking if there are the names of the constants that you want to modify. If it exists, rewrite the line by mounting a new constant define with the new value. Merge a string with everything and save the file.

1 answer

1


Note that there are several ways to solve.

In the example below, I opted for something that was not invasive, modifying the current structure or business model.

I just suggest modifying the pattern of form parameter names.

It is easier to define names identical to the constants.

Otherwise, you will have to create an array that relates such data, which makes the script only slightly larger and redundant.

<?php

/*
Dummy data.
Seria os dados do $_POST.
*/
$post['WFOX_ADMIN_DIR'] = '/outro-admin'; // simulação
$post['WFOX_SITE_URL'] = 'http://localhost'; // simulação
$post['WFOX_SITE_THEME'] = '/v2'; // simulação

/*
O path do arquivo. Recomendado usar paths absolutos.
*/
$file = __DIR__.'/a.php';

/*
Lê os resultdos, armazenando-os num array.
*/
$data = file($file);

/*
Contador da linha atual do arquivo aberto.
É usado para otimizar a leitura, evitando fazer loops inteiros para cada parâmetro.
*/
$line = 0;

/*
Quantidade de linhas do arquivo aberto
*/
$size = count($data);

/*
Itera os dados requisitados via $_POST
*/
foreach ($post as $k => $v) {
    /*
    Itera as linhas do arquivo aberto.
    É importante que a ordem dos parâmetros no post tenham a mesma ordem das linhas do arquivo.
    Caso contrário, essa rotina torna-se ineficiente.
    A vantagem aqui é otimizar, evitando fazer leitura completa do array em todas as iterações.
    Aqui, a linha continua a partir de onde parou o anterior encontrado.
    */
    while ($line < $size) {
        /*
        Procura a ocorrência da string na linha corrente
        */
        if (strstr($data[$line], '\''.$k.'\'') !== false) {
            /*
            Encontrou o padrão.
            Aplica um explode() para obter o terceiro índice que é onde encontra-se o valor que deseja alterar.
            */
            $arr = explode('\'', $data[$line]);
            $arr[3] = $v;

            /*
            Remonta a linha já com o novo valor.
            */
            $data[$line] = implode('\'', $arr);

            /*
            Interrompe o fluxo desse laço de repetição (while) e vai para o próximo do (foreach)
            */
            break;
        }
        $line++;
    }
}

/*
Salva uma cópia do conteúdo corrente.
Recomendado sempre salvar uma cópia para evitar transtornos.
Não é obrigatório. Crie a sua própria política de trabalho sobre o gerenciamento de versões.
*/
copy($file, $file.'-'.date('YmdHis'));

/*
Salva os dados modificados.
*/
file_put_contents($file, implode('', $data));

Read the comments to understand each stretch of the flow.

  • uahsuhas had done something very similar, but the laziness of so great that does not conclude... kkk VLW BROW

Browser other questions tagged

You are not signed in. Login or sign up in order to post.