powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / <PHP> Извлечь 1 страницу из запроса к SQL Server
13 сообщений из 13, страница 1 из 1
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33509902
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Требуется извлечь из запроса (сам он м.быть содержит очень много записей) 1 страницу (например 10) записей и отобразить впоследствии в броузере в виде grid (таблица с выделенной текущей записью) c возможностью перелистывания и др. операций над текущей записью в grid. Сначала я отправил этот post в форум SQL Server, но там молчат как рыба об лёд. Наверное, здесь отреагируют быстрее. Дело в том, что у меня хорошо с SQL, но я делаю первые шаги по работе с БД через WEB и нуждаюсь в одобрении/порицании в этой области.
В общем, я хочу замечаний типа "Ты неправ, а делать нужно вот так"
или "Базовая идея порочна по таким то причинам"
ЗАРАНЕЕ СПАСИБО

-
Ниже реализация
Во первых, написал процедуру на SQL Server 2000:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE PROCEDURE dbo.PageFromQuery @sql varchar( 8000 ), @Start int, @PageSize int
-- @sql - запрос
-- @Start - порядковый номер 1-й извлекаемой записи
-- @PageSize - число извлекаемых записей
-- процедура создаёт @PageSize наборов по 1 записи в каждом
 AS
declare @i int,
	@dcl_curs varchar( 8000 )
set @dcl_curs='declare ps cursor keyset for '+@sql
exec (@dcl_curs)
open ps
fetch absolute @Start from ps
set @i= 1 
while (@@fetch_status <> - 1  and @i<@PageSize) begin
	fetch next from ps
	set @i=@i+ 1 
end
close ps
deallocate ps
GO

Во вторых, написал PHP - ф-ю, извлекающую результат из процедуры в массив

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<?php
function ODBC_PageFromQuery($conn,$query,$start,$pagesize,&$FieldNames){
// $conn - соединение с БД
// $query - запрос
// $start - номер первой извлекаемой записи
// $pagesize - число извлекаемых записей
// $FieldNames - массив имён полей результата
// возвращает false при неудаче либо массив записей
$q="exec dbo.PageFromQuery '".$query."',".$start.",".$pagesize;
$res=odbc_exec($conn,$q);
if(!$res){
	return false;
}
$nFields=odbc_num_fields ($res);
$nRows= 0 ;
for($i= 0 ;$i<$nFields;$i++){
	$FieldNames[$i]=odbc_field_name($res, $i+ 1 );
}
do{
	while(odbc_fetch_row($res)){
		for($i= 0 ;$i<$nFields;$i++){
			$s=odbc_result ($res, $i+ 1 );
			$r[$nRows][$FieldNames[$i]]=$s;
		}
		$nRows++;
	}
}while(odbc_next_result($res));
return $r;
}
?>

и в третьих, написал пример обращения к php - ф-ии (кстати, в самом запросе ~180000 записей):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?php
include ("functions.php");
$Psw="mk";
$User="mk";
$DSN="AsuVuz";
$conn=odbc_connect($DSN,$User,$Psw,SQL_CUR_USE_ODBC);

$query='select FIO,DatePair,TimeStart,SubjName,GSName,AudName '.
'from Schedule s, Employee,Pair,Subj,Aud,GS '.
'where s.Emp_ID=Employee.Emp_ID '.
'  and s.Pair_ID=Pair.Pair_ID'.
'  and s.Subj_ID=Subj.Subj_ID'.
'  and s.Aud_ID=Aud.Aud_ID'.
'  and s.GS_ID=GS.GS_ID '.
'order by DatePair,TimeStart, FIO';
$start= 100 ;
$pagesize= 10 ;
$FieldNames=array();
$r=ODBC_PageFromQuery($conn,$query,$start,$pagesize,$FieldNames);
if($r){
	$nRows=count($r);
} else {
	exit();
}
$nFields=count($FieldNames);
echo $nRows."  ".$nFields."<br>";
for($i= 0 ;$i<$nRows;$i++){
	for($j= 0 ;$j<$nFields;$j++){
		echo $FieldNames[$j]."=".$r[$i][$FieldNames[$j]]."  ";
	}
	echo "<br>";
}
odbc_close($conn);
?>
Всё работает довольно быстро.
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33510224
paul_c0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33510229
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Специфика работы с веб, такая как малопредсказуемое количество параллельных запросов и определённые ограничения во взаимодействии с клиентами, подразумевает, что все регулярно выполняемые запросы к базе быстрые, выполняются по индексам и даже значительное их количество не вызовет существенного замедления. А в совокупности с тем, как строится взаимодействие с клиентом, использование курсора не даёт особых выгод и вполне можно ограничиться запросами с LIMIT.
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33510395
?????
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DocAl...вполне можно ограничиться запросами с LIMIT . а разве его есть в авторSQL Server 2000 ?
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33510465
Yorick.kiev.ua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
????? DocAl...вполне можно ограничиться запросами с LIMIT . а разве его есть в авторSQL Server 2000 ?

