Перейти к содержимому



Постраничный вывод данных

#1 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1
0

Отправлено 20 Май 2011 - 08:14

Нашел в интернете функцию разбития на страницы, тоесть функцию, которая организовывает постраничный вывод данных.
Теперь не могу до конца с ней разобраться:

function num_page($page,$num='',$get='yes')
{
global $rows_page;
$num=(empty($num)) ? $rows_page : $num;
$num_rows=mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0); // количество строк данных в таблице, или не?
$num_page=ceil($num_rows/$num); //количество страниц, округляем их
if(!isset($page) or empty($page) or $page>$num_page){$page=1;} // типа защита от нубов и вычисление первой страницы
$str=array();
$get_q='';
if($get=='yes') // нахрен?
{
foreach($_GET as $k => $v) // это не сильно понял, и то что ниже
{
if($k!='page')
{
if(is_array($v))
{
foreach($v as $val)
{
$get_q.=$k.'[]='.urlencode($val).'&';
}
}else{
$get_q.=$k.'='.urlencode($v).'&';
}
}
}
}
for($i=1;$i<=$num_page;$i++)
{
$str[]=($i!=$page) ? "<a href=\"?".$get_q."page=".$i."\">".$i."</a>" : "<b>".$i."</b>";
}
return $str;
}


Пример использования:
$rows_page=25; // количество строк из БД на странице
if(!isset($_GET['page']) or !(int)$_GET['page']){$_GET['page']=1;}
$query=mysql_query("select SQL_CALC_FOUND_ROWS * from table limit ".(($_GET['page']-1)*$rows_page).", ".$rows_page);
$count_page=num_page($_GET['page']);
echo "<br>Страницы: ".implode(', ',$count_page);


 

 

  • 0


#2 WorkOnFood

WorkOnFood
  • Пользователь
  • 1 сообщений
  • Репутация: 0

Отправлено 22 Май 2011 - 17:28

Не понятно зачем строчка if(!isset($_GET['page']) or !(int)$_GET['page']){$_GET['page']=1;}, исползуется в примере использования если уже есть строчка if(!isset($page) or empty($page) or $page>$num_page){$page=1;} в самой функции. if($get=='yes') - действительно не понятно зачем. FOUND_ROWS() применяется в связке с использованным до него SQL_CALC_FOUND_ROWS для подсчета общего количества записей в таблице, при использовании limit в запросе.
  • 0

#3 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 31 Май 2011 - 22:25

Banderas, функция приведенная тобой тупо формирует ссылки на страницы (не забывает и текущие get-параметры заново в ссылку запихнуть):
function num_page($page,$num='',$get='yes')
{
global $rows_page; // количество данных на страницу
$num=(empty($num)) ? $rows_page : $num; // можно переопределить количество данных на страницу, если второй параметр передан
$num_rows=mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0); // общее количество данных в таблице БД (без лимита)
$num_page=ceil($num_rows/$num); //Определяем сколько у нас получается страниц, округляем до большего (если до меньшего -> не учтем последние записи неполной страницы)
if(!isset($page) or empty($page) or $page>$num_page){$page=1;} // если $page == 0 или не существует (тут этого не случится, параметр обязательный) или привысили общее количество страниц - скидываем на первую
$str=array(); // здесь будут храниться сформированные ссылки на страницы + текущая
$get_q=''; // здесь будет сформированная строка со всеми GET-параметрами текущей страницы (для сохранения передаваемых GET-параметров, допустим у нас на них заданы подключения модулей)

// если параметр -> формировать строку с GET-параметрами
if($get=='yes')
{
// перебираем весь массив GET-параметров с текущей страницы (ключ => значение)
foreach($_GET as $k => $v)
{
// page нам напфиг не нужно, его формирует данная функция, а все остальные обрабатываем и формируем строку запроса
if($k!='page')
{
// если параметр - массив (да... в get можно передавать массивы - ?param[]=...&param[]=...)
if(is_array($v))
{
// обходим все элементы массива параметра (например param)
foreach($v as $val)
{
$get_q.=$k.'[]='.urlencode($val).'&'; // добавляем на каждой итерации - key[]=value&
}
}else{
// если не массив
$get_q.=$k.'='.urlencode($v).'&'; // добавляем key=value&
}
}
}
}

// формируем ссылки на страницы с 1-ой по последнюю
for($i=1;$i<=$num_page;$i++)
{
$str[]=($i!=$page) ? "<a href=\"?".$get_q."page=".$i."\">".$i."</a>" : "<b>".$i."</b>"; // если не текущая - ссылка, если текущая - выделяем жирным
}
return $str; // возвращаем массив с ссылками + текущая страница
}


Всё тривиально :(
SELECT FOUND_ROWS()

Возвращает количество записей из предыдущего запроса SELECT без учета LIMIT (счетаем все записи). Но для использования данной функции в предыдущем запросе после слова SELECT должно идти - SQL_CALC_FOUND_ROWS
  • 0


Оформление форума – IPBSkins.ru