Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Как заменить строку во всех файлах?
Kuzma92  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:





Всем здравия!
Есть у меня задача, во всех файлах одной определенной директории заменить строку на новую. Необходимо перебрать все файлы в директории, и в случае если строка, которую нужно заменить (именно строка целиком) в файле есть, то такую строку, целиком же, и заменить на новую.
Я пытаюсь сделать это таким способом:

$old_cat = $expl[1]; // это нужно заменить
$new_cat = $_POST['cat_red']; // заменить на это
$folder_rec = "db/rec"; // в этой директории

replace_txt($folder_rec , $old_cat , $new_cat);
function replace_txt($folder_rec , $old_cat , $new_cat) {
$dir_rec = opendir($folder_rec);
while(false !== ($file_rec = readdir($dir_rec))) {
if($file_rec != '.' && $file_rec != '..') {
$file_path_rec = ($folder_rec."/".$file_rec);
if(is_file($file_path_rec)) {
$file_rec_content = file_get_contents($file_path_rec);
$file_rec_content = str_replace($old_cat , $new_cat , $file_rec_content);
file_put_contents($file_path_rec , $file_rec_content);
}
}
}

closedir( $dir_rec );
}


Однако, замена не происходит, а вместо этого фатальная ошибка:
Fatal error: Uncaught Error: Call to undefined function replace_txt() in C:\Server\data\htdocs\school\control\cats.php:96 Stack trace: #0 {main} thrown in C:\Server\data\htdocs\school\control\cats.php on line 96

Уважаемые профи PHP, помогите мне пожалуйста сделать это правильно.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
don.bidon  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 54
Пользователь №: 46417
На форуме: 2 года, 23 дня
Карма:




ай, красава, привёл кусок кода с ошибкой из, мягко говоря, другого кода
скорее всего файл с описанием ф-ции replace_txt() не подключен или подключается после вызова ф-ции.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:




don.bidon, здравствуйте

Ошибка указывает на строку
replace_txt($folder_rec , $old_cat , $new_cat);

Если ее закомментировать, то ошибка исчезает. Но замены в файлах все равно не происходит.

Вот полный код того, как я пытаюсь это сделать:

if(isset($_POST['go_red']) && isset($_GET['red']) && array_key_exists($_GET['red'],$cat_id))
{
if($_POST['cat_red']!="")
{

$old_cat = $expl[1]; // это нужно заменить
$new_cat = $_POST['cat_red']; // заменить на это
$folder_rec = "db/rec"; // в этой директории

replace_txt($folder_rec , $old_cat , $new_cat);
function replace_txt($folder_rec , $old_cat , $new_cat) {
$dir_rec = opendir($folder_rec);
while(false !== ($file_rec = readdir($dir_rec))) {
if($file_rec != '.' && $file_rec != '..') {
$file_path_rec = ($folder_rec."/".$file_rec);
if(is_file($file_path_rec)) {
$file_rec_content = file_get_contents($file_path_rec);
$file_rec_content = str_replace($old_cat , $new_cat , $file_rec_content);
file_put_contents($file_path_rec , $file_rec_content);
}
}
}

closedir( $dir_rec );
}

echo "<meta http-equiv=refresh content='0; url=cats.php'>";
exit();
}
}


<form method="post">
<input
name=cat_red type=text value='$expl[1]'>
<button
name='go_red' type=submit value=Сохранить>Сохранить</button>
</form>


Все файлы находятся в директории db/rec, и эти файлы не имеют расширения, просто файлы.
Во всех этих файлах на второй строке прописано название категории, и соответственно категория может различаться. Так вот, если я меняю название категории, то мне необходимо в этой директории найти те файлы, в которых указана та категория, которую необходимо заменить.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Bezdna  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Мимо проходил
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1466
Пользователь №: 16492
На форуме: 16 лет, 2 месяца, 19 дней
Карма: 17




Kuzma92, ошибку, наверное, логично сначала прочитать, а потом предпринимать некие действия по её устранению, а не тупо комментить строку.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:




Bezdna, здравствуйте. Ну конечно. Только понимал бы я, как ее устранить.

Вот полный код файла:



