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

Форум PHP

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

 

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

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

тема: постраничный вывод 2 :)
 
 автор: Be4ep   (02.02.2005 в 00:04)   письмо автору
 
 

выручайте! совсем забыл как эти циферки делать. всмысле ссылки на страници типа того что у вас в низу.
я сделал следующим образом:

$id_max = max_id(); //я работаю с бд и эта функция определяет сколько записей
$str = $id_max/$news_rows; //тут я узнаю сколько страниц будет
for ($i=$str; $i>$$id_max; $i--) echo $i; //соответственно перечисляю их


1)$$id_max - я чисто слуцайно поставил 2 доллара. с одним как выяснилось не работает (объясните в чем проблема??? я пробовал вмечто $$id_max роставить саму функцию, но ничего не вывело, ведь это получается $max_id(), что равносильно Fatal Error)
2)при $news_rows больше 5 сервак виснет ($id_max = 17)(опять же почему?? что нетак?)
3)как сделать 123 п не 321( :) )

   
 
 автор: cheops   (02.02.2005 в 00:27)   письмо автору
 
   для: Be4ep   (02.02.2005 в 00:04)
 

Хм... вы можете почитать у нас на сайте статью посвящённую постраничной навигации, написанную Artem. S, если останутся вопросы - задавайте.

http://www.softtime.ru/info/articlephp.php?id_article=33

   
 
 автор: Be4ep   (02.02.2005 в 11:13)   письмо автору
 
   для: cheops   (02.02.2005 в 00:27)
 

отлично! то что надо. пасиб

   
 
 автор: coloboc66   (03.02.2005 в 15:52)   письмо автору
 
   для: Be4ep   (02.02.2005 в 11:13)
 

$posts = mysql_fetch_row($result);
$total = intval(($posts - 1) / $num) + 1; // Находим общее число страниц Почему-то у меня в этой строке предлагаемого вами примера выдается ошибка Fatal error: Unsupported operand types

   
 
 автор: cheops   (03.02.2005 в 16:11)   письмо автору
 
   для: coloboc66   (03.02.2005 в 15:52)
 

Вместо mysql_fetch_row(), следует использовать mysql_result, так как первая функция возвращает массив.

   
 
 автор: coloboc66   (03.02.2005 в 17:07)   письмо автору
 
   для: cheops   (03.02.2005 в 16:11)
 

Тогда пишет "неправильный параметр COUNT" в строке $result = mysql_query("SELECT COUNT(*) FROM post");

   
 
 автор: Be4ep   (03.02.2005 в 17:26)   письмо автору
 
   для: coloboc66   (03.02.2005 в 17:07)
 


$res = mysql_query("SELECT COUNT(*) FROM $userstable");
$total = intval(($res- 1) / $num) + 1;  

   
 
 автор: coloboc66   (03.02.2005 в 17:31)   письмо автору
 
   для: Be4ep   (03.02.2005 в 17:26)
 

Эге, спасибо, пока получается!
Вообще если на форуме вывешен пример с ошибками, хозяевам его нужно конечно своевременно корректировать, а то намучаешься с этим примером, ведь авторитет учителя сомнению не подвергается.

Нет. все-равно что-то не то. В командной строке mySQL вижу, что COUNT равен 3, задаю $num=2, а $total почему-то выводится равным 7!

   
 
 автор: cheops   (03.02.2005 в 18:04)   письмо автору
 
   для: coloboc66   (03.02.2005 в 17:31)
 

Форум - это сетевой аналог клуба, и предназначен в первую очередь для общения, а при живом общении ошибки не избежны. Администрация сайта целенаправлено следит за отсуствием ошибок в разделах downloads и статьи о PHP. Здесь это ложится на плечи форумчан - если кому-то нужно решение из форума, а оно не работает - тема подымается как в этом случае и все вместе докапываемся до истины. Кроме того осуждение рабочего алоритма и так же не приветствуется, так как люди тратят своё время на помощь другим и осуждать бесплатно предлагаемое решение не правильно. Если имеется решение, которое по мнению участника форума лучше предложенного, его лучше просто привести рядом - посетители сами выберут то, которое им больше всего подходит.

   
 
 автор: cheops   (03.02.2005 в 18:08)   письмо автору
 
   для: coloboc66   (03.02.2005 в 17:31)
 

Здесь имеется ввиду, что результат возвращённый mysql_query() преобразуется после функцией mysql_result:
<?php
  $res 
mysql_result(mysql_query("SELECT COUNT(*) FROM $userstable")); 
  
$total intval(($res1) / $num) + 1;  
?>

   
 
 автор: XPraptor   (03.02.2005 в 18:21)   письмо автору
 
   для: cheops   (03.02.2005 в 18:08)
 

Господа, я когда то тоже взял этот пример и переделал его под свои нужды причем универсально.
Если кому надо вот функция которая работает у меня, она создает строку навигатора для любой страницы.


