Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как организовать переключение вперед назад по id и cat ???
 
 автор: cerf000   (08.02.2011 в 14:39)   письмо автору
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'>&nbsp;<a  href='page2.php?cat=%s&id=%s'>%s</a>
             %s &nbsp; </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($result0);  
// Находим общее число страниц  
$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'>&nbsp; Последняя</a>';  

// Вывод меню  
echo $pervpage.'<b>'.'&nbsp;'.'</b>'.$nextpage;  

}
?>

  Ответить  
 
 автор: cheops   (08.02.2011 в 14:45)   письмо автору
 
   для: cerf000   (08.02.2011 в 14:39)
 

Хм... а в чем сложность? Что-то работает не так?

  Ответить  
 
 автор: cerf000   (08.02.2011 в 14:51)   письмо автору
 
   для: 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

  Ответить  
 
 автор: cheops   (08.02.2011 в 14:57)   письмо автору
 
   для: cerf000   (08.02.2011 в 14:51)
 

Т.е. следующий id может быть совершенно произвольный и вычислить его нельзя? Только извлечь из таблицы?

  Ответить  
 
 автор: cerf000   (08.02.2011 в 15:02)   письмо автору
 
   для: cheops   (08.02.2011 в 14:57)
 

Я так думаю что можно вычислить все id по определенному cat и подставить следующее значение но к сожалению как мне это сделать я пока не знаю ))
Мне еще подсказали "обсчитываешь значения LIMIT для SQL, чтобы выводить только то, что нужно" но как это сделать я тоже пока не решил )))
Во вложение t2.sql, посмотри думаю все станет сразу понятно.

  Ответить  
 
 автор: cheops   (08.02.2011 в 15:04)   письмо автору
 
   для: cerf000   (08.02.2011 в 15:02)
 

Вон внизу SHAman и Красная_шляпа как раз предлагают решение с сортировкой и LIMIT.

  Ответить  
 
 автор: cerf000   (08.02.2011 в 15:58)   письмо автору
 
   для: cheops   (08.02.2011 в 15:04)
 

уже пробую

  Ответить  
 
 автор: SHAman   (08.02.2011 в 15:00)   письмо автору
 
   для: cerf000   (08.02.2011 в 14:39)
 

для next
SELECT * FROM t2 WHERE `id`>$id LIMIT 1;

если prev
SELECT * FROM t2 WHERE `id`<$id LIMIT 1;

  Ответить  
 
 автор: Trianon   (08.02.2011 в 15:37)   письмо автору
 
   для: SHAman   (08.02.2011 в 15:00)
 

оба запроса недетерминированы, поскольку в общем случае строки в таблице могут оказаться
размещены не согласно порядку первичных ключей. (Очевидно из-за ранее удалявшихся записей.)
Можно было бы добавить ORDER BY id (DESC|ASC) - тогда запрос вернул бы нужное с гарантией.

Но более корректно вытаскивать только требуемый id, не применяя LIMIT

SELECT MIN(`id`)  FROM t2 WHERE `id`>$id 

и аналогично MAX

  Ответить  
 
 автор: cerf000   (08.02.2011 в 16:35)   письмо автору
 
   для: Trianon   (08.02.2011 в 15:37)
 

Запрос более менее понятен а как вывести ссылку на следующий id ???
И не ужели нет готового решения для такой задачи ведь не я один столкнулся с этим. Или хотя бы похожего решения, похожего скрипта?

  Ответить  
 
 автор: cheops   (08.02.2011 в 16:45)   письмо автору
 
   для: 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($tbl0);
?>

PS Готовых решений мало, так как выбранный вами путь редко используется, для постраничной навигации нужно два дополнительных SQL-запроса, проще ориентироваться на сурогатные страницы, которые можно вычислить без лишних запросов.

  Ответить  
 
 автор: cerf000   (08.02.2011 в 16:53)   письмо автору
 
   для: cheops   (08.02.2011 в 16:45)
 

Разве можно назвать данную задачу постраничной навигацией? Просто из всех примеров что были в книжках [url]www.softtime.ru я[/url] постраничная навигация показалась мне легче всего для переделки.
Если есть другие решения реализации "вперед" "назад" по id и cat, подскажите пожалуйста направление в котором следует думать!

  Ответить  
 
 автор: cheops   (08.02.2011 в 16:56)   письмо автору
 
   для: cerf000   (08.02.2011 в 16:53)
 

Одну из таких идей внизу подсказал Trianon.

  Ответить  
 
 автор: cerf000   (08.02.2011 в 17:01)   письмо автору
 
   для: cheops   (08.02.2011 в 16:56)
 

Вижу и пытаюсь осмыслить данный скрипт сгенерирующий две ссылки вида go_to_prev.php?id=nnn и go_to_next.php?id=nnn

Но боюсь с моими нынешними знаниями не осилю данную задачу. Вот если бы где то был похожий пример что бы разобрать его по косточкам... )

  Ответить  
 
 автор: cerf000   (08.02.2011 в 17:13)   письмо автору
 
   для: cheops   (08.02.2011 в 16:45)
 

$next_id дает тот же результат что и $id + 1
переходит к следующему id

  Ответить  
 
 автор: SHAman   (08.02.2011 в 17:46)   письмо автору
 
   для: Trianon   (08.02.2011 в 15:37)
 

Верные замечания, да.

  Ответить  
 
 автор: Красная_шляпа   (08.02.2011 в 15:01)   письмо автору
 
   для: 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:02)   письмо автору
 
   для: Красная_шляпа   (08.02.2011 в 15:01)
 

что-то последнее время получается публиковать сообщения одновременно

  Ответить  
 
 автор: Косорылый   (08.02.2011 в 16:40)   письмо автору
 
   для: Красная_шляпа   (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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования