Новостной скрипт на файлах

LORDER

Новичок
Новостной скрипт на файлах

Привет. Написал новостной скрипт, все устраивает, кроме одной детали. Нужно сделать, чтобы после 10 (не обязательно) добавленных новостей, самый старый стирался. Жду от вас помощи.

Обрабатывает новости:

PHP:
 <?
$date=date('H:i'); 

$handle = fopen ("news.txt", "ab"); 

$handle2 = fopen ("archives.txt", "ab");

$title = trim( $_POST['title']); 

$body = trim( $_POST['body']); 

$body = str_replace("\r\n", '<br>', $body);


echo "Спасибо, новость доавлена в базу данных. <a href='add.php'><br> Добавить </a>";

$text = "<table width='100%'><td bgcolor='#dfdfdf'><b><font color='black'>$date</font></b> <font color='black'>$title</font></td></table>$body";
if ( fwrite ( $handle,$text . "\n") == TRUE)
if ( fwrite ( $handle2,$text . "\n") == TRUE)

fclose ($handle);
fclose ($handle2);

?>
Выводит новости:
PHP:
<?php
$lines = file('news.txt');
$result = array_reverse($lines);
foreach ($result as $line) 
echo $line; 
?>
 

Фанат

oncle terrible
Команда форума
Писать за тебя этот бессмысленный код кто-то будет вряд ли. Это твое обучение, а не мое, к примеру.

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

LORDER

Новичок
Пробовал не получается.

п.с. я не жду готового ответа - жду толчок на правильный путь.)
 

LORDER

Новичок
Код сейчас не помню, но я делал это при записи, когда блок ставил. Мне подсказали это на одном форуме, но до конца так и не смог довесьти.
Может объясните логику, чтоб я знал что читать надо.
 

dimagolov

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

Фанат

oncle terrible
Команда форума
Ну попробуй еще раз.
Что надо сделать, чтобы записать новости в файл заново? Какие есть режимы у Fopen? Какой подойдет тебе?
 

Вурдалак

Продвинутый новичок
Если бы была чисто учебная задача реализации гостевой книги с использованием файла в качестве хранилища сообщений, то я бы, во-первых, опеределил какой-то формат хранения сообщений (скажем, username:message), во-вторых, хранил бы все записи гостевой книги с фиксированным размером, чтобы скорость чтения не зависила от количества сообщений.

Первый пункт ещё требует какого-то механизма экранирования, чтобы в имени пользователя и сообщении допускался символ-разделитель ":".

Процесс затирания старых сообщений был бы прост (режим "ab+"): читаем 2-ое сообщение и записываем его на место первого, читаем 3-е и записываем на место второго и т.п.

-~{}~ 16.03.10 16:38:

Для всего этого требуются свои функции экранирования/разбора записи, fopen(), fwrite(), fseek(), fread(), ftruncate()

-~{}~ 16.03.10 16:38:

fclose() :)

-~{}~ 16.03.10 16:39:

Ну и блокировку желательно не забыть
 

С.

Продвинутый новичок
Первый пункт ещё требует какого-то механизма экранирования, чтобы в имени пользователя и сообщении допускался символ-разделитель ":".
Дальновидное замечание. Только кроме символа ":" существуют другие символы (и группы символов), вероятность появления которых в тексте настолько мала, что этим можно пренебречь.
Ну и блокировку желательно не забыть
Тоже дальновидно. Только от кого блокироваться? Десять новостей и десять вбивальщиков новостей?
 

Духовность™

Продвинутый новичок
Дальновидное замечание. Только кроме символа ":" существуют другие символы (и группы символов), вероятность появления которых в тексте настолько мала, что этим можно пренебречь.
не пренебречь, а заменять на пробел, например. Я в свое время написал двиг на файлах, у меня был разделитель |, который разделял элементы данных. Приходилось из POST-а его вырезать. А всего-навсего нужно было разделять данные символом табуляции, а в тексте пользователя заменять на пробел.
 

Вурдалак

Продвинутый новичок
Автор оригинала: С.
Только кроме символа ":" существуют другие символы (и группы символов), вероятность появления которых в тексте настолько мала, что этим можно пренебречь.
— я считаю очень вредными подобные подходы, да ещё и в учебных задачах.

-~{}~ 16.03.10 18:24:

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

С.

Продвинутый новичок
— я считаю очень вредными подобные подходы, да ещё и в учебных задачах.
Чел не осознает ни алгоритма своей задачи, ни как ему данные хранить, но уже знает, что разделители надо экранировать (при фиксированной длине записи!) и блокировать там что-то. Хорошие методисты над ним поработали однако. Живого места не оставили.
 

Фанат

oncle terrible
Команда форума
dimagolov, ну, я думаю, это было в контексте вашей дискуссии, а не его вопроса
 
Сверху