Логика поиска страницы топика по номеру поста

Идеи для расширения функциональности phpBB 2.0.x
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Логика поиска страницы топика по номеру поста

Сообщение Shaman_Tech »

Меня интересует логика поиска страницы топикы по номеру поста.

Пример: Получаю номер поста, ищу по таблице постов
Получаю id форума и топика, а вот как вычислить номер страницы в с соответствии с posts_per_page не знаю.

Помогите, люди добрые.
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

ну, а заглянуть в код было не дано?

Код: Выделить всё

$start = floor(($forum_topic_data['prev_posts'] - 1) / intval($board_config['posts_per_page'])) * intval($board_config['posts_per_page']);
для объяснения значения $forum_topic_data['prev_posts'] разбирайте запрос

Код: Выделить всё

$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";
это из viewtopic.php... коли уж догадались как выбрать все, кроме данных нюансов, то этот код разберете...
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Сообщение Shaman_Tech »

До этого я и сам додумался. Вот только мозг ломать не хотел.
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

хм.. с таким расчетом дальше не подскажу.. как-то все обленились...
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Сообщение Shaman_Tech »

Несколько минут посидел, повтыкал. На этом и закончился.

Проще перебором сделать. Или пойти доучивать sql
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

хм.. ладно.. а в sql'е limit x, y отменили?
limit 100, 130 выведет сообщения с сотого до сто тридцатого... если конечно это дописать в конце правильного запроса..
проще сделать правильно... а неправильно сделать это не проще... кстати.. перебор медленным выйдет на крупных темах.. а доучить sql это очень правильная мысль..
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Сообщение Shaman_Tech »

Надеюсь так правильно:

Код: Выделить всё

SELECT count(post_id) FROM phpbb_posts WHERE topic_id=1025 AND forum_id=12 AND post_id<5568 
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

извлекуться все посты у которых ид меньше 5568, следовательно их может быть значительно больше чем постов на страницу...

Код: Выделить всё

SELECT *
   FROM phpbb_posts
   WHERE topic_id = 1025
   ORDER BY post_id
   LIMIT 30, 60
извлечем все сообщения для темы с идом 1025 начиная с 30ого и заканчивая 60ым.. сортируя по иду поста... 30 и 60 как заменять, думая подсказывать не стоит...
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Сообщение Shaman_Tech »

Читай выше. WHERE topic_id=1025 AND forum_id=12


Вот что получилось

Код: Выделить всё

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;
}
Извлекутся все сообщения, а точнее их кол-во по данный пост. Делю это значение на posts_per_page, отбрасываю остаток, умножаю на $posts_per_page и значение Start у меня в кармане.

Задача выполнена,

Чувтвую, что 2 sql запроса можно объеденить, но как?
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

как минимум через LEFT JOIN
как максимум, зачем тут еще один запрос с count, если можно извлечь все посты меньше нужного и использовать sizeof($array), затем, если отсортировать по id'у то нужный пост будет последним, то можно извлечь его из массива через $array[sizeof($array)-1]
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Сообщение Shaman_Tech »

Если извлекать все посты меньше указанного, то извлекутся посты разных тем и форумов.
А count лучше чем гонять массив даннах через sizeof.

Если не ошибаюсь то кол-во записей можно узнать и по идентификатору sql запроса mysql_num_fields.
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

вот щас ругаться буду.. а зачем мы указываем WHERE topic_id = xxx??? именно для того, чтобы извлекать посты принадлежащие только данному топику... иди читай доки по sql'у... и по пхп до кучи можно )
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Аватара пользователя
Shaman_Tech
phpBB 1.0.0
Сообщения: 9
Стаж: 18 лет 8 месяцев

Сообщение Shaman_Tech »

И зачем столько агрессии? По всей видимости мы говорили о разных вещах. Спасибо за помощь. Задача выполнена. Догнал сам. :D
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Стаж: 18 лет 9 месяцев

Сообщение m157y »

хм... почему-то я склоняюсь к тому, что если сам решение нашел, то и с другими поделись ) мало ли у кого будет такая же идея )
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..

Вернуться в «Запросы модов для phpBB 2.0.x»