|
|
|
| выручайте! совсем забыл как эти циферки делать. всмысле ссылки на страници типа того что у вас в низу.
я сделал следующим образом:
$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( :) ) | |
|
|
|
|
|
|
|
для: Be4ep
(02.02.2005 в 00:04)
| | Хм... вы можете почитать у нас на сайте статью посвящённую постраничной навигации, написанную Artem. S, если останутся вопросы - задавайте.
http://www.softtime.ru/info/articlephp.php?id_article=33 | |
|
|
|
|
|
|
|
для: cheops
(02.02.2005 в 00:27)
| | отлично! то что надо. пасиб | |
|
|
|
|
|
|
|
для: Be4ep
(02.02.2005 в 11:13)
| | $posts = mysql_fetch_row($result);
$total = intval(($posts - 1) / $num) + 1; // Находим общее число страниц Почему-то у меня в этой строке предлагаемого вами примера выдается ошибка Fatal error: Unsupported operand types | |
|
|
|
|
|
|
|
для: coloboc66
(03.02.2005 в 15:52)
| | Вместо mysql_fetch_row(), следует использовать mysql_result, так как первая функция возвращает массив. | |
|
|
|
|
|
|
|
для: cheops
(03.02.2005 в 16:11)
| | Тогда пишет "неправильный параметр COUNT" в строке $result = mysql_query("SELECT COUNT(*) FROM post"); | |
|
|
|
|
|
|
|
для: coloboc66
(03.02.2005 в 17:07)
| |
$res = mysql_query("SELECT COUNT(*) FROM $userstable");
$total = intval(($res- 1) / $num) + 1;
|
| |
|
|
|
|
|
|
|
для: Be4ep
(03.02.2005 в 17:26)
| | Эге, спасибо, пока получается!
Вообще если на форуме вывешен пример с ошибками, хозяевам его нужно конечно своевременно корректировать, а то намучаешься с этим примером, ведь авторитет учителя сомнению не подвергается.
Нет. все-равно что-то не то. В командной строке mySQL вижу, что COUNT равен 3, задаю $num=2, а $total почему-то выводится равным 7! | |
|
|
|
|
|
|
|
для: coloboc66
(03.02.2005 в 17:31)
| | Форум - это сетевой аналог клуба, и предназначен в первую очередь для общения, а при живом общении ошибки не избежны. Администрация сайта целенаправлено следит за отсуствием ошибок в разделах downloads и статьи о PHP. Здесь это ложится на плечи форумчан - если кому-то нужно решение из форума, а оно не работает - тема подымается как в этом случае и все вместе докапываемся до истины. Кроме того осуждение рабочего алоритма и так же не приветствуется, так как люди тратят своё время на помощь другим и осуждать бесплатно предлагаемое решение не правильно. Если имеется решение, которое по мнению участника форума лучше предложенного, его лучше просто привести рядом - посетители сами выберут то, которое им больше всего подходит. | |
|
|
|
|
|
|
|
для: coloboc66
(03.02.2005 в 17:31)
| | Здесь имеется ввиду, что результат возвращённый mysql_query() преобразуется после функцией mysql_result:
<?php
$res = mysql_result(mysql_query("SELECT COUNT(*) FROM $userstable"));
$total = intval(($res- 1) / $num) + 1;
?>
|
| |
|
|
|
|
|
|
|
для: 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; | |
|
|
|
|
|
|
|
для: XPraptor
(03.02.2005 в 18:21)
| | Очень хороший примерчик! Вот если бы вы еще показали, как делали запрос к БД и как его обрабатывали после того, как вывели строку навигатора (т.е. после того, как стала известна $start), было бы совсем здорово! | |
|
|
|
|
|
|
|
для: 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, $pag, max_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 - 2 > 0) $page2left = " <a href=".$PHP_SELF."?page=". ($page - 2) .">". ($page - 2) ."</a> | ";
if($page - 1 > 0) $page1left = "<a href=".$PHP_SELF."?page=". ($page - 1) .">". ($page - 1) ."</a> | ";
if($page + 2 <= $total) $page2right = " | <a href=".$PHP_SELF."?page=". ($page + 2) .">". ($page + 2) ."</a>";
if($page + 1 <= $total) $page1right = " | <a href=".$PHP_SELF."?page=". ($page + 1) .">". ($page + 1) ."</a>";
return $pervpage . $page2left . $page1left . "<b>" . $page . "</b>" . $page1right . $page2right . $nextpage;
}
?>
|
| |
|
|
|
|
|
|
|
для: 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{ //иначе выводим объявы
//тут собственно выводим объявы
}
}
|
| |
|
|
|
|
|
|
|
для: 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;
?> | |
|
|
|
|
|
|
|
для: 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);
?>
|
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(05.02.2005 в 17:29)
| | Попробую, спасибо пока! | |
|
|
|