In un precedente articolo abbiamo visto la tecnica per impostare la paginazione per query che restituiscono molti risultati in termini di mole di dati ed abbiamo analizzato il sistema per affidare all’oggetto Recordset l’intero compito gestire la paginazione, ma questo sistema, attraverso ASP, funziona solo con database di casa Microsoft come Access ed SQL Server, ma non col database oggetto di questo articolo: MySQL.
Si crei un database MySQL di esempio sul proprio server corredato dalla tabella “utenti” composta, a sua volta, dai campi “id” (Autoincrement) “nome” (Varchar) e “cognome” (Varchar) e la si popoli di dati di esempio attraverso una INSERT generata attraverso un file ASP, oppure utilizzando il software, o webware, che si è scelto per gestire MySQL ad interfaccia GUI.
Si crei adesso il file “report.asp”, lo si corredi del seguente codice e lo si esegua sul proprio server Web:
<%@LANGUAGE = VBScript%>
<%
Dim pag
pag = Request.QueryString("pag")
If IsNumeric(pag) = False Or pag < 1 Then pag = 1
Dim cn, rs
Set cn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
cn.Open ' STRINGA DI CONNESSIONE A MYSQL
%>
<html>
<head>
<title>Paginazione dei dati con ASP e MySQL</title>
</head>
<body>
<div align="center">
<%
rs.Open "SELECT COUNT(id) AS temp FROM utenti", cn, 1
Dim quanti, a, b
quanti = CInt(rs("temp"))
rs.Close
If quanti > 0 Then
Dim SQL
SQL = "SELECT * FROM utenti ORDER BY id ASC"
SQL = SQL & " LIMIT " & a & ", " & b
b = 20
a = (pag - 1) * b
rs.Open SQL, cn, 1
%>
<table border="1">
<%
While rs.EOF = False
%>
<tr>
<td><%=rs("id")%></td>
<td><%=rs("nome")%></td>
<td><%=rs("cognome")%></td>
</tr>
<%
rs.MoveNext
Wend
%>
</table><br>
<%
Dim i, intero
i = 1
intero = CInt(quanti / b)
If quanti > (intero * b) Then
intero = intero + 1
End If
%>
<b>Pagina <%=pag%> di <%=intero%></b><br><br>
<%
For i = 1 To intero
If CInt(i) = CInt(pag) Then
%>
[<b><%=i%></b>]
<%
Else
%>
[<b><a href="report.asp?pag=<%=i%>"><%=i%></a></b>]
<%
End If
Next
rs.Close
End If
%>
</div>
</body>
</html>
<%
Set rs = Nothing
cn.Close
Set cn = Nothing
%>
Commentiamo insieme il codice.
Nell’intestazione della pagina, prima dell’apertura del codice HTML, recuperiamo la querystring “pag” che rappresenta il numero di pagina corrente; verifichiamo che sia numerica e non inferiore ad 1 e poi apriamo la connessione al database, avendo cura di inserire la propria stringa di connessione a MySQL al posto dell’omonimo commento evidenziato in grassetto.
Passiamo al corpo della pagina.
Dobbiamo innanzitutto contare quanti record sono presenti nella tabella di riferimento, sia per verificare che esistano dati nel database (possiamo anche usare la proprietà EOF dell’oggetto Recordset) che per impostare il numero di pagine da navigare.
Se ci sono record nel database dobbiamo effettuare un calcolo per assegnare dei valori alla clausola SQL LIMIT, valida per MySQL, il cui funzionamento teorico è semplice:
SELECT campo FROM tabella ORDER BY campo LIMIT inizio, fine
dove inizio e fine, nel nostro esempio, sono calcolati al volo e rappresentati dalle variabili “a” e “b”.
Stampiamo i dati a video e chiudiamo il codice HTML della struttura HTML che conterrà il report.
A questo punto tocca impostare i numeri di pagina utili a navigare le pagine, o che dir si voglia, a scorrere i record.
Questo sistema funziona esattamente come se venisse gestito col Recordset, come nell’esempio linkato ad inizio articolo, con l’unica differenza che il Recordset provvede da se a restituire un numero intero, arrotondato per eccesso, mentre in questo caso dobbiamo verificare noi, con un calcolo al volo, se il numero è intero o meno al fine di arrotondarlo per eccesso.
Stampiamo i numeri di pagine a video, chiudiamo il codice HTML e la connessione al database.
