Вот нашёл-таки ещё одного таракана
Как оно выглядит:
Есть сообщение от
21.08.2005 Вс, 00:35
в нему спустя
6 дней 12 часов 9 минут 20 секунд добавлено ещё.
В этом же форуме (в другой теме) есть сообщение от
21.08.2005 Вс, 15:58
Обращаю внимание: первое сообщение с добавкой новее второго.
Далее,
28.08.2005 создаётся ещё одно сообщение в этом форуме (в другой, уже третьей теме, которая и до этого существовала). Затем оно удаляется.
В итоге на главной странице в этом форуме показывается самое новое сообщение -- второе (от
21.08.2005 Вс, 15:58), а в списке тем этого форума всё правильно -- первое (от
21.08.2005 Вс, 00:35 с добавкой). А должно на главной странице отображаться первое (
21.08.2005 Вс, 00:35 с добавкой) сообщение, как самое новое -- так и было до начала описанных манипуляций.
Как оно работает (IMHO)
При удалении сообщения вызывается функция
update_post_stats() (includes/functions_post.php).
В ней (ещё не понял где именно) ищется самый свежий пост (last_post_id), но не по времени, а по номеру (post_id).
А надо бы по времени (post_time).
Я пока своими кривыми руками не полезу, а подумаю...
Добавлено спустя 24 минуты 56 секунд:
Скорее всего здесь:
Код: Выделить всё
if ($post_data['last_topic'])
{
$sql = "SELECT MAX(post_id) AS last_post_id
FROM " . POSTS_TABLE . "
WHERE forum_id = $forum_id";
if (!($result = $db->sql_query($sql)))
{
message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
}
if ($row = $db->sql_fetchrow($result))
{
$forum_update_sql .= ($row['last_post_id']) ? ', forum_last_post_id = ' . $row['last_post_id'] : ', forum_last_post_id = 0';
}
}
Добавлено спустя 18 минут 17 секунд:
А вот и решение предлагаю:
заменить
Код: Выделить всё
$sql = "SELECT MAX(post_id) AS last_post_id
FROM " . POSTS_TABLE . "
WHERE forum_id = $forum_id";
на
Код: Выделить всё
$sql = "SELECT post_id AS last_post_id
FROM " . POSTS_TABLE . "
WHERE forum_id = $forum_id
ORDER BY post_time DESC
LIMIT 1";
Чуть выше (для тем) такой ошибки быть не должно, т.к. последний пост в теме является последним и по времени, и по номеру:
Код: Выделить всё
$topic_update_sql .= 'topic_replies = topic_replies - 1';
$sql = "SELECT MAX(post_id) AS last_post_id
FROM " . POSTS_TABLE . "
WHERE topic_id = $topic_id";
if (!($result = $db->sql_query($sql)))
{
message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
}
if ($row = $db->sql_fetchrow($result))
{
$topic_update_sql .= ', topic_last_post_id = ' . $row['last_post_id'];
}
Добавлено спустя 1 час 36 секунд:
А вот теперь осмысленно: самое свежее сообщение в форуме (№ forum_id) может иметь не самый верхний номер, так как Advanced Posts Merging, "подпинывая" время сообщения, оставляет его номер неизменным, а
до момента объединения в том же самом форуме, но в другой его теме, может появиться новое сообщение с б
ольшим номером. Функция update_post_stats() всегда считает, что самое свежее сообщение в форуме имеет наибольший номер, и в этом её надо разубедить.
А самое свежее сообщение в теме (№ topic_id) всегда имеет самый высокий номер, даже при слиянии.
Добавлено спустя 9 часов 19 минут 44 секунды:
Ещё момент -- файл includes/functions_admin.php
Заменить:
Код: Выделить всё
case 'forum':
$sql = "SELECT MAX(post_id) AS last_post, COUNT(post_id) AS total
FROM " . POSTS_TABLE . "
WHERE forum_id = $id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not get post ID', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
$last_post = ( $row['last_post'] ) ? $row['last_post'] : 0;
$total_posts = ($row['total']) ? $row['total'] : 0;
}
else
{
$last_post = 0;
$total_posts = 0;
}
На:
Код: Выделить всё
case 'forum':
$sql = "SELECT post_id AS last_post
FROM " . POSTS_TABLE . "
WHERE forum_id = $id
ORDER BY post_time DESC
LIMIT 1";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not get post ID', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
$last_post = ( $row['last_post'] ) ? $row['last_post'] : 0;
}
else
{
$last_post = 0;
}
$sql = "SELECT COUNT(post_id) AS total
FROM " . POSTS_TABLE . "
WHERE forum_id = $id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not get total posts', '', __LINE__, __FILE__, $sql);
}
if ( $row = $db->sql_fetchrow($result) )
{
$total_posts = ($row['total']) ? $row['total'] : 0;
}
else
{
$total_posts = 0;
}
Добавлено спустя 1 минуту 56 секунд:
Я не в курсе, может и одним запросом можно обойтись -- у меня не получилось, но эта функция используется редко, но она полезная -- синхронизация форумов.