$info="";
$cat_id=array();
$cat=file("db/cats.txt");
foreach($cat as $line)
{
$line=trim($line);
$expl=explode("*",$line);
$cat_id[$expl[0]]=$expl[1];
}

// Переименовываем категорию

if(isset($_POST['go_red']) && isset($_GET['red']) && array_key_exists($_GET['red'],$cat_id))
{
$_POST['cat_red']=trim($_POST['cat_red']);
$_POST['cat_red']=stripslashes($_POST['cat_red']);
$_POST['cat_red']=str_replace("*","",$_POST['cat_red']);
$red_cat = $_GET['red'];
$cat_red = preg_replace('/[^a-zA-Z0-9]/', '', $_POST['cat_red']);

if (file_exists("db/cat__$cat_red.txt")) {
$info="Такая категория уже существует!";
} else {

if($_POST['cat_red']!="")
{

//редактируем файл
$file=file("db/cats.txt");
$f=fopen("db/cats.txt","w");
foreach($file as $line)
{
$line=trim($line);
$expl=explode("*",$line);
if($_GET['red']==$expl[0])fwrite($f,$cat_red."*".$_POST['cat_red']."\r\n");
else fwrite($f,$line."\r\n");
}
fclose($f);

//переименовываем файл категории в директории
rename("db/cats/".$red_cat."" , "db/cats/".$cat_red."");

//переименовываем директорию
rename("db/cat__".$red_cat."" , "db/cat__".$cat_red."");

//переименовываем дополнительный файл
rename("db/cat__".$red_cat.".txt" , "db/cat__".$cat_red.".txt");


//меняем название категории во всех файлах в директории
$old_cat = $expl[1]; // это нужно заменить
$new_cat = $_POST['cat_red']; // заменить на это
$folder_rec = "db/rec"; // в этой директории

replace_txt($folder_rec , $old_cat , $new_cat); // -------------Ошибка указывает на эту строку

function replace_txt($folder_rec , $old_cat , $new_cat) {
$dir_rec = opendir($folder_rec);
while(false !== ($file_rec = readdir($dir_rec))) {
if($file_rec != '.' && $file_rec != '..') {
$file_path_rec = ($folder_rec."/".$file_rec);
if(is_file($file_path_rec)) {
$file_rec_content = file_get_contents($file_path_rec);
$file_rec_content = str_replace($old_cat , $new_cat , $file_rec_content);
file_put_contents($file_path_rec , $file_rec_content);
}
}
}

closedir( $dir_rec );
}


echo "<meta http-equiv=refresh content='0; url=cats.php'>";
exit();

}
}
}



echo "<form method=post>";
if($info!="")echo"<div class='admin__info'>$info</div>";

if(count($cat_id))
{
$file=file("db/cats.txt");
$n=0;
foreach($cat as $line)
{
$line=trim($line);
$expl=explode("*",$line);
$catname=rawurlencode($expl[1]);
if(!isset($_GET['red']) || !array_key_exists($_GET['red'],$cat_id) || $expl[0]!=@$_GET['red'])
echo "<div><p><b>$expl[1]</b></p></div>
<a class='admin__btn__red' href=cats.php?red=
$expl[0]>Редактировать</a>";
else
echo "<div><input id=cat_red name=cat_red type=text value='$expl[1]'></div>
<div><button name='go_red' type=submit value=Сохранить>Сохранить</button></div>"
;
$n++;
}
}

echo "</form>";

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2194
Пользователь №: 28976
На форуме: 13 лет, 7 месяцев, 20 дней
Карма: 152




вынесите функцию из условия
- в самый конец файла. Если она будет использоваться только в этом файле
- в отдельный файл и сделать "include_once 'replace_txt.php';" в начале файла.

P.S. Сделайте нормальное форматирование кода. Не понятно где какое условие начинается и заканчивается. По коду кстати тоже много вопросов.

Это сообщение отредактировал Kusss - 31.07.2024 - 09:30
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:




Kusss, здравствуйте.
Цитата (Kusss @ 31.07.2024 - 09:22)
вынесите функцию из условия
- в самый конец файла. Если она будет использоваться только в этом файле

Да, функцию вынес из условия, все работает.

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

