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

Форум MySQL

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

 

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

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

тема: навигация по базе данных
 
 автор: Василий   (10.01.2012 в 16:12)   письмо автору
 
 

На странице у которой есть id_pu нужно вывести навигацию по id_pu
Т.е если текущая страница post_pu.php?id_pu=1, то следующая post_pu.php?id_pu=2 и т.д.
id_pu известна

<?php 
// Переменная хранит число сообщений выводимых на станице 
$num 1
// Извлекаем из URL текущую страницу 
$page $_GET['page']; 
// Определяем общее число сообщений в базе данных 
$result mysql_query("SELECT COUNT(*) FROM pu"); 
$posts mysql_result($result0); 
// Находим общее число страниц 
$total intval(($posts 1) / $num) + 1
// Определяем начало сообщений для текущей страницы 
$page intval($page); 
// Если значение $page меньше единицы или отрицательно 
// переходим на первую страницу 
// А если слишком большое, то переходим на последнюю 
if(empty($page) or $page 0$page 1
  if(
$page $total$page $total
// Вычисляем начиная к какого номера 
// следует выводить сообщения 
$start $page $num $num
// Выбираем $num сообщений начиная с номера $start 
$result mysql_query("SELECT * FROM pu LIMIT $start$num"); 
// В цикле переносим результаты запроса в массив $postrow 
while ( $postrow[] = mysql_fetch_array($result)) 
?> 

Саму статью выводит другой скрипт, статью выводить не нужно еще раз. мне нужны лишь стрелки (предыдущая статья и следующая).
вот это
$result = mysql_query("SELECT * FROM pu LIMIT $start, $num"); 

можно исключить из верхнего кода, наверняка.
// Проверяем нужны ли стрелки назад  
if ($page != 1) $pervpage = '  <a href=post_pu.php?page='. ($page - 1) .'>предыдущая</a> ';  
// Проверяем нужны ли стрелки вперед  
if ($page != ($page + 1)) $nextpage = ' <a href=post_pu.php?page='. ($page + 1) .'>следующая</a> ';  

// Вывод меню 
echo $pervpage.$nextpage; 

  Ответить  
 
 автор: cheops   (10.01.2012 в 16:18)   письмо автору
 
   для: Василий   (10.01.2012 в 16:12)
 

Самый просто вариант, это для начала просто вывести список всех страниц от id_pu = 1 до id_pu = N, т.е.
<?php
  
...
  
$query "SELECT id_pu FROM pu ORDER BY id_pu";
  
$res mysql_query($query); 
  if(!
$res) exit("Ошибка запроса - ".mysql_error());
  if(
mysql_num_rows($res))
  {
     while(
$result mysql_fetch_assoc($res))
     {
        echo 
"<a href='post_pu.php?id_pu=$result[id_pu]'>$result[id_pu]</a>&nbsp;&nbsp;";
     }
  }
?>
Если навигационная строка получится слишком длинная, тогда надо принимать меры по её сокращению.

  Ответить  
 
 автор: Василий   (10.01.2012 в 17:17)   письмо автору
 
   для: cheops   (10.01.2012 в 16:18)
 

в ряду id_pu есть пропуски, последовательности нет

  Ответить  
 
 автор: cheops   (10.01.2012 в 19:49)   письмо автору
 
   для: Василий   (10.01.2012 в 17:17)
 

Тогда можно поступить следующим образом
<?php 
  
... 
  
$query "SELECT id_pu FROM pu ORDER BY id_pu"
  
$res mysql_query($query);  
  if(!
$res) exit("Ошибка запроса - ".mysql_error()); 
  if(
mysql_num_rows($res)) 
  {
     
$i 1;
     while(
$result mysql_fetch_assoc($res)) 
     { 
        echo 
"<a href='post_pu.php?id_pu=$result[id_pu]'>".($i++)."</a>&nbsp;&nbsp;"
     } 
  } 
?>

  Ответить  
 
 автор: Василий   (10.01.2012 в 20:32)   письмо автору
 
   для: cheops   (10.01.2012 в 19:49)
 

спасибо. все отлично выводится
как вместо "1, 2, 3, ... n@ " вывести "предыдущая страница" и "следующая"?

  Ответить  
 
 автор: cheops   (10.01.2012 в 20:39)   письмо автору
 
   для: Василий   (10.01.2012 в 20:32)
 

Для этого нужно выбрать предыдущие две записи и следующие две записи, проще всего для этого воспользоваться запросами вида
<?php
  $query 
"SELECT
              id_pu
            FROM
              pu
            WHERE
              id_pu < 
$_GET[id_pu]
            ORDER BY
              id_pu DESC
            LIMIT 2"

?>
который даст две предыдущие от $_GET[id_pu] записи и запрос вида
<?php
  $query 
"SELECT
              id_pu
            FROM
              pu
            WHERE
              id_pu > 
$_GET[id_pu]
            ORDER BY
              id_pu
            LIMIT 2"

?>
который даст две следующие за $_GET[id_pu] записи. Если вам надо больше, то увеличивайте значение в LIMIT, меньше - соответственно уменьшайте.

  Ответить  
 
 автор: Василий   (10.01.2012 в 21:03)   письмо автору
 
   для: cheops   (10.01.2012 в 20:39)
 

появились ссылки "1, 2" и после нажатия на одну из них - они исчезли
<?php 
$query 
"SELECT  id_pu FROM pu WHERE approved='1' and id_pu < $_GET[id_pu] ORDER BY id_pu DESC LIMIT 2";
  
$res mysql_query($query);  
  if(!
$res) exit("Ошибка запроса - ".mysql_error()); 
  if(
mysql_num_rows($res)) 
  {
     
$i 1;
     while(
$result mysql_fetch_assoc($res)) 
     { 
        echo 
"<a href='post_pu.php?id_pu=$result[id_pu]'>".($i++)."</a>&nbsp;&nbsp;"
     } 
  } 
?> 

  Ответить  
 
 автор: cheops   (10.01.2012 в 22:00)   письмо автору
 
   для: Василий   (10.01.2012 в 21:03)
 

А сколько всего записей в pu и что сейчас в GET-параметре id_pu?

  Ответить  
 
 автор: Василий   (10.01.2012 в 22:04)   письмо автору
 
   для: cheops   (10.01.2012 в 22:00)
 

всего записей 16.
id_pu = 1
если страница имеет значение id_pu = 3 то
имеет ссылки 1 и 2

  Ответить  
 
 автор: cheops   (10.01.2012 в 22:09)   письмо автору
 
   для: Василий   (10.01.2012 в 22:04)
 

При id_pu = 1 нет предыдущих записей... ничего не поделаешь, их просто нет. Теперь добавляйте следующие записи.

  Ответить  
 
 автор: Василий   (10.01.2012 в 22:16)   письмо автору
 
   для: cheops   (10.01.2012 в 22:09)
 

поставил LIMIT 1
выходит "1" и "1"
как теперь чтобы вместо "1" было написано "следующая, и чтобы вместо другой "1" - предыдущая?

  Ответить  
 
 автор: cheops   (10.01.2012 в 22:22)   письмо автору
 
   для: Василий   (10.01.2012 в 22:16)
 

У вас ведь два запроса? Укажите в обработчике одного запроса вместо ($i++) "следующая", а в обработчике другого - "предыдущая". Если слова окажутся перепутанным, поменяйте местами - все должно встать на свои места.

  Ответить  
 
 автор: Василий   (12.01.2012 в 19:04)   письмо автору
 
   для: cheops   (10.01.2012 в 22:22)
 

все работатает.
нажимаешь на "предыдушая" отсчитывает назад, а если нажимаешь на "следущая" сразу переходит в самый конец.
Поясню, если есть id_pu с номерами: 1, 3, 5, 7, ... 99., то нажимая там где страница, к примеру, id_pu = 3 на "следующая" должна грузиться страница с id_pu = 5, но грузится там где id_pu =99

<?php 
$res 
mysql_query("SELECT COUNT(*) FROM pu WHERE approved='1'");
$row mysql_fetch_row($res);
$total $row[0]; // всего записей
echo "<strong><p style='MARGIN-LEFT: 15px'>Всего ПУ: ($total)</p></strong>";

$query "SELECT  id_pu FROM pu WHERE approved='1' and id_pu < $_GET[id_pu] ORDER BY id_pu DESC LIMIT 1";
  
$res mysql_query($query);  
  if(!
$res) exit("Ошибка запроса - ".mysql_error()); 
  if(
mysql_num_rows($res)) 
  {
     
$i 1;
     while(
$result mysql_fetch_assoc($res)) 
     { 
        echo 
"<a href='post_pu.php?id_pu=$result[id_pu]'>".предыдущая."</a>&nbsp;&nbsp;"
     } 
  }  
  
  
$query "SELECT  id_pu FROM pu WHERE approved='1' and id_pu > $_GET[id_pu] ORDER BY id_pu DESC LIMIT 1";
  
$res mysql_query($query);  
  if(!
$res) exit("Ошибка запроса - ".mysql_error()); 
  if(
mysql_num_rows($res)) 
  {
     
$i 1;
     while(
$result mysql_fetch_assoc($res)) 
     { 
        echo 
"<a href='post_pu.php?id_pu=$result[id_pu]'>".следующая."</a>&nbsp;&nbsp;"
     } 
  }
?> 

  Ответить  
 
 автор: Василий   (13.01.2012 в 16:15)   письмо автору
 
   для: Василий   (12.01.2012 в 19:04)
 

подскажите, пожалуйста, где ошибка

  Ответить  
 
 автор: Lotanaen   (13.01.2012 в 16:29)   письмо автору
 
   для: Василий   (12.01.2012 в 19:04)
 

во втором запросе замените DESC на ASC

  Ответить  
 
 автор: Василий   (13.01.2012 в 17:49)   письмо автору
 
   для: Lotanaen   (13.01.2012 в 16:29)
 

спасибо. работает

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

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