Логика поиска страницы топика по номеру поста
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
Логика поиска страницы топика по номеру поста
Меня интересует логика поиска страницы топикы по номеру поста.
Пример: Получаю номер поста, ищу по таблице постов
Получаю id форума и топика, а вот как вычислить номер страницы в с соответствии с posts_per_page не знаю.
Помогите, люди добрые.
Пример: Получаю номер поста, ищу по таблице постов
Получаю id форума и топика, а вот как вычислить номер страницы в с соответствии с posts_per_page не знаю.
Помогите, люди добрые.
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев
ну, а заглянуть в код было не дано?
для объяснения значения $forum_topic_data['prev_posts'] разбирайте запрос
это из viewtopic.php... коли уж догадались как выбрать все, кроме данных нюансов, то этот код разберете...
Код: Выделить всё
$start = floor(($forum_topic_data['prev_posts'] - 1) / intval($board_config['posts_per_page'])) * intval($board_config['posts_per_page']);
Код: Выделить всё
$join_sql_table = (!$post_id) ? '' : ", " . POSTS_TABLE . " p, " . POSTS_TABLE . " p2 ";
$join_sql = (!$post_id) ? "t.topic_id = $topic_id" : "p.post_id = $post_id AND t.topic_id = p.topic_id AND p2.topic_id = p.topic_id AND p2.post_id <= $post_id";
$count_sql = (!$post_id) ? '' : ", COUNT(p2.post_id) AS prev_posts";
$order_sql = (!$post_id) ? '' : "GROUP BY p.post_id, t.topic_id, t.topic_title, t.topic_status, t.topic_replies, t.topic_time, t.topic_type, t.topic_vote, t.topic_last_post_id, f.forum_name, f.forum_status, f.forum_id, f.auth_view, f.auth_read, f.auth_post, f.auth_reply, f.auth_edit, f.auth_delete, f.auth_sticky, f.auth_announce, f.auth_pollcreate, f.auth_vote, f.auth_attachments ORDER BY p.post_id ASC";
$sql = "SELECT t.topic_id, t.topic_title, t.topic_status, t.topic_replies, t.topic_time, t.topic_type, t.topic_vote, t.topic_last_post_id, f.forum_name, f.forum_status, f.forum_id, f.auth_view, f.auth_read, f.auth_post, f.auth_reply, f.auth_edit, f.auth_delete, f.auth_sticky, f.auth_announce, f.auth_pollcreate, f.auth_vote, f.auth_attachments" . $count_sql . "
FROM " . TOPICS_TABLE . " t, " . FORUMS_TABLE . " f" . $join_sql_table . "
WHERE $join_sql
AND f.forum_id = t.forum_id
$order_sql";
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев
хм.. ладно.. а в sql'е limit x, y отменили?
limit 100, 130 выведет сообщения с сотого до сто тридцатого... если конечно это дописать в конце правильного запроса..
проще сделать правильно... а неправильно сделать это не проще... кстати.. перебор медленным выйдет на крупных темах.. а доучить sql это очень правильная мысль..
limit 100, 130 выведет сообщения с сотого до сто тридцатого... если конечно это дописать в конце правильного запроса..
проще сделать правильно... а неправильно сделать это не проще... кстати.. перебор медленным выйдет на крупных темах.. а доучить sql это очень правильная мысль..
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
Надеюсь так правильно:
Код: Выделить всё
SELECT count(post_id) FROM phpbb_posts WHERE topic_id=1025 AND forum_id=12 AND post_id<5568
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев
извлекуться все посты у которых ид меньше 5568, следовательно их может быть значительно больше чем постов на страницу...
извлечем все сообщения для темы с идом 1025 начиная с 30ого и заканчивая 60ым.. сортируя по иду поста... 30 и 60 как заменять, думая подсказывать не стоит...
Код: Выделить всё
SELECT *
FROM phpbb_posts
WHERE topic_id = 1025
ORDER BY post_id
LIMIT 30, 60
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
Читай выше. WHERE topic_id=1025 AND forum_id=12
Вот что получилось
Извлекутся все сообщения, а точнее их кол-во по данный пост. Делю это значение на posts_per_page, отбрасываю остаток, умножаю на $posts_per_page и значение Start у меня в кармане.
Задача выполнена,
Чувтвую, что 2 sql запроса можно объеденить, но как?
Вот что получилось
Код: Выделить всё
Function redirtopost($post_id,$posts_per_page)
{
$r=mysql_query('SELECT * FROM phpbb_posts WHERE post_id='.$post_id.';');
$f=mysql_fetch_array($r);
$r2=mysql_query('SELECT count(post_id) FROM phpbb_posts WHERE topic_id='.$f['topic_id'].' AND forum_id='.$f['forum_id'].' AND post_id<'.$post_id.';');
$f2=mysql_fetch_array($r2);
$start=intval($f2['count(post_id)']/$posts_per_page)*$posts_per_page;
return $start;
}
Задача выполнена,
Чувтвую, что 2 sql запроса можно объеденить, но как?
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев
как минимум через LEFT JOIN
как максимум, зачем тут еще один запрос с count, если можно извлечь все посты меньше нужного и использовать sizeof($array), затем, если отсортировать по id'у то нужный пост будет последним, то можно извлечь его из массива через $array[sizeof($array)-1]
как максимум, зачем тут еще один запрос с count, если можно извлечь все посты меньше нужного и использовать sizeof($array), затем, если отсортировать по id'у то нужный пост будет последним, то можно извлечь его из массива через $array[sizeof($array)-1]
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев
вот щас ругаться буду.. а зачем мы указываем WHERE topic_id = xxx??? именно для того, чтобы извлекать посты принадлежащие только данному топику... иди читай доки по sql'у... и по пхп до кучи можно )
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
-
- phpBB 1.0.0
- Сообщения: 9
- Стаж: 18 лет 8 месяцев
-
- phpBB 2.0.2
- Сообщения: 340
- Стаж: 18 лет 9 месяцев