Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru FAQ (все вопросы) Общие вопросы Как в рнр прописать запись и/или удаление определённого текста в рнр файл

Как в рнр прописать запись и/или удаление определённого текста в рнр файл


     22.03.2014    Общие вопросы, Общие вопросы по PHP    1238

вопрос
Всем привет, подскажите пожалуйста как в рнр прописать внесение и/или удаление определённого текста в рнр файл??

Ответа пока нет


Комментарии пользователей (32)

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 10:48 - шашлычник

Гуглите php fopen.

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 11:58 - Юзер

dj-avtosh,
А как сделать что бы сначала происходил поиск текста и при его нахождении ниже вставлялся определённый текст??

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 12:02 - шашлычник

Получаем содержимое - заменяем через str_replace. Пишем новое содержимое.

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 12:28 - Юзер

dj-avtosh,
Извиняюсь за вопросик, но что я должен заменить??
мне нужно что бы установочный файл сам находил строки
case "stats" :
    include ENGINE_DIR . '/modules/stats.php';
break;


и ниже вставлял эти строки
case "music" :
    include ENGINE_DIR . '/modules/music/music.php';
break;

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 12:40 - шашлычник

Хитро. Стройте регулярное выражение.

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 12:45 - Юзер

Пожалуйста, если Вам не трудно, напишите пример.

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 13:02 - шашлычник

<?php

$file = file_get_contents ( 'engine.php' );


$newModule = <<<NEWMOD


    case "music" :
        include ENGINE_DIR . '/modules/music/music.php';
        break;
NEWMOD;

preg_match ( '#case.*?break;#is', $file, $out );

! empty ( $out[0] ) && $file = str_replace ( $out[0], $out[0] . $newModule, $file );


print_r($file);

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 13:13 - Юзер

dj-avtosh,
Большое спасибо!!!!!!

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 13:16 - шашлычник

Да мелочи, главное теперь аккуратно сделать fopen - что бы не потереть содержимое.

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 15:00 - Юзер

В общем все вроде работает, но есть проблема, новые данные записываются в самое начало файла, а не туда куда нужно :( вот мой код

<?php
@ini_set ('display_errors', false);
@ini_set ('html_errors', false);
define ('DATALIFEENGINE', true);
define ('ROOT_DIR', dirname (__FILE__));
define ('ENGINE_DIR', ROOT_DIR . '/engine');
include ROOT_DIR . 'engine/data/config.php';
$filename = $config['http_home_url'] . 'engine/engine.php';
$newmodule = <<<MUSIC


    case "music" :
        include ENGINE_DIR . '/modules/music/music.php';
    break;
MUSIC;
preg_match ( '#case.*?break;#is', $filename, $out );
!empty ( $out[0] ) && $filename = str_replace ( $out[0], $out[0] . $newModule, $filename );

$engine_file = fopen($filename, 'r+');
fwrite($engine_file, $newmodule);
fclose($engine_file);
?>

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 15:29 - шашлычник

А если подумать логично то надо сперва открыт файл. Потом его прогнать через str_replace, потом новое содержимое записать вместо старого. Вы мой код пытались хоть разобрать?

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 15:32 - шашлычник

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

skype: elhan.isaev

D0Gmatist
225

794 | 281

D0Gmatist - 23 марта 2014 15:52 - Местный

А зачем делать fopen .. для сохранения
file_put_contents ( "file.tmp", $name_radio, LOCK_EX );

описание
file_put_contents ( "путь к файлу с названием и расширением", "контент будущего файла", LOCK_EX );


а так же можно создать функцию с содержимым

1)
$buffer = @file_get_contents( "путь к файлу с названием и расширением" ); // получаем контент файла


2)
if ( $buffer !== false ) { // если файл есть
    $filedate = @filemtime( "путь к файлу с названием и расширением" ); // получение даты создания файла
    $filedate = time()-$file_date; // вычисление промежутка меду датой создания и реальным времинем
    if ( $filedate  > ( 60 * 60 * 24 ) ) { // 60 секунд * 60 минут * 24 часа = сутки
        $buffer = false; // убиваем переменную
        @unlink( "путь к файлу с названием и расширением" ); // удаляем файл
    }
}

if ($buffer == false) {
    file_put_contents ( "путь к файлу с названием и расширением", "контент будущего файла", LOCK_EX );
    $buffer = @file_get_contents( "путь к файлу с названием и расширением" );
} esle {
    $buffer = @file_get_contents( "путь к файлу с названием и расширением" );
}

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 15:53 - шашлычник

А тебе чуждо то что fopen умеет блокировать запись скриптам с другим id, на время выполнения текущего скрипта?

skype: elhan.isaev

D0Gmatist
225

794 | 281

D0Gmatist - 23 марта 2014 15:58 - Местный

ну я не встречал ещё такой потребности

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 16:03 - шашлычник

Да и разрабы дле не встречали потребности обезопасить или масштабировать))

skype: elhan.isaev

D0Gmatist
225

794 | 281