//создает навигатор по страницам
//num-кол-во на страницу, page-номер текущей страницы, posts-общее кол-во найденых записей, cur_rzdl-имя текущей страницы
//s_rbr-номер текущей рубрики это лично у меня по рубрикам выводится
//обязательно объявляем со значениями по умолчанию, чтобы проблем меньше потом
function create_page_nvg($num=15, $page=1, $posts=0, $cur_rzdl, $s_rbr)
{
    // Находим общее число страниц 
    $total = intval(($posts - 1) / $num) + 1; 
    // Определяем начало сообщений для текущей страницы 
    $page = intval($page); 
    // Если значение $page меньше единицы или отрицательно 
    // переходим на первую страницу 
    // А если слишком большое, то переходим на последнюю 
    if(empty($page) or $page < 0) $page = 1; 
      if($page > $total) $page = $total; 
    // Вычисляем начиная c какого номера 
    // следует выводить сообщения 
    $start = $page * $num - $num; 
    //тоже объявляем, чтобы потом не было проблем    
    $pervpage="";
    $nextpage="";
    $page2left="";
    $page1left="";
    $page2right="";
    $page1right="";
    // Проверяем нужны ли стрелки назад 
    if ($page!=1)$pervpage="<A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=1\"><< </A> <A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . ($page - 1) . "\">< </A>"; 
    // Проверяем нужны ли стрелки вперед 
    if ($page!=$total)$nextpage="<A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . ($page + 1) . "\"> ></A> <A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . $total . "\"> >></A>"; 
    // Находим две ближайшие станицы с обоих краев, если они есть 
    if($page - 2 > 0) $page2left = "<A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . ($page - 2) . "\">" . ($page - 2) . "</A> | ";
    if($page - 1 > 0) $page1left = "<A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . ($page - 1) . "\">" . ($page - 1) . "</A> | ";
    if($page + 2 <= $total) $page2right = " | <A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . ($page + 2) . "\">" . ($page + 2) . "</A>";
    if($page + 1 <= $total) $page1right = " | <A HREF=\"" . $cur_rzdl . "?slrbr=" . $s_rbr . "&pg=" . ($page + 1) . "\">" . ($page + 1) . "</A>";
    // возвращаем готовую строку навигатора
    return $pervpage . $page2left . $page1left . "<b>" . $page . "</b>" . $page1right . $page2right . $nextpage; 
}

Вызывается ся конструкция из любого места ваших скриптов где оно нужно после запроса из базы с нужными параметрами:
$rez=mysql_query("SELECT...WHERE...");
$cnt_obj=mysql_num_rows($rez);
$str_nav_link=create_page_nvg(15, 1, $cnt_obj, "index.php", 104);
print $str_nav_link;
тут выводите данные, чтобы с нужного места используйте
$i -Это с какой именно записи выводить начинать, можно найти любым способом
$i-1 -это потому что номер например 1 а нумерация строк идет с нуля
if(!mysql_data_seek($rez, $i-1))$i=0;

   
 
 автор: coloboc66   (04.02.2005 в 14:06)   письмо автору
 
   для: XPraptor   (03.02.2005 в 18:21)
 

Очень хороший примерчик! Вот если бы вы еще показали, как делали запрос к БД и как его обрабатывали после того, как вывели строку навигатора (т.е. после того, как стала известна $start), было бы совсем здорово!

   
 
 автор: Be4ep   (04.02.2005 в 16:02)   письмо автору
 
   для: coloboc66   (04.02.2005 в 14:06)
 

вот пример:

<?php
wiev_sql
($_GET[page],$userstable,$news_rows);    

function 
wiev_sql($get_page,$ut,$n_r){
if(!
$get_page){$pag 1;} else { $pag=$get_page;}
$start $pag $n_r $n_r;
$result mysql_query("SELECT * FROM $ut ORDER BY id LIMIT $start$n_r");
while ( 
$postrow[] = mysql_fetch_array($result));
echo 
"<table>";
for(
$i 0$i $n_r$i++)
{
echo 
"<table width=100% border=1><tr bgcolor=#33FF00>
         <td><div align=left><a href=mailto:"
.$postrow[$i][email].">".$postrow[$i][name]."</a></div></td>
         <td><div align=right>"
.$postrow[$i][date]."</div></td></tr>
      <tr bgcolor=#33FFFF>
       <td colspan=\"2\">"
.nl2br($postrow[$i][text])."</td></tr>";
       echo 
"</table>";
       echo 
"<br><br>";
}
echo 
create_page_nvg($n_r$pagmax_id($ut));
mysql_close();
}
?>

саму функцию я переделал вот в такой вид:

