|
 1.7 Кб |
|
| На странице page1.php я беру значение id и cat передаю методом GET на страницу page2.php
На странице page2.php я пытаюсь перейти на следующею страницу "вперед" в той же категории cat но с следующем id .
page2.php?cat=1&id=1 вперед
page2.php?cat=1&id=4 вперед
page2.php?cat=1&id=6 и т.д.
За основу пытался взять постраничную навигацию http://www.softtime.ru/article/index.php?id_article=33
Во вложение база t2.sql
Подскажите пожалуйста как решить задачу.
page1.php
<?
$db = mysql_connect ("localhost","root","");
mysql_select_db("lessons",$db);
?>
<?php
$result = mysql_query("SELECT * FROM t2",$db);
if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору<br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("
<p class='linkk2'> <a href='page2.php?cat=%s&id=%s'>%s</a>
%s </p>
<p>",$myrow["cat"],$myrow["id"],$myrow["title"],$myrow["text"], $r);
}
while ($myrow = mysql_fetch_array($result));
}
?>
|
page2.php
<?
$db = mysql_connect ("localhost","root","");
mysql_select_db("lessons",$db);
?>
<?php
// Переменная хранит число сообщений выводимых на странице
$num = 1;
// Извлекаем из URL текущую страницу
$id = $_GET['cat'];
// Определяем общее число сообщений в базе данных
$result = mysql_query("SELECT COUNT(*) FROM t2");
$posts = mysql_result($result, 0);
// Находим общее число страниц
$total = intval(($posts - 1) / $num) + 1;
// Определяем начало сообщений для текущей страницы
$id = intval($id);
// Если значение $page меньше единицы или отрицательно
// переходим на первую страницу
// А если слишком большое, то переходим на последнюю
if(empty($id) or $id < 0) $id = 1;
if($id > $total) $id = $total;
// Вычисляем начиная к какого номера
// следует выводить сообщения
$start = $id * $num - $num;
// Выбираем $num сообщений начиная с номера $start
$result = mysql_query("SELECT * FROM t2 LIMIT $start, $num");
// В цикле переносим результаты запроса в массив $postrow
while ( $postrow[] = mysql_fetch_array($result))
?>
<?php
if (isset($_GET['cat'])) {$cat = $_GET['cat']; }
if (!isset($cat)) {$cat = 1;}
if (isset($_GET['id'])) {$id = $_GET['id']; }
if (!isset($id)) {$id = 1;}
$result = mysql_query("SELECT * FROM t2 WHERE id='$id'",$db);
if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору<br> <strong>Код ошибки:</strong></p>";
exit(mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
do
{
printf ("<div>%s</div>%s<br>",$myrow["title"],$myrow["text"], $r);
}
while ($myrow = mysql_fetch_array($result));
// Проверяем нужны ли стрелки назад
if ($page != 1) $pervpage = '<a href= ./page2.php?id=1>Первая</a>
<a href= ./page2.php?id='. ($id - 1) .'>Предыдущая</a> ';
// ПОНЯТНО ЧТО ($id + 1) НЕ ДОЛЖНО БЫТЬ +1 НО Я НЕ ЗНАЮ КАК НАПИСАТЬ
if ($id != $total) $nextpage = ' <a href= ./page2.php?cat='.$cat.'&id='. ($id + 1) .'>Следующая</a>
<a href= ./page2.php?id=' .$total. '> Последняя</a>';
// Вывод меню
echo $pervpage.'<b>'.' '.'</b>'.$nextpage;
}
?>
|
| |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 14:39)
| | Хм... а в чем сложность? Что-то работает не так? | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 14:45)
| | переходит по ссылке ($id + 1)
page2.php?cat=1&id=1
page2.php?cat=1&id=2
page2.php?cat=1&id=3
а нужно
page2.php?cat=1&id=1
page2.php?cat=1&id=2
page2.php?cat=1&id=7 | |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 14:51)
| | Т.е. следующий id может быть совершенно произвольный и вычислить его нельзя? Только извлечь из таблицы? | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 14:57)
| | Я так думаю что можно вычислить все id по определенному cat и подставить следующее значение но к сожалению как мне это сделать я пока не знаю ))
Мне еще подсказали "обсчитываешь значения LIMIT для SQL, чтобы выводить только то, что нужно" но как это сделать я тоже пока не решил )))
Во вложение t2.sql, посмотри думаю все станет сразу понятно. | |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 15:02)
| | Вон внизу SHAman и Красная_шляпа как раз предлагают решение с сортировкой и LIMIT. | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 15:04)
| | уже пробую | |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 14:39)
| | для next
SELECT * FROM t2 WHERE `id`>$id LIMIT 1;
|
если prev
SELECT * FROM t2 WHERE `id`<$id LIMIT 1;
|
| |
|
|
|
|
|
|
|
для: SHAman
(08.02.2011 в 15:00)
| | оба запроса недетерминированы, поскольку в общем случае строки в таблице могут оказаться
размещены не согласно порядку первичных ключей. (Очевидно из-за ранее удалявшихся записей.)
Можно было бы добавить ORDER BY id (DESC|ASC) - тогда запрос вернул бы нужное с гарантией.
Но более корректно вытаскивать только требуемый id, не применяя LIMIT
SELECT MIN(`id`) FROM t2 WHERE `id`>$id
|
и аналогично MAX | |
|
|
|
|
|
|
|
для: Trianon
(08.02.2011 в 15:37)
| | Запрос более менее понятен а как вывести ссылку на следующий id ???
И не ужели нет готового решения для такой задачи ведь не я один столкнулся с этим. Или хотя бы похожего решения, похожего скрипта? | |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 16:35)
| | Извлечь значение из SQL-запроса, который привел Trianon можно следующим образом
<?php
...
$query = "SELECT MIN(`id`) FROM t2 WHERE `id`>$id";
$tbl = mysql_query($query);
if(!$tbl) exit("Ошибка - ".mysql_error());
$next_id = mysql_result($tbl, 0);
?>
|
PS Готовых решений мало, так как выбранный вами путь редко используется, для постраничной навигации нужно два дополнительных SQL-запроса, проще ориентироваться на сурогатные страницы, которые можно вычислить без лишних запросов. | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 16:45)
| | Разве можно назвать данную задачу постраничной навигацией? Просто из всех примеров что были в книжках [url]www.softtime.ru я[/url] постраничная навигация показалась мне легче всего для переделки.
Если есть другие решения реализации "вперед" "назад" по id и cat, подскажите пожалуйста направление в котором следует думать! | |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 16:53)
| | Одну из таких идей внизу подсказал Trianon. | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 16:56)
| | Вижу и пытаюсь осмыслить данный скрипт сгенерирующий две ссылки вида go_to_prev.php?id=nnn и go_to_next.php?id=nnn
Но боюсь с моими нынешними знаниями не осилю данную задачу. Вот если бы где то был похожий пример что бы разобрать его по косточкам... ) | |
|
|
|
|
|
|
|
для: cheops
(08.02.2011 в 16:45)
| | $next_id дает тот же результат что и $id + 1
переходит к следующему id | |
|
|
|
|
|
|
|
для: Trianon
(08.02.2011 в 15:37)
| | Верные замечания, да. | |
|
|
|
|
|
|
|
для: cerf000
(08.02.2011 в 14:39)
| | select * from tbl where id > $id limit 1 // вперед
select * from tbl where id < $id limit 1 // назад | |
|
|
|
|
|
|
|
для: Красная_шляпа
(08.02.2011 в 15:01)
| | что-то последнее время получается публиковать сообщения одновременно | |
|
|
|
|
|
|
|
для: Красная_шляпа
(08.02.2011 в 15:01)
| | С лимитом
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE attributes range PRIMARY PRIMARY 4 NULL 123 Using where
|
С MIN( `id` )
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
| |
|
|
|