Цитата (Kusss @ 31.07.2024 - 09:22)
Сделайте нормальное форматирование кода. Не понятно где какое условие начинается и заканчивается.

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

Цитата (Kusss @ 31.07.2024 - 09:22)
По коду кстати тоже много вопросов.

Хм... так то код полностью рабочий, все прекрасно работает, никаких ошибок или предупреждений не выдает, поэтому пока что не могу понять что не так с кодом. Но также буду очень благодарен, если укажете на мои ошибки.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
FatCat  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



חשב את עצמו
******

Профиль
Журнал
Группа: Администратор
Почтальон группы
Сообщений: 6963
Пользователь №: 1
На форуме: 19 лет, 1 месяц, 12 дней
Карма: 145




Цитата (Kuzma92 @ 31.07.2024 - 13:45)
Но мне нужно, чтобы замена происходила только второй строки.

Значит, разбить файл на массив строк, и заменять только во второй строке массива. Потом собрать обратно и перезаписать.


--------------------
Бесплатному сыру в дырки не заглядывают...
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Valick  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 6460
Пользователь №: 35718
На форуме: 12 лет, 4 месяца
Карма: 208




Цитата (Kuzma92 @ 31.07.2024 - 14:45)
Хм... так то код полностью рабочий, все прекрасно работает, никаких ошибок или предупреждений не выдает

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

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

Цитата (Kuzma92 @ 31.07.2024 - 14:45)
Подскажите, пожалуйста, что имеется ввиду? Комментирование имеется ввиду, или что-то другое?

Есть стандарты написания кода PSR.
Но лучше для написания кода использовать PhpStorm эта IDE сама подскажет как надо писать, а иногда даже и что надо писать.


--------------------
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kusss  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2194
Пользователь №: 28976
На форуме: 13 лет, 7 месяцев, 20 дней
Карма: 152




Цитата (Kuzma92 @ 31.07.2024 - 14:45)
Но у меня возник другой вопрос. Дело в том, что замена происходит во всем файле, где встречается то что необходимо заменить. Но мне нужно, чтобы замена происходила только второй строки.
Самостоятельно не удается справиться, прошу помощи.

Что-то я не догоняю. Можно как-то подробнее, и в какой части кода ?

Вот накидал примерно то, что должно быть в вашем коде.
Код на работоспособность не проверял, там больше логика и форматирование.
Совет, старайтесь давать переменным "говорящие" названия и оставляйте хоть минимум комментариев, чтобы было понятно.
К примеру переменную $cat из строки "$cat = file("db/cats.txt");" понятнее назвать к примеру "$file_from_txt" - "Список файлов из текстового файла"

<?php
Error_Reporting(E_ALL);
session_start();

$cat_id = array();
// ты считываешь данные из файла, и далее по коду делаешь тоже самое ещё 2 раза
// используй тот же массив и далее

$cat = file("db/cats.txt");
foreach($cat as $line)
{
$line = trim($line); // Зачем каждый раз удалять пробелы ? Если записываются пробелы, значит что-то не так
$expl = explode("*", $line);
$cat_id[ $expl[0] ] = $expl[1];
}

// ДО обработки данных проверим что выбрали правильную директорию.
if (isset($_GET['read']) AND array_key_exists($_GET['read'], $cat_id) === false)
{
$_SESSION['error'] = 'нет такой папки <b>'. strip_tags($_GET['read']) .'</b>';
header('Location: '. $_SERVER['HTTP_REFERER'] );
die();
}


// Переименовываем категорию
// После обработки формы лучше перезагрузить страницу, и не оставлять данные

