Прежде чем вы закричите ORDER BY id
, ситуация совершенно иная.
Форум, который меня попросили создать, - это форум гостевой книги, на котором незарегистрированные пользователи могут отвечать и писать сообщения.Ответы к сообщению имеют отступ под сообщаемым сообщением.Конечно, это все в неупорядоченных списках.Краткий пример:
- Главное сообщение
- Еще один ответ на главную
- Aсообщение, которое не имеет ничего общего с ответами
Это похоже на то, как выглядит система комментариев Nettuts + .В базе данных у поста есть все очевидные вещи (идентификатор, тело сообщения, автор, время ...) и answerid.Ответ в основном означает, что это сообщение ответ.Если replyid равно 0, это основной пост (тема в обычном форуме означает.)
И вот как я обхожу отображение этих сообщений: сначала я вызываю функцию (назовем ее showPosts), которая имеет необязательныйparam называется replyid;по умолчанию 0.
В showPosts я получаю все сообщения с answerid, равным параметру из базы данных в ассоциативном массиве, и заполняю поле posts
в массиве результатами showPosts, и я передаюпоказатьPosts идентификатор сообщения.В конце showPosts я возвращаю этот ассоциативный массив.Если это было неясно, вот фрагмент:
function showPosts($postid = 0) {
$query = query("SELECT * FROM posts WHERE replyid='$postid'");
$r = array();
$i = 0;
while (@$row = $query->fetch_assoc()) {
$r[$i] = $row;
$r[$i]['posts'] = showPosts($row['id']);
++$i;
}
return $r;
}
Все работает отлично, как и ожидалось, но я озадачен этой проблемой: когда пользователь отвечает на старый пост, я хочу, чтобы этот пост показывался первым,как в ветках форума.
Я уже думал о создании в базе данных поля с именем lastChanged, и всякий раз, когда пользователь публикует новый ответ, он проходит всю цепочку постов и меняет каждый из них.их значения lastChanged ко времени публикации.Однако это казалось пустой тратой памяти и возможным убийцей времени.Я также думал о том, чтобы отделить основные темы от ответов, но это сделало бы вещи немного более сложными для ума, и мне нравится красота того, что нет никакой разницы между веткой и публикацией, поскольку все может быть веткой.или сообщение.
Точно так же, как вы знаете, база данных MySQL и серверная часть написаны на php (и, конечно, взаимодействуют с MySQL с использованием MySQLi.)
Заранее спасибо, и извините, если что-нибудьнеясно.
Редактировать: Структура базы данных, как и требовалось.
id | int(11)
title | varchar(100)
author | varchar(100)
body | text
replyid | int(11)
time | datetime