D0Gmatist - 23 марта 2014 16:35 - Местный

Ну себе я как то писал .. еле нашёл в архиве своих заготовок ))) вот такую хрень
обращение
arrayToFile($textarrayX , $namearray,  "адрес, имя и расширение для создаваемого файла");

функция
/* функции сохранения массива */
function arrayToFile($array, $arrayName, $filename = false, $file = false) {
    $level = 1;
    if($file == 0) {
      $level = 0;
      $file = fopen($filename, "w");
      if(!$file) {
        return false;
      }
      fwrite($file, "<" . "?\n\n");
      fwrite($file, "$" . $arrayName);
      fwrite($file, " = ");
    }

    $cnt = count($array);
    $i = 0;
    fwrite($file, "array(\n");
    foreach($array as $key => $value) {
      if($i++ != 0) {
        fwrite($file, ",\n");
      }
      if(is_array($array[$key])) {
        fwrite($file, "'$key' => ");
        arraytofile($array[$key], 0, $file);
      } else {
        $value = addcslashes($value, "'"."\\\\");
        fwrite($file, str_repeat(' ', ($level + 1) * 2) . "'$key' => '$value'");
      }
    }
    fwrite($file, "\n)");

    if($level == 0) {
      fwrite($file, ";\n\n?".">");
      fclose($file);
      return true;
    }
    
    chmod( $file, 0666 );

}

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

kricha
4

60 | 12

kricha - 23 марта 2014 16:54 - Юзер

Цитата: D0Gmatist
foreach($array as $key => $value) {
      if($i++ != 0) {
        fwrite($file, ",\n");
      }
      if(is_array($array[$key])) {
        fwrite($file, "'$key' => ");
        arraytofile($array[$key], 0, $file);
      } else {
        $value = addcslashes($value, "'"."\\\\");
        fwrite($file, str_repeat(' ', ($level + 1) * 2) . "'$key' => '$value'");
      }
    }

это лишнее.
http://www.php.net/manual/ru/function.var-export.php

D0Gmatist
225

794 | 281

D0Gmatist - 23 марта 2014 16:57 - Местный

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

да .. файл последний раз обновлён аж 17.10.2011

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

kricha
4

60 | 12

kricha - 23 марта 2014 17:03 - Юзер

для запиши var_export
для чтения инклуд.

ну и функция называется массив в файл...

D0Gmatist
225

794 | 281

D0Gmatist - 23 марта 2014 17:08 - Местный

Ну раньше было по сложнее .... )))
я ж говорю старая функция сейчас всё по другому делаю .. стараюсь всё на классы сажать

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 17:59 - шашлычник

Var_export'ом будете в файл писать?)

skype: elhan.isaev

D0Gmatist
225

794 | 281

D0Gmatist - 23 марта 2014 18:01 - Местный

к стати да .. мне интересно как он будет получать файл == FALSE

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

kricha
4

60 | 12

kricha - 23 марта 2014 18:26 - Юзер

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

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 18:52 - шашлычник

fopen плох тем, что оперативку выжирает, но для текущей задачи он вполне достаточен.

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 19:00 - Юзер

dj-avtosh,
Я сделал как Вы написали и только добавил запись в файл

$engine_file = fopen($filename, 'r+');
fwrite($engine_file, $newmodule);
fclose($engine_file);

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 19:03 - шашлычник

все не так :(

skype: elhan.isaev

dj-avtosh
39

1479 | 390

dj-avtosh - 23 марта 2014 19:05 - шашлычник



// Получим содержимое файла

$fileContent = file_get_contents ( 'engine.php' );


$newModule = <<<NEWMOD


    case "music" :
        include ENGINE_DIR . '/modules/music/music.php';
        break;
NEWMOD;

preg_match ( '#case.*?break;#is', $file, $out );

// Сделаем замену в содержимом
! empty ( $out[0] ) && $fileContent = str_replace ( $out[0], $out[0] . $newModule, $fileContent );

// Мы получили уже измененный файл, запишем его

$engine_file = fopen($filename, 'r+');
fwrite($engine_file, $fileContent);
fclose($engine_file);



Можно короче сделать, но за вас не буду делать. Читайте внимательно код!

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 23 марта 2014 20:44 - Юзер

Все равно не работает :(

dj-avtosh
39

1479 | 390

dj-avtosh - 24 марта 2014 01:41 - шашлычник

Не может не работать. Если совсем 0 - тотна заказ напишу уже за доллары.

skype: elhan.isaev

pavel31
4

340 | 158

pavel31 - 24 марта 2014 21:50 - Юзер

Не работает из-за этой функции file_get_contents
Работает только так:
$fileContent = ROOT_DIR . '/engine/engine.php';

А вот так не хочет работать :(
$fileContent = file_get_contents(ROOT_DIR . '/engine/engine.php');

pavel31
4

340 | 158

pavel31 - 24 марта 2014 22:19 - Юзер

dj-avtosh,
Добавь меня в аську пожалуйста - 223-203-508

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

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