10 записей на страницу

Dreamer76

Through thorns
10 записей на страницу

Вот есть у меня такой адрес:

http://www.address.ru/zap/table.php

Это большая таблица, где мого полей.
И есть там же много вариантов сортировки.

Если, например, пишем:

http://www.address.ru/zap/table.php?sort=1
то идет сортировка по дате

А если пишем:
http://www.address.ru/zap/table.php?chel=NAME
то открываются все записи, соотв. NAME

И вот у меня есть задача сделать так, чтобы на страницу выводилось не более 10 записей.

Я это реализовываю так:

В самом верху:

...
<?
if (!($num)):
$num="0";
endif;
?>
...

Далее в запросе к бд:

...
if ($sort == "1") {
$sql = "SELECT * from zapros order by date1 desc limit $num, 10";
} elseif .... и т.п.

а в самом низу мне надо сделать так:

0>> 10>> 20>> 30>>

нажимаем 10, открываются след. 10 записей (тут все ясно).

Делаю так:

for ($i=0; $i<mysql_num_rows($result); $i+=10):
echo "<a href=\"table.php?num=$i\" class=header>$i» </a>";
endfor;

и тут встает ВОПРОС:

у меня есть разные признаки сортировки. В данном примере:

table.php?sort=1
table.php?chel=NAME

Как мне сделать так, чтобы при любой сортировке открывались 10 записей. Универсально. БЕЗ привязки к chel и sort ?

Заранее спасибо!
 

Фанат

oncle terrible
Команда форума
волшебной палочкой

если нету, то придется с привязкой.
это несложно
 

Tigr

Новичок
Вот ты написал
<?
if (!($num)):
$num="0";
endif;
?>
хотя можно компактнее if (!@$num) $num=0;

а дальше у тебя есть

"<a href=\"table.php?num=$i\" class=header>$i» </a>";

Вот зачем это у тебя?
 

fixxxer

К.О.
Партнер клуба
С ифами - конечно, некузяво будет. Вот тебе идея.
PHP:
$sort_criterias = array(
  1 => 'date1 desc',
  2 => 'chel asc',
  3 => 'somethingelse asc',
  4 => 'somethingelse desc',
);

$sort_key = isset($_GET['sort']) ? intval($_GET['sort']) : 1;
$order_by = isset($sort_criterias[$sort_key]) ? $sort_criterias[$sort_key] : 1;

$sql = "SELECT a,b,c FROM table WHERE blablabla ORDER BY " . $order_by;
P.S. Сокращальщикам isset.. ? .. : до собачьих операторов просьба промолчать.
 

Фанат

oncle terrible
Команда форума
все ссылки надо выводить функцией, а не напрямую

"?".url_add("chel",$name)
"?".url_add("num",$i)
и так далее
 

Dreamer76

Through thorns
СПАСИБО, ДРУЗЬЯ!

-~{}~ 16.06.04 10:20:

Originally posted by Tigr
Вот ты написал
<?
if (!($num)):
$num="0";
endif;
?>
хотя можно компактнее if (!@$num) $num=0;

а дальше у тебя есть

"<a href=\"table.php?num=$i\" class=header>$i» </a>";

Вот зачем это у тебя?
Это ссылки постраничные внизу:

0>> 10>> 20>> 30>>

-~{}~ 16.06.04 10:24:

Originally posted by fixxxer
С ифами - конечно, некузяво будет. Вот тебе идея.
PHP:
$sort_criterias = array(
  1 => 'date1 desc',
  2 => 'chel asc',
  3 => 'somethingelse asc',
  4 => 'somethingelse desc',
);

$sort_key = isset($_GET['sort']) ? intval($_GET['sort']) : 1;
$order_by = isset($sort_criterias[$sort_key]) ? $sort_criterias[$sort_key] : 1;

$sql = "SELECT a,b,c FROM table WHERE blablabla ORDER BY " . $order_by;
P.S. Сокращальщикам isset.. ? .. : до собачьих операторов просьба промолчать.
Так. А как это привязать к:

for ($i=0; $i<mysql_num_rows($result); $i+=10):
echo "<a href=\"table.php?num=$i\" class=header>$i» </a>";
endfor;

?
 

Tigr

Новичок
Dreamer76
Я то прекрасно понимаю, то что у тебя написано и для чего, но мне кажется ты не понимаешь того что сам написал, либо я не могу понять в чем проблема то
 

Dreamer76

Through thorns
Tigr, друг!

Мне надо, чтобы при открытии любой страницы:

table.php?sort=1 или table.php?chel=NAME

у меня внизу (под таблицей) были ссылки:

10>> 20>> 30>>

т.е., таблица должна открываться по 10 уч. записей с возможностью "перелистывать" их дальше.

Но ссылка внизу у меня, стандартная:

for ($i=0; $i<mysql_num_rows($result); $i+=10):

--------------------------------------------------------------------------------
echo "<a href=\"table.php?num=$i\" class=header>$i» </a>";
--------------------------------------------------------------------------------

endfor;

и мне надо, чтобы после table.php?[ТУТ] ставилось то условие сортировки, которое соответствует той странице, которая открывается после нажатия на опред. сортировку.

Например я нажимаю "сортировать по дате" (sort=1) и у меня появляется:

echo "<a href=\"table.php?sort=1num=$i\" class=header>$i» </a>";

а если я нажму "сортировать по имени" (chel=NAME), то у меня откроется:

echo "<a href=\"table.php?chel=NAME&num=$i\" class=header>$i» </a>";