<?php
function create_page_nvg($num$page$posts)
{
    
$total intval(($posts 1) / $num) + 1;
    
$page intval($page);
    if(empty(
$page) or $page 0$page 1;
      if(
$page $total$page $total;
    
$start $page $num $num;
if (
$page != 1$pervpage "<a href=".$PHP_SELF."?page=1><<</a>
                               <a href="
.$PHP_SELF."?page=". ($page 1) ."><</a> ";
if (
$page != $total$nextpage " <a href=".$PHP_SELF."?page=". ($page 1) .">></a>
                                   <a href="
.$PHP_SELF."?page=" .$total">>></a>";
if(
$page 0$page2left " <a href=".$PHP_SELF."?page=". ($page 2) .">". ($page 2) ."</a> | ";
if(
$page 0$page1left "<a href=".$PHP_SELF."?page=". ($page 1) .">". ($page 1) ."</a> | ";
if(
$page <= $total$page2right " | <a href=".$PHP_SELF."?page=". ($page 2) .">". ($page 2) ."</a>";
if(
$page <= $total$page1right " | <a href=".$PHP_SELF."?page=". ($page 1) .">". ($page 1) ."</a>";
    return 
$pervpage $page2left $page1left "<b>" $page "</b>" $page1right $page2right $nextpage;
}
?>

   
 
 автор: XPraptor   (04.02.2005 в 17:48)   письмо автору
 
   для: coloboc66   (04.02.2005 в 14:06)
 

Я и написал внизу как именно выводить. Просто как вычислять номер текущей записи, это уже зависит от того как реализован ваш скрипт из которого линк вызывается. Я чаще всего реализую так:

//тут типа запросили и уже напечатали навигатор теперь вычисляем с какой записи выводить
$i=$pg_start * $cnt_in_pg - $cnt_in_pg + 1; //номер первого объявления(строки) на текущей странице 
$i_max=$pg_start * $cnt_in_pg; //номер последнего объявления(строки) на текущей странице
//перед этим у нас уже был выполнен запрос и вернул все записи с нужными условиями, я не использую запрос типа LIMIT потому как два раза надо запрашивать, сначала общее кол-во записей удовлетворяющих условию, а потом еще с LIMIT, поэтому запрос выполнен ранее и содеожит все записи
//эта строчка значит что нужно курсору в результате запроса встать на указанную запись и дальше в цикле перебор идет уже от нее и вниз
if(!mysql_data_seek($rez, $i-1))$i=0; 
while($row=mysql_fetch_assoc($rez))
{
    if($i>($i_max)){ //если больше последней для этой страницы то выходим
         break;
     }else{ //иначе выводим объявы
      //тут собственно выводим объявы     
     }
}

   
 
 автор: coloboc66   (05.02.2005 в 12:14)   письмо автору
 
   для: XPraptor   (04.02.2005 в 17:48)
 

$rez = mysql_query("SELECT COUNT(*) FROM books where catid=$catid");
$cnt_obj=mysql_num_rows($rez);

Вот эта инструкция у меня всегда выдает $cnt_obj равной 1, независимо от того, сколько записей в таблице. Не понимаю почему у вас по-другому.
$rez = mysql_query("SELECT * FROM books where catid=$catid");
$cnt_obj=mysql_num_rows($rez);

А такая инструкция выдает правильное число, но такой запрос наверное слишкои избыточен?
В общем, я не понимаю, почему у вас получается работать с COUNT(*). У меня не получается.
Если хотите, выложу два простеньких файла для тестирования моей проблемы. А впрочем, сразу их и выкладываю:

файл test_db.sql:

create database test1;
use test1;
create table books
(
isbn char(13) not null primary key,
author char(30),
title char(60),
pages int unsigned,
pereplet char(10),
catid int unsigned,
price float(4,2) not null,
description varchar(25)
);
INSERT INTO books VALUES ('001','First Author','First Title',180,'мягкий',1,49.99,'Description1.');
INSERT INTO books VALUES ('002','Second Author','Second Title',280,'жесткий',1,24.99,'Description2.');
INSERT INTO books VALUES ('003','Drei Author','Drei Title',380,'мягкий',1,39.99,'Description3.');
grant select, insert, update, delete on test1.*
to admin identified by 'admin';


файл test_db.php:

<?php
$result = mysql_pconnect('localhost');
if (!$result) return false;
if (!@mysql_select_db('test1')) return false;
$catid=1;
$rez = mysql_query("SELECT COUNT(*) FROM books where catid=$catid");
$cnt_obj=mysql_num_rows($rez);
$cnt_obj=intval($cnt_obj); [/b]//Всегда выдает 1, независимо от числа записей!!![b]
echo $cnt_obj;
?>

   
 
 автор: glsv (Дизайнер)   (05.02.2005 в 17:29)   письмо автору
 
   для: coloboc66   (05.02.2005 в 12:14)
 

> $rez = mysql_query("SELECT COUNT(*) FROM books where catid=$catid");
>$cnt_obj=mysql_num_rows($rez);

>Вот эта инструкция у меня всегда выдает $cnt_obj равной 1, независимо от того,
>сколько записей в таблице. Не понимаю почему у вас по-другому.

Вы получаете количество строк. А у вас всего одна строка в результате запроса и она содержит значение, равное количеству строк.
Поэтому нужно делать следующим образом.

<?
  $rez 
mysql_query("SELECT COUNT(*) FROM books where catid=$catid"); 
  
$cnt_obj mysql_result($rez,0);
?>

   
 
 автор: coloboc66   (06.02.2005 в 01:50)   письмо автору
 
   для: glsv (Дизайнер)   (05.02.2005 в 17:29)
 

Попробую, спасибо пока!

   
Rambler's Top100
вверх

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