[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с перезаписью файла.
CaypoH
Итак, идея такова:
человек, через кой какой интерфейс (ну слава богу хоть с созданием оного у меня проблем не возникает) добавляет в текстовый файл некие строчки. А именно команды iptables. каждая строчка - отдельная команда. Добавления идёт в конец файла (a+).
стал писать функцию удаления команд из файла. к примеру нужно удалить правило блокировки доступа к сайту вконтакте. удаление пытаюсь организовать следующим путём: определяется переменная $_GET['del'], где каждое её значение соответствует строчке в файле (например /?del=1 - вторая строка файла, ?del=10 - одиннадцатая. при del=0 ничего не происходит, чтобы ненароком не удалить обязательную строчку #!/bin/sh).
реализовать пытаюсь так: сначала считываем всё из файла, и заносим в массив. проверяем, если строка подпадает под удаление, то элементу массива присваиваем null. потом все ненулевые элементы массива записываем в тот же файл.
это теория. на практике мои жалкие потуги реализовать это выглядят так:


/*
* Считываем информацию из файла.
* Заносим каждую строку в массив $result
*/

$filename = "/home/caypoh/www/test.php";
$handle = fopen($filename, "r");
$contents = file_get_contents($filename);
fclose($handle);
$result = explode("\n", $contents);

/*
* А вот здесь попытка удаления ненужной строки из файла.
*/

if($_GET['del'])
{
$result[$_GET['del']] = NULL;
$fp = fopen($filename, "r+");
flock($fp, LOCK_EX);
for($i=0; $i<count($result)-1; $i++)
if ($result[$i])
{
$line = $result[$i]."\n";
fwrite($fp, $line);
}
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
}


Однако получается ерунда. Первые строчки нормально сохраняются, но в конце последняя либо предпоследняя строка (так и не понял пока от чего это зависит) выходит с обрезанным первым символом. Некоторые строки копируются. Вобщем в файле начинается каша. Пробовал делать по другому. Считывать из основного файла, потом создавать временный, записывать результат после удаления строки в него, а потом через copy() заменять исходный файл временным. Если в цикле перед fwrite() поставить вывод print $line то можно увидеть что выводится именно то, что и должно быть записано. Т.е. в выводе всё правильно. Однако записывается всё почему то с вышеописанными проблемами.
Хелп ми плиз =)



Спустя 1 час, 54 секунды (23.12.2009 - 11:21) VolCh написал(а):

$filename = "/home/caypoh/www/test.php";
if($_GET['del'])
{
$del = intval($_GET['del']); // на всякий случай smile.gif
$contents = file_get_contents($filename); // fopen не нужно
$result = explode("\n", $contents); // разбираем
unset($result[$del]); // УДАЛЯЕМ строку
$contents = implode("\n", $result); // собираем назад
file_put_contents($filename, $contents, LOCK_EX); // записываем назад с блокировкой
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.