if(isset($_POST['go_read'], $_GET['read']))
{

// Если дирректория пустая, не пускаем дальше
if ($_POST['cat_read'] == '')
{
$_SESSION['error'] = 'Папка не должна быть пустой';
header('Location: '. $_SERVER['HTTP_REFERER'] );
die();
}

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

// Наименование переменной может о многом сказать, назовите к примеру $get_read

$get_read = $_GET['read'];

$cat_read = trim($_POST['cat_read']);
$cat_read = stripslashes($cat_read);
$cat_read = str_replace("*","",$cat_read);
$cat_read = preg_replace('/[^a-zA-Z0-9]/', '', $cat_read);

if (file_exists('db/cat__'. $cat_read .'.txt'))
{
$_SESSION['error'] = "Такая категория уже существует!";
header('Location: '. $_SERVER['HTTP_REFERER'] );
die();
}


// С начала лучше переименовать файл/файлы, и убедившись что получилось менять текстовый файл

//переименовываем файл категории в директории

if (rename("db/cats/". $get_read , "db/cats/". $cat_read) === false)
{
$_SESSION['error'] = 'Серверная ошибка переименования файла <b>'. strip_tags($_POST['cat_read']) .'</b>';
header('Location: '. $_SERVER['HTTP_REFERER'] );
die();
}

//переименовываем директорию
rename("db/cat__".$get_read , "db/cat__".$cat_read);

//переименовываем дополнительный файл
rename("db/cat__".$get_read.".txt" , "db/cat__".$cat_read.".txt");

$change_cat = array(); // заменяемая строка

//редактируем файл

$file_write = fopen("db/cats.txt","w");
foreach($cat as $line)
{
$line = trim($line);
$expl = explode("*",$line);
if($get_read == $expl[0])
{
$change_cat = $expl;
fwrite($file_write, $cat_read ."*". $cat_read ."\r\n");
}
else
fwrite($file_write, $line ."\r\n");
}
fclose($file_write);

//меняем название категории во всех файлах в директории
$folder_rec = "db/rec"; // в этой директории
$old_cat = $change_cat[1]; // это нужно заменить
$new_cat = $cat_read; // заменить на это

replace_txt($folder_rec , $old_cat , $new_cat);

header('Location: '. $_SERVER['HTTP_REFERER'] );
die();

}

// Вывод ошибки
if(isset($_SESSION['error']) and !empty($_SESSION['error']))
echo '<div class="admin__info">'. $_SESSION['error'] .'</div>';

// удаление ошибки
unset($_SESSION['error']);


echo "<form method=post>";

if(count($cat_id))
{
foreach($cat as $line)
{
$line = trim($line);
$expl = explode("*", $line);
$catname = rawurlencode($expl[1]); // Не используется

if(!isset($_GET['read']) || !array_key_exists($_GET['read'],$cat_id) || $expl[0] != @$_GET['read'])
echo '
<div>
<p><b>'
. $expl[1] .'</b></p>
</div>
<a class="admin__btn__read" href="cats.php?read='
. $expl[0] .'">Редактировать</a>
'
;
else
echo '
<div>
<input id="cat_read" name="cat_read" type="text" value="'
. $expl[1] .'">
</div>
<div>
<button name="go_read" type="submit" value="Сохранить">Сохранить</button>
</div>
'
;
}
}

echo "</form>";






function replace_txt($folder_rec , $old_cat , $new_cat)
{
$dir_rec = opendir($folder_rec);
while(false !== ($file_rec = readdir($dir_rec)))
{
if($file_rec != '.' && $file_rec != '..')
{
$file_path_rec = ($folder_rec ."/". $file_rec);
if(is_file($file_path_rec))
{
$file_rec_content = file_get_contents($file_path_rec);
$file_rec_content = str_replace($old_cat , $new_cat , $file_rec_content);
file_put_contents($file_path_rec , $file_rec_content);
}
}
}

closedir( $dir_rec );
}
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Kuzma92  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Пользователь
**

Профиль
Группа: Пользователь
Сообщений: 81
Пользователь №: 46556
На форуме: 1 год, 13 дней
Карма:




Братцы, спасибо Вам за полезную для меня информацию. Всё просматриваю, изучаю. и пытаюсь понять. Не беру просто тупо копирую и забываю, нет. Всё мотаю, что называется, на ус. Мне с php предстоит еще много работы, поэтому все ваши ответы, комментарии и советы мне только на пользу. Особенно благодарен, когда тыкаете меня носом, если я где-то что-то сморозил чепуху. Ну... ни сразу Москва строилась =)
Kusss, отдельная благодарность вам за то. что разобрали мой код по частям и прокомментировали его, дав полезные советы, примеры. Смотрю, изучаю, стремлюсь быть лучше.

Всем Большое человеческое спасибо!
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса