Forum Webscript.Ru

Программирование => PHP => Тема начата: scasic от 09 Июля 2002, 14:48:34

Название: постраничный вывод своими кривыми руками
Отправлено: scasic от 09 Июля 2002, 14:48:34
критикуйте пожалуйста

Код:

// Переменные
$links_number=3; // коли-во ссылок на странице
$lines_number=7; // кол-во строк на странице

// Проверяем данные от броузера
if (!isset($a)){$a=0;} // где $a - идентификатор для LIMIT

// Подключение к базе данных
$db=mysql_connect ("localhost","user","user");
if (!$db){
echo "Ошибка при соединении с базой данных";
}
mysql_select_db("base");

// получаем количество строк
$query = "SELECT * FROM table WHERE zapros=\'$do\'";
$result = MYSQL_QUERY($query);
$number = MYSQL_NUMROWS($result);

//проверка наличия идентификатора страницы
if (!isset($page)){$page="0";}

// получаем общее кол-во страниц для вывода
$number_of_pages=$number/($links_number*$lines_number);
$number_of_pages1=(int)$number_of_pages;
if ($number_of_pages>$number_of_pages1){$number_of_pages=$number_of_pages1+1;}

// получаем количество общее кол-во ссылок
$number_of_links=$number/$lines_number;
$number_of_links1=(int)$number_of_links;
if ($number_of_links>$number_of_links1){$number_of_links=$number_of_links1+1;}

// проверяем сколько ссылок на последней странице
if ($page==($number_of_pages-1)){
$cycle=($links_number-(($number_of_pages*$links_number)-$number_of_links));
}
else {$cycle=$links_number;}

$z=$page*$links_number*$lines_number;

// создаем навигационное меню с сылками
for ($i=1; $i <= $cycle; $i++){
if ($i==$pn){$link = $link."[".($z+1)."..".($z+$lines_number)."] ";}
else {$link = $link."href=\\"?do=$do&tab=$tab&sort=$sort&a=$z&page=$page&pn=$i\\">[".($z+1)."..".($z+$lines_number)."] ";}

// ссылки "следующие" справа и "предыдущие" слева
if ($i==$cycle){
if ($page=="0"){$lgo="";}
else {$lpage=$page-1;
      $lz=$z-($lines_number*$links_number);
      $lgo="href=\\"?do=$do&tab=$tab&sort=$sort&a=$lz&page=$lpage&pn=$links_number\\"><< ";}
if ($page==($number_of_pages-1)){$rgo="";}
else {$rpage=$page+1;
      $rz=$z+$lines_number;
      $rgo=">>";}    
$link=$lgo.$link.$rgo;}

$z=$z+$lines_number;
}                                        


// извлекаем информацию из базы данных
$query = "SELECT * FROM table WHERE zapros=\'$do\' ORDER BY $sort LIMIT $a,$lines_number";
Название: постраничный вывод своими кривыми руками
Отправлено: Alexandr от 10 Июля 2002, 08:39:45
Чё велик изобретать. Есть готовые решения:
http://detail.phpclub.net/technique/01-04-28/

Хотя не везде эта беда - лучшее решение.
Т.к., например, у меня в нек. скриптах нет возможности подсчитать общее количество записей.
Название: постраничный вывод своими кривыми руками
Отправлено: Гаррилл от 10 Июля 2002, 21:33:12
А у меня вот так:

function multipage($num_rows_per_order, $pagesize, $num_articles, $pageurl, $page) {
                  echo "
";
if ( $num_rows_per_order > $pagesize ) {
$total_pages = ceil($num_rows_per_order / $pagesize); // How many pages are we dealing with here ??
                  echo "$num_rows_per_order "._STORIESFOUND." ($total_pages "._PAGES.", $num_articles "._SHOWN.")

";
echo "[";
  if ($num_rows_per_order >= $pagesize)
  {
    $num_rows_per_order++;
    $pages = $num_rows_per_order / $pagesize;
    $pages = ceil($pages);
    if ($page == $pages) { $to = $pages;  }
elseif ($page == $pages-1) { $to = $page+1; }
elseif ($page == $pages-2) { $to = $page+2; }
else { $to = $page+3; }
    if ($page == 1 || $page == 2 || $page == 3) { $from = 1; }
else   { $from = $page-3;}
$prev_page = $page - 1;
                  if ( $prev_page > 0 ) {
$fwd_back .= "  1  |  ...  |  <<  |";
} else {  
                  }
for ($i = $from; $i <= $to; $i++)
{
if($i != $page) { $fwd_back .= "  $i  |"; }
else { $fwd_back .= "  $i  |"; }
}
                  $next_page = $page + 1;
                  if ( $next_page <= $total_pages ) {
$fwd_back .= "  >>  |  ...  |  $pages ";
} else {
}
echo "$fwd_back";
}
echo " ]";
} else {
echo "$num_rows_per_order "._STORIESFOUND."";
}
                  echo "
";
}


