asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 3302
ASPCode.it - Store

  > > Articoli

Paginazione con MySQL

Data di pubblicazione: 19/04/2006        Voto della community: 4,13 (Votanti: 13)

Un tipico problema che si affronta quando si utilizza come base di dati MySQL piuttosto che MS Access è legato al fatto che i driver ODBC attualmente disponibili per tale base di dati non supportano i metodi tipicamente utilizzati con MS Access per paginare i risultati di una interrogazione su una base di dati. Se infatti i driver del database di casa Microsoft consentono di utilizzare proprietà e metodi dell'oggetto ADODB.RecordSet come PageSize (per impostare il numero di record di ogni pagina dei risultati) o AbsolutePage per selezionare la pagina del recordset corrente su cui posizionarsi, i driver forniti con MySQL implementano un oggetto RecordSet non dotato di tali funzionalità. Tuttavia, è possibile ovviare a questa limitazione, sfruttando la parola chiave LIMIT (dal linguaggio SQL standard) integrandola alle interrogazioni SQL di cui intendiamo paginare i risultati.

La clausola LIMIT consente di limitare il numero di risultati restituiti da una interrogazione e può essere utilizzata con uno o due parametri. La stringa SQL seguente ad esempio:

SELECT * FROM <tabella> LIMIT 10

restituisce i primi 10 record della tabella specificata.
L'utilizzo di due parametri consente di specificare la posizione di partenza da cui iniziare a restituire record; la query seguente:

SELECT * FROM <tabella> LIMIT 7, 10

restituisce 10 record della tabella specificata a partire dal settimo record.

Sfruttando dunque questa funzionalità SQL estrarremo dal risultato i soli record che corrispondono alla pagina che intendiamo visualizzare. Nella seguente sezione di codice vedremo come implementare il tutto in una pagina ASP che chiameremo default.asp:

<%

dim currentPage, pageSize, recordCount, pageCount

' imposta il numero di record da visualizzare in ogni pagina
pageSize = 20

' "leggi" la pagina corrente dalla querystring
if(len(Request.QueryString("page"))=0)then
  currentPage = 1
else
  currentPage = CInt(Request.QueryString("page"))
end if


dim cn, rs, sql

' apri la connessione al database
set cn = Server.CreateObject("ADODB.Connection")
cn.Open "Driver={MySQL ODBC 3.51 Driver};Server=127.0.0.1;Database=miodatabase;user=root;password=miapass;"

' conteggia il numero di record totali della query e il numero di pagine (per la visualizzazione dei link delle altre pagine)
sql = "SELECT COUNT(*) AS CNT FROM <tabella>"
set rs = cn.execute(sql)
recordCount = rs("CNT")
' ottieni il numero delle pagine totali
pageCount = int(CInt(recordCount) / pageSize)
rs.Close()

' seleziona i record da visualizzare nella pagina corrente
sql = "SELECT * FROM <tabella> " &_
      " LIMIT " & (currentPage - 1) * pageSize & ", " & pageSize

set rs = cn.execute(sql)
      
' visualizza il contenuto del recordset
do while not rs.eof
  Response.Write(rs("NOME_CAMPO") & "<br>")
  rs.MoveNext()
loop

rs.Close()
set rs = nothing

' chiudi la connessione al database
cn.Close()
set cn = nothing


' visualizza i link alle pagine
dim i
for i=1 to pageCount
  Response.Write("<a href=""default.asp?page=" & i & """>" & i & "</a> ")
next

%>

Il codice è ampiamente commentato, un'attenta analisi dello stesso dovrebbe chiarirne i passaggi principali. Da notare che la query deve essere eseguita due volte: una prima volta per conteggiare il numero totale di record allo scopo di valutare il numero di pagine e quindi di link da visualizzare, una seconda per estrarre i record effettivi che corrispondono alla pagina che deve essere visualizzata. La porzione di codice in grassetto corrisponde alla query di paginazione. Ovviamente nella stringa di connessione è necessario sostituire i parametri del proprio database MySQL.




Utenti connessi: 3302