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

  • Автор темы Автор темы LORDER
  • Дата начала Дата начала

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; 
?>
 
Писать за тебя этот бессмысленный код кто-то будет вряд ли. Это твое обучение, а не мое, к примеру.

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

п.с. я не жду готового ответа - жду толчок на правильный путь.)
 
Код сейчас не помню, но я делал это при записи, когда блок ставил. Мне подсказали это на одном форуме, но до конца так и не смог довесьти.
Может объясните логику, чтоб я знал что читать надо.
 
LORDER, каждый раз при добавлении читаешь файл в память, потом его перезаписываешь последними 10-ю новостями. вот и вся логика.
 
Ну попробуй еще раз.
Что надо сделать, чтобы записать новости в файл заново? Какие есть режимы у 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:

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