Смотреть тут http://ru-nuke.sourceforge.net/ внизу и через поиск http://ru-nuke.sourceforge.net/modules.php?name=Search
Функция используется везде одна.
Название: постраничный вывод своими кривыми руками
Отправлено: scasic от 15 Июля 2002, 13:46:03
Гаррилл, я у тя глюк нашел
правь

5 горячих тем на форуме
» Апдейты
смотров: 1 ответов: 0, последним ответил Pups (Понедельник, 15 Июля 2002 7:51:36)
Название: постраничный вывод своими кривыми руками
Отправлено: advocat от 15 Июля 2002, 14:22:36
Да оба кода неплохи, хотя у меня совсем по другому сделано, буду дома - кину код ... Там правда 2 обращения к базе, одно для кол-во второе с лимитом, что-бы не ораничивать все через for ...
Название: постраничный вывод своими кривыми руками
Отправлено: Меняздесьдавнонет от 15 Июля 2002, 14:31:39
вот это
$number_of_pages=$number/($links_number*$lines_number);
$number_of_pages1=(int)$number_of_pages;
if ($number_of_pages> $number_of_pages1){$number_of_pages=$number_of_pages1+1;}
заменяется на
$number_of_pages=ceil($number/($links_number*$lines_number));

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

непонятно, зачем дублировать информация. $a можно вычислить из $page.
нормальные имена переменных соседствуют с какими-то а, з.
Неохота разбираться.

Как-то у вас, ребята, уж больно наворочено...
я передаю сразу номер записи, с котрой начинать, безо всяких страниц. И все.

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

$pages=ceil($tolal_rows/$rows_per_page);
for ($i=1; $i<=$pages; $i++) {
  $from=$i*$rows-($rows-1);
  $to=$i*$rows;
  if ($to > $total_rows) $to = $total_rows;
  if ($limit==$from) echo $from,"-",$to;
    else echo \'\',$from,"-",$to,\'\';
echo " ";
}

Если выводить не номера записей, а номера страиц, то получится еще проще

$pages=ceil($tolal_rows/$rows_per_page);
for ($i=1; $i<=$pages; $i++) {
  $from=$i*$rows-($rows-1);
  if ($limit==$from) echo $i," ";
    else echo \'\',$i,\' \';
}

еще только в запросе писать LIMIT $limit-1, $rows_per-page
Название: постраничный вывод своими кривыми руками
Отправлено: Меняздесьдавнонет от 15 Июля 2002, 14:43:52
из еще красивостей
Вместо
db=mysql_connect ("localhost","user","user");
if (!$db){
echo "Ошибка при соединении с базой данных";
}
пишется
mysql_connect ("localhost","user","user") or die("Ошибка при соединении с базой данных");
Если не хочешь die, то пиши просто echo. Но убивать скрипт предпочтительней - все равно ничего работать не будет уже.
Название: постраничный вывод своими кривыми руками
Отправлено: scasic от 16 Июля 2002, 10:04:48
RomikChef весьма и весьма поучительно
thanx
Название: постраничный вывод своими кривыми руками
Отправлено: scasic от 16 Июля 2002, 12:58:48
2RomikChef
Цитировать
заменяется на
$number_of_pages=ceil($number/($links_number*$lines_number));


правда здорово, выигрыш на лицо (я знал что есть такая функция, но в тех книжках которые имеются на руках про нее ничего не сказано)

Цитировать
Для того, чтобы понять дальше, надо понимать, чем ссылки на странице отличаются от строк на странице.

Здесь я имел ввиду следующее:

$links_number=3; // кол-во ссылок в навигационном меню
$lines_number=7; // кол-во строк полученных из базы и отображенных на странице

надеюсь теперь этот момент стал более прозрачным

Цитировать
Да и вообще - что проверять-то?

Проверять безграмотность и поучать чтобы больше неповадно было всякие навароченные глупости писать :) вот видишь сколько полезного и рационального ты уже внес в этот код
Название: постраничный вывод своими кривыми руками
Отправлено: Гаррилл от 16 Июля 2002, 13:03:43
scasic
Это не глюк.