Вот. Никак не пойму, как соединить то, что ты написал с ссылками внизу, которые ЛИСТАЮТ (по 10 уч. записей) страницу :(
 

Tigr

Новичок
Значит я тебя понял правильно, но понять что тебе не понятно не могу

1. Тебе известно какой способ сортировки
На основании этого строишь запрос который подсчитывает количество записей

2. затем на основании способа сортировки, $num + LIMIT делаешь выборку данных

3. затем на основании полученного числа записей и $num строишь линки

на каком пункте у тебя сложности возникают?
 

Фанат

oncle terrible
Команда форума
добавлять в них условия сортировки, чудило!
руками!
 

Dreamer76

Through thorns
Все делаю правильно:

<?
if ($sort == "1") {

for ($i=0; $i<mysql_num_rows($result); $i+=10):
print "<a href=\"table.php?sort=1&num=$i\">$i&raquo; &nbsp;</a>";
endfor;

} else {

echo "hello world";
}
?>

В итоге он мне выдает только 10 записей (отлично!)
а внизу, где листать:



и все. :(
 

Фанат

oncle terrible
Команда форума
скажи, почему ты не пишешь if ($i=1) и далее бла-бла?
а пишешь $i?
а с сортом, почему-то
if ($sort == "1") echo sort=1
?

-~{}~ 16.06.04 12:42:

$i<mysql_num_rows($result); $i+=10
вот этому тебя кто научил?
 

Фанат

oncle terrible
Команда форума
Как сделать постраничный вывод из mysql "как в яндексе"?
по 10 записей на страницу, внизу - ссылки на остальные страницы?

Сначала научимся получать из базы нужные записи.
Их получение в mysql обеспечивается оператором LIMIT, который вызывается с двумя параметрами - с какой записи начинать, и сколько выводить (внимание! не по какую, а сколько!)
SELECT * FROM table LIMIT 0,10
этот запрос вернет записи с первой по 10, поскольку нумерация начинается с 0
соответственно, запрос для третьей страницы будет выглядеть, как
SELECT * FROM table LIMIT 20,10
получается, что нам всего лишь надо передать в скрипт число, которое потом подставить

в запрос.
Этим будет заниматься код, который выводит ссылки на страницы.
Естественно, в цикле.
Для цикла нам понадобится количество записей, которое возвращает запрос без лимита.
Это число можно получить думя путями. Либо отдельным запросом в котором отсутствует оператор LIMIT, а вместо перечисления полей после оператора SELECT запрашивается только count(*):
$q="SELECT count(*) FROM table";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];

Либо, если версия mysql больше 4.0, то общее количествострок можно запросить в том же запросе. см. документацию mysql по функции FOUND_ROWS()
Однако, первый сособ представляется более удобным, хотя и немного более медленным.

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

Для начала найдем количество страниц. Для этого надо поделить количество общее число записей на количество оных на одной странице и округлить результат в большую сторону. Таким округлением занимается в пхп функция ceil()
$num_pages=ceil($total_rows/$per_page);
В этом выражении участвует переменная $per_page, в которую мы положим количество выводимых на странице записей.
Ведь, если это количество изменится, мы же не хотим ползать по всему коду и исправлять цифры? проще сделать это один раз в начале скрипта при объявлении переменной. В запрос, вторым параметром LIMIT, подставлять нужно, конечно же, тоже ее.

Ну, а дальше, собственно, вывод ссылок.
for($i=1;$i<=$num_pages;$i++) {
echo '<a href="'.$_SERVER['PHP_SELF'].'?num='.$i*$per_page.'">'.$i+1."</a>\n";
}
в цикле от нуля до $num_pages увелчиваем $i на единицу, формируем ссылку, в которую подставляем в параметр num число, которое надо передать в LIMIT, и выводим число на ссылке на единицу больше, поскольку люди, в отличие от компьютеров привыкли считать с единицы, а не с нуля. И людям понятнее видеть номер страницы, а не записи. На код это не влияет, а людям приятно.
это самый простой и понятный способ вывести ссылки.

Дальше пойдут украшения.
Во-первых, некрасиво, что номер страницы не совпадает с тем, что видно в адресной строке. Эту проблему можно решить, передавая по ссылке номер страницы в человекопонятном формате, а в скрипте вычислять первый операнд для LIMIT.
Во-вторых,мы явно захотим выделить текущую страницу, не оформляя ее ссылкой.
В-третьих, мы захотим нумеровать записи

что у нас в результате получилось?
PHP:
// количестов записей, выводимых на странице
$per_page=10;
// получаем номер страницы
if (isset($_GET['page'])) $page=($_GET['page']-1); else $page=0;
// вычисляем первый оператор для LIMIT
$start=abs($page*$per_page);
// составляем запрос и выводим записи
// переменную $start используем, как нумератор записей.
$q="SELECT * FROM table WHERE field='value' ORDER BY field LIMIT $start,$per_page";
$res=mysql_query($q);
while($row=mysql_fetch_array($res)) {
  echo ++$start.". ".$row['field']."<br>\n";
}

// дальше выводим ссылки на страницы:
$q="SELECT count(*) FROM table WHERE field='value' ORDER BY field";
$res=mysql_query($q);
$row=mysql_fetch_row($res);
$total_rows=$row[0];

$num_pages=ceil($total_rows/$per_page);

for($i=1;$i<=$num_pages;$i++) {
  if ($i-1 == $page) {
    echo $i." ";
  else {
    echo '<a href="'.$_SERVER['PHP_SELF'].'?page='.$i.'">'.$i+1."</a> ";
  }
}
 

Dreamer76

Through thorns
Спасибо Фанат. Очень не удобно мне, что ты мне столько помогаешь, а я даже не могу тебя напоить пивом или чем-то еще. Может все же как-то где-то и как-нибудь? :)

P.s. ко всем относится, кто оказал помощь!
 
Сверху