- Подробности
-
Категория: PHP. Базы данных
Статья слегка некорректная, ищите первоисточник
На многих форумах по PHP видел один и тот же вопрос «Как сделать постраничный вывод из MSSQL?». Ответом очень часто служит «Все очень просто, используйте limit и все работает!», но, те кто дает такой ответ, видимо никогда не видели MSSQL достаточно близко и не знают, что к большому сожалению, там данной функции, в отличии от MySQL, нет. Я в своей практике написания сценариев на php, так же в основном пользовался связкой PHP + MySQL и вопросов не возникало. Но вот надо было перейти на хостинг с установленным MSSQL. После долгих поисков скрипта, который позволял бы сделать постраничный вывод из таблиц MSSQL с помощь PHP, без использования курсоров и ADO, и не найдя ничего, пришлось написать функцию, которая как раз и занимается обсуждаемым рутинным делом.
В основу постраничного вывода был положен запрос:
select top нужное_количество_для_вывода *
from (select top количество_записей_из_которых_делается_вывод *
from таблица
order by таблица_id) as t1
order by таблица_id desc
(таблица_id — поле вашей таблицы, по которому вы будете осуществлять сортировку)
Для работы нужной нам функции и правильной работы данного запроса надо знать несколько величин:
1) нужное количество строк для вывода
2) количество записей из которых делается выбор
3) на какой страницы мы находимся
4) сколько всего страниц.
Получившаяся функция выглядит так:
<?
if (!@$_GET["page"]) { # если переменной с номером страницы еще нет, то создаем ее
$page=1; # и присваиваем ей значение 1
} else { $page=$_GET["page"]; } # иначе, присваиваем ей значение нажатой страницы
# объявляем функцию с названием numberpage, имеющей следующие параметры:
# 1) количество выводимых строк на каждой странице,
# 2) название таблицы, которую выводим постранично,
# 3) дополнительные параметры выбора запроса, например: where поле_какоето1=чемуто
# and поле_какоето2=томуто.
# не забудьте, что данные дополнительные параметры должны быть и в самом запросе, иначе
# вы получите неверные значения.
function numberpage($len,$tablename,$dopquerysql) {
global $page;
global $nump;
# формируем массив для возврата значений из функции
$nump=array("page"=>"","numers"=>"","len"=>"0","all"=>"0","top1"=>"0","top2"=>"0");
# получаем URL страницы, с которой вызвали функцию
$namepage=@$PATH_INFO;
# вычисляем количество строк в запросе
$nu=@mssql_query("select count(1) as ss from $tablename $dopquerysql"); $nrow=@mssql_fetch_array($nu);
$all=$nrow['ss'];
@$pages=ceil($all/$len)-1;
if (@$page==(@$pages+1)) { $top1=$all-(($page-1)*$len); $top2=$all;
} else { $top1=$len; $top2=$page*$len; }
if (@$len>=$all) { $top1=$all; $top2=$all; }
$numers=($page-1)*$len;
@$q=$all/$len;
# готовим массив с номерами страниц
if ($q>1) {
for ($p=0; $p<=$pages; $p++) {
$pag=$p+1;
@$nump[page]="$nump[page][<a href = '$namepage?page=$pag".$dopnum."'>$pag</a>] ";
}
}
# подготавливаем массив с конечными результатами и выводим его
$nump["page"]=@$nump[page];
$nump["numers"]=$numers;
$nump["len"]=$len;
$nump["all"]=$all;
$nump["top1"]=$top1;
$nump["top2"]=$top2;
return $nump;
}
?>
Данную функцию можно расположить в файле с вашими конфигурациями всего вашего проекта и вызывать ее на каждой страницы, где вы собираетесь делать постраничный вывод. Например: файл конфигурации у вас называется myconfig.php, значит, на каждой странице вставляем <? require(“myconfig.php”); ?>
Теперь переходим непосредственно к выводу нашей таблицы в браузере. Сразу определяемся, сколько у нас будет выводится на экран строк таблицы, или делаем форму для выбора количества строк пользователем. Форму я тут приводить не буду, так как это выходит за рамки статьи и достаточно легко, чтоб на этом останавливаться.
Перед выводом таблицы вызываем функцию (будем выводить по 10 строк на странице из таблицы наша_таблица где поле2 содержит слово КАКОЕТОЗНАЧЕНИЕ и поле5 равно 12):
<? numberpage("10","наша_таблица","where поле2 like ‘%КАКОЕТОЗНАЧЕНИЕ%’ and поле5=12"); ?>
Помните, что если у вас нет никаких дополнительных параметров выбора, просто оставьте значение пустым, и вы получите выбор из всех полей таблицы. Например: <? numberpage("10","наша_таблица",""); ?>, соответственно убрав данное условие и при выводе самой таблицы.
Затем, в нужном нам месте выводим саму таблицу:
<?
$grn=@mssql_query("select * from (select top $nump[top1] * from (select top $nump[top2] * from наша_таблица where поле2 like ‘%КАКОЕТОЗНАЧЕНИЕ%’ and поле5=12 order by таблица_ID desc) as t1 order by таблица_ID ) as t2 order by таблица_ID desc",$link);
for($gd=0; $gd<@mssql_num_rows($grn); $gd++) {
$gr=@mssql_fetch_array($grn);
?>
Затем выводим перечисление страниц: ".@$nump[page].""; ?>
В данном примере, у вас будут выводится записи в обратной последовательности, начиная с последней в таблице по 10 к первой. Если вам надо, чтобы записи выводились с первой и далее, то скрипт надо модифицировать:
select * from (select top $nump[top1] * from (select top $nump[top2] * from наша_таблица order by таблица_ID) as t1 order by таблица_ID desc ) as t2 order by таблица_ID
Вот в принципе и все.