Постраничный вывод из таблиц MSSQL с помощью 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);

?>

Затем выводим перечисление страниц: <? echo "<p>".@$nump[page]."</p>"; ?>

В данном примере, у вас будут выводится записи в обратной последовательности, начиная с последней в таблице по 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

Вот в принципе и все.

Автор: Юрий Ишкин