Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
ZooY
Зарегистрирован: 15.01.2002 Сообщения: 210 Откуда: Россия, Москва
|
Добавлено: Ср Окт 13 2004 22:09 Заголовок сообщения: Постраничный вывод из MS SQL на PHP |
|
|
Подскажите как сделать постраничный вывод из MS SQL на PHP.
К SQL конектюсь через стандартную библиотеку (php_mssql) |
|
Вернуться к началу |
|
|
Scaramouch
Зарегистрирован: 11.01.2004 Сообщения: 143 Откуда: Столица нашей Родины
|
Добавлено: Чт Окт 14 2004 08:28 Заголовок сообщения: |
|
|
А в чем проблема? В мсскуле тоже LIMIT есть, как и в любой другой нормальной реляционной базе _________________ Ноги - это две лишние руки. |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Чт Окт 14 2004 09:42 Заголовок сообщения: |
|
|
Кстати в MSSQL, по-моему, нет limit, есть top, но он менее функционален, позволяет выбрать только первые n-строк результата.
Лично, я, когда делал, постраничный вывод, с MSSQL, сохранял некоторые данные, на стороне сервера (о стурктуре и составе страниц). Может есть и другой вариант _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
ZooY
Зарегистрирован: 15.01.2002 Сообщения: 210 Откуда: Россия, Москва
|
Добавлено: Чт Окт 14 2004 10:28 Заголовок сообщения: |
|
|
Ага, LIMIT нету, поэтому и мучаюсь |
|
Вернуться к началу |
|
|
Scaramouch
Зарегистрирован: 11.01.2004 Сообщения: 143 Откуда: Столица нашей Родины
|
Добавлено: Чт Окт 14 2004 13:11 Заголовок сообщения: |
|
|
Да, я был неправ, прошу прощения
Может такой вариант:
Код: | $query = 'SELECT TOP '.$onPage.' * FROM Table WHERE OrderField > ALL(SELECT TOP '.($pageNumber * $onPage).' OrderField FROM Table ORDER BY OrderField) ORDER BY OrderField'; |
Естесственно, если DESC, то надо поменять > на <.
Да, а есть ли в мсскуле ALL? _________________ Ноги - это две лишние руки. |
|
Вернуться к началу |
|
|
Alexandr 172
Зарегистрирован: 03.09.2004 Сообщения: 66 Откуда: Челябинск
|
Добавлено: Чт Окт 14 2004 14:33 Заголовок сообщения: |
|
|
Не, все таки лучше по-другому. Но с использованием, например, сессий.
При первом запросе выборки документов (или еще чего-нибудь),
разбиваем все документы на страницы, и в сессии сохраняем какие документы какой страницы принадлежат (например, сохраняем их id).
А при запросе определенной страницы достаем из сессии id соответсвующих документов и делаем выборку из базы уже только этих документов. _________________ www.pay-ace.com/Ras254 - всем в подарок $150 |
|
Вернуться к началу |
|
|
ZooY
Зарегистрирован: 15.01.2002 Сообщения: 210 Откуда: Россия, Москва
|
Добавлено: Пт Окт 15 2004 09:55 Заголовок сообщения: |
|
|
2 Alexandr 172
Хранение данных в сессии опадает, реч идет о постраничном выводе каталога товаров, ооооочень большого каталога.
2 Scaramouch
А что должно содержать поле OrderField? |
|
Вернуться к началу |
|
|
ZooY
Зарегистрирован: 15.01.2002 Сообщения: 210 Откуда: Россия, Москва
|
Добавлено: Пт Окт 15 2004 09:55 Заголовок сообщения: |
|
|
2 Scaramouch
Я кажись понял |
|
Вернуться к началу |
|
|
ZooY
Зарегистрирован: 15.01.2002 Сообщения: 210 Откуда: Россия, Москва
|
Добавлено: Пт Окт 15 2004 09:57 Заголовок сообщения: |
|
|
А нельзя сделать также как на ASP, через рекордсеты и курсоры? |
|
Вернуться к началу |
|
|
Scaramouch
Зарегистрирован: 11.01.2004 Сообщения: 143 Откуда: Столица нашей Родины
|
Добавлено: Пт Окт 15 2004 11:05 Заголовок сообщения: |
|
|
Ну OrderField - это то поле, по которому идет сортировка, ведь иначе нет смысла говорить о постраничном выводе.
В сессии можно хранить. даже если у тебя 100000 товаров, что мешает тебе хранить массив в 100000 элементов
На самом деле даже меньше, тебе ведь надо только запомнить начальное(или конечное) значение OrderField для каждой страницы.
А как бы ты это сделал на ASP? Я просто в нем не силен, но если алгоритм опишешь, может, что и посоветовал бы _________________ Ноги - это две лишние руки. |
|
Вернуться к началу |
|
|
ZooY
Зарегистрирован: 15.01.2002 Сообщения: 210 Откуда: Россия, Москва
|
Добавлено: Пт Окт 15 2004 11:22 Заголовок сообщения: |
|
|
Ну например вот вывод новостей постранично. Правда БД не MS SQL, а Access, но я думаю это не принципиально
Код: |
rsPageSize = 20
If Request("Page") <> "" Then sPage = Request("Page") Else sPage = 1
Dim objConnection
Dim objRecordset
Set objConnection = Server.CreateObject("ADODB.Connection")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db.mdb") & ";"
Set objRecordset = Server.CreateObject("ADODB.Recordset")
objRecordset.Open "SELECT * FROM News ORDER BY Äàòà DESC", objConnection, 3, 3
' или вместо последниз 3,3 можно указать так
'objRecordset.CursorLocation = 3
'objRecordset.CursorType = 3
objRecordset.PageSize = rsPageSize
objRecordset.AbsolutePage = sPage
Dim i
i = 0
Do While (Not objRecordset.EOF) AND (i<objRecordset.PageSize)
Response.Write "<B>"
If Day(objRecordset("Äàòà"))<10 Then Response.Write "0"
Response.Write Day(objRecordset("Äàòà")) & "."
If Month(objRecordset("Äàòà"))<10 Then Response.Write "0"
Response.Write Month(objRecordset("Äàòà")) & "." & Year(objRecordset("Äàòà"))
Response.Write "</B><P>"
Response.write objRecordset("Ïîëí_èíô")
Response.Write "</P><BR>"
i=i+1
objRecordset.MoveNext
Loop
'<!-- Navigation -->
Response.Write "<BR><CENTER>"
If sPage > 1 then Response.Write "<A href='news.asp?page=" & sPage-1 & "'><<</A>"
If ((sPage+1)*rsPageSize - objRecordset.RecordCount) < rsPageSize then Response.Write "<A href='news.asp?page=" & sPage+1 & "'>>></A>"
objRecordset.Close
objConnection.Close
Set objRecordset = Nothing
Set objConnection = Nothing
|
|
|
Вернуться к началу |
|
|
Scaramouch
Зарегистрирован: 11.01.2004 Сообщения: 143 Откуда: Столица нашей Родины
|
Добавлено: Пт Окт 15 2004 14:08 Заголовок сообщения: |
|
|
Ну ясно.
Но как мс реализовал класс рекордсет никто не знает.
Так что как работают эти самые свойства pagesize и absolutepage я понятия не имею.
Может они вообще всю таблицу из базы берут _________________ Ноги - это две лишние руки. |
|
Вернуться к началу |
|
|
|