Есть TOP
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33510908
?????
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yorick.kiev.ua
Есть цитата из ссылки: paul_c0 Постраничная выборка
TOP n записей выбираются уже из конечного результата запроса, то проверка условия WHERE будет выполняться для каждой строки главного запроса. При этом, время выполнения этой проверки будет расти вместе с номером выбираемой порции(страницы).
И есть ~180000 записей у автора.
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33511503
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за реплики, коллеги.
>DocAl
LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)
>др. замечания:
Я не использую нумерацию записей и мне не нужно TOP. Вместо этого я сразу перехожу к начальной записи страницы:
Код: plaintext
fetch absolute @Start from ps
Если вы дадите себе труд попробовать, то убедитесь, что на одной таблице без lookup полей результат получается практически мгновенно. Я не заметил зависимости от объёма выборки запроса, хлтя она должна быть логарифмической (индексы в В-деревьях).
-
Но суть то не в этом. Я писал:
Я самТребуется извлечь из запроса (сам он м.быть содержит очень много записей) 1 страницу (например 10) записей и отобразить впоследствии в броузере в виде grid (таблица с выделенной текущей записью) c возможностью перелистывания и др. операций над текущей записью в grid.
Прошу направить критику в этот адрес. Речь идёт о корпоративной БД. Хотелось бы , как в двузвенке, иметь всю информацию для выполнения операции на одной компактной странице. А это значит - 3-4 grid, пару ComboBox, неск. флажков может что то ещё. И всё это взаимодействует. Стоит ли двигаться в эту сторону или я нарвусь на серьёзные проблемы?
Примеры:
- куча торговых точек (некоторые в Австралии) на 1 БД
- продать желдор билет
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33511707
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
muk07LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)LIMIT не имеет никакого отношения к PHP - это инструкция SQL.
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33512071
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* muk07LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)LIMIT не имеет никакого отношения к PHP - это инструкция SQL.
Которой, похоже, в MSSQL действительно нету.(
Подложили мелкомягкие свинью, однако...
А какой-нибудь rownum или что-то подобное есть, может быть?
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33512121
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
DocAl * muk07LIMIT не имеется для PHP - функций odbc_ и mssql_ (по моему так)LIMIT не имеет никакого отношения к PHP - это инструкция SQL.
Которой, похоже, в MSSQL действительно нету.(
Подложили мелкомягкие свинью, однако...
А какой-нибудь rownum или что-то подобное есть, может быть?Наверняка есть аналог.
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33512223
muk07
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последний раз вопрошаю, уже почти не надеясь:
muk07Прошу направить критику в этот адрес --> Речь идёт о корпоративной БД. Хотелось бы , как в двузвенке, иметь всю информацию для выполнения операции на одной компактной странице. А это значит - 3-4 grid, пару ComboBox, неск. флажков может что то ещё. И всё это взаимодействует. Стоит ли двигаться в эту сторону или я нарвусь на серьёзные проблемы?
Примеры:
- куча торговых точек (некоторые в Австралии) на 1 БД
- продать желдор билет
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33512235
DocAl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muk07Последний раз вопрошаю, уже почти не надеясь:
muk07Прошу направить критику в этот адрес --> Речь идёт о корпоративной БД. Хотелось бы , как в двузвенке, иметь всю информацию для выполнения операции на одной компактной странице. А это значит - 3-4 grid, пару ComboBox, неск. флажков может что то ещё. И всё это взаимодействует. Стоит ли двигаться в эту сторону или я нарвусь на серьёзные проблемы?
Примеры:
- куча торговых точек (некоторые в Австралии) на 1 БД
- продать желдор билет
Вопрос слишком неконкретен, потому и ответить сложно.
ОбщО можно ответить лишь только что HTML позволяет создавать достаточно сложные формы, в связке с JS можно добиться сложного влияния их элементов друг на друга, однако ограничения накладываемые JS на изменения состояния формы следует учитывать лишь как вспомогательные, и на стороне сервера следует обязательно проверять сообщённые значения на корректность.
...
Рейтинг: 0 / 0
<PHP> Извлечь 1 страницу из запроса к SQL Server
    #33512372
msh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 * : аналога сожалению нет.
Но как вариант можно сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE PROCEDURE sp_viewpage @Rows INT, @pagenumber INT
AS
DECLARE
  @Handle     INT,
  @TotalRows  INT,
  @thispage   INT
EXEC sp_cursoropen
            @Handle OUT,
            'select BranchCode, BranchName from info_table_9es',  1 ,  1 ,
            @TotalRows OUT
SET @thispage =  1  + @Rows * (@pagenumber -  1 )
EXEC sp_cursorfetch @Handle,  16 , @thispage, @Rows

--например, выведем 15-ть строк второй страницы
EXEC sp_viewpage  15 ,  2 
Далее фетчить по потребностям :-)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / <PHP> Извлечь 1 страницу из запроса к SQL Server
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]