wbtools.ru - Мониторинг курсов обмена валют на бирже платежной системы webmoney
Вход | Регистрация | Курсы WMZ/WMR | Инструменты | Форум | Контакты

Постраничный вывод данных из mysql с помощью PHP

Раздел: Администрирование
Просмотров: 4566
28.09.2012 8:26
zexis

Репутация: 1050
Постраничный вывод данных из mysql с помощью PHP
Типичной задачей программирования является вывод большого набора данных с разбиением на страницы.
Например, гостевая книга на сайте содержит 2000 строк. Вывести нужно записи постранично. По 20 записей на каждой странице.
Если передавать все строки от mysql скрипту php, это существенно увеличит трафик между mysql сервером и сервером apache.
Нет смысла передавать все 2000 строк. Нужно передать лишь те 20, которые должны быть выведены на текущей странице.
При этом нужно получить информацию о количестве всех строк, что бы знать сколько ссылок на номера страниц напечатать.

Итак, имеем таблицу mysql, которую нужно вывести постранично.
create table table1(
 id integer NOT NULL PRIMARY KEY AUTO_INCREMENT,
 txt varchar(100) NOT NULL default ""
)

Для постраничного вывода используется команда select с двумя дополнительными параметрами
Пример.
select SQL_CALC_FOUND_ROWS txt from table1 limit 0,20

После параметра limit идет два числа
limit first,num
first – номер первой строки из результата запроса, который возвращается клиенту. Первая строка имеет номер 0.
num – количество строк начиная с first, которые возвращаются клиенту.

SQL_CALC_FOUND_ROWS – говорит о том, что mysql должен вычислить количество строк в результате запроса, если бы не было limit
Это значение потом можно получить запросом SELECT FOUND_ROWS()

Код на PHP который выведет таблицу table1 постранично
<?php

//Не большая удобная функция, которая выполняет SQL запрос 
//и возвращает значение первого поля, первой строки.
function resSQL($s){
$r=mysql_query($s);
if ($row=mysql_fetch_row($r)) 
 return $row[0];
else 
 return false;
}


$mpp=20;	//Количество записей на странице
//Занести в переменную $page номер выводимой страницы
if (isset($_GET['page']))
{	$page=intval($_GET['page']);
	if ($page<=0)
		return;
}else
	$page=1;

$q=mysql_query('select SQL_CALC_FOUND_ROWS txt from table1 order by id limit '.(($page-1)*$mpp).','.$mpp);
//Количество записей SQL запроса, если бы не было параметра limit
$fr=resSQL('SELECT FOUND_ROWS()');

while($r=mysql_fetch_assoc($q))
{
	echo $r['txt'],'<HR>';
}
//Вывести номера страниц
$pc=ceil($fr/$mpp);//Вычисляем количество страниц
if ($pc>1)//Выводим номера страниц, если страниц более одной
{
	//Переменная $raz содержит символ разделителя в списке страниц. 
	//Перед первой страницей разделитель не нужен
	$raz='';
	for($n=1;$n<=$pc;$n++)//Проходим по всем страницам
	{
		echo $raz;//Печать разделителя между номерами страниц
		if ($page==$n)
			//Если выводится номер текущей страницы, 
			//то печатаем его без ссылки
			echo $n;
		else
		{//Остальные страницы печатаем как ссылки
			echo '<A HREF="/?guestbook';
			if ($n>1)
			//Начиная со 2-й страницы к URL добавляем параметр page
				echo '&page=',$n;
			echo '">',$n,'</A>';
		}
		//Заносим в переменную символ разделителя в списке страниц
		$raz=' | ';
	}
}

?>


Дата редактирования: 29.09.2012 9:54
27.01.2013 10:26
ZakazOnline

Репутация: 1000
Спасибо за детальный обзор, буду изучать
31.01.2013 11:58
Эдуард

Репутация: 1000
Способ хороший.
Я использовал другой метод вывода
С использованием
$rowCount=mysql_num_rows($q_result);
$ida=mysql_result($q_result,$rowNum,'ida');

Но ваш метод, лучше, так как в нем можно использовать select с параметром лимит.
Что позволяет соеоатить объем строк передаваемых от MYSQL
16.01.2017 0:44
ZayndabNF

Репутация: 1000
"Fake Love" is a song by Canadian recording artist Drake
Fake Love watch?v=Ql-A-rwPtpQ
YouTube: <a href=http://www.youtube.com/watch?v=Ql-A-rwPtpQ>Drake Fake Love</a>
Help to find Drake Fake Love lyrics or Fake Love lyrics
Для того что бы писать комментарии, нужно зарегистрироваться.
Войти Регистрация