Ora che abbiamo almeno un record nella nostra tabella degli utenti possiamo pensare alla funzione che estrae tutti i record presenti in essa. L'output sarà costituito da una tabella HTML dove ad ogni utente corrisponderà una riga con le relative informazioni. Di fatto questa visualizzazione sarà una sorta di pannello di controllo, infatti oltre al link "inserisci" e alla lista dei record per ciascuna riga provvederemo a inserire tre link/bottoni per visualizzare il dettaglio, per modificare il record e per rimuoverlo.
Inoltre dovremo prendere in considerazione un altro problema che alla lunga potrebbe presentarsi: qualora la nostra tabella sia costituita da centinaia o migliaia di utenti sarà bene non mostrarli tutti contemporaneamente: sia per l'utente finale che si trova di fronte una mole di dati poco fruibile, sia per il server che deve estrarre molti dati e caricarli in memoria. Molto meglio affrontare il problema suddividendo i dati in più pagine, ciascuna contenente un numero di record congruo.
Questo lavoro non dovrà riguardare unicamente la visualizzazione delle inforomazioni ma anche l'estrazione dei dati in modo da ottimizzare il processo. Prepariamo quindi la tabella HTML inserendo una riga di intestazione e il solito link al form d'inserimento:
function lista() {
global $connection;
$out='<table class="table">';
$out.='<thead>';
$out.='<tr><td colspan="6"><a href="?azione=form">Inserisci nuovo</a></td></tr>';
$out.='<tr><th>Id</th><th>Nome</th><th>Cognome</th><th>Email</th><th></th><th></th></tr>';
$out.='</thead>';
}
La soluzione viene chiamata di solito paginazione dei dati: per poterla allestire abbiamo bisogno di sapere quanti record sono presenti nella tabella e decidere quanti ne vogliamo mostrare per ogni pagina. Con queste informazioni possiamo calcolare il numero totale di pagine, sapere in quale pagina ci troviamo ed estrarre il blocco di record corretto. Il primo problema, sapere quanti record contiene la tabella, lo risolviamo facilmente con un SELECT COUNT(*)
, ovvero un query che conta i record senza estrarli.
$sql = "SELECT COUNT(*) FROM utenti";
$stmt = $connection->prepare($sql);
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_NUM);
$tot_records = $row[0];
Prepariamo la stringa SQL, la eseguiamo e andiamo a leggere la risposta con un FETCH_NUM
, cioè usiamo l'indice per recuperare l'unico valore restituito. A questo punto all'interno della variabile $tot_records
abbiamo l'informazione che ci interessa: il numero totale dei record. Useremo invece la variabile $perpage
per determinare il numero di record/utenti che vogliamo visualizzare per ciascuna pagina ed estrarre dal database:
$perpage = 10;
Il prossimo passaggio sarà relativo a determinare in quale pagina ci troviamo. Questo verrà fatto leggendo il parametro page
passato con GET
, il valore sarà memorizzato nella variabile $page
che verrà inizializzata a 1 per il primo accesso:
$page = 1;
if(isset($_GET['page'])){$page = filter_var($_GET['page'],FILTER_SANITIZE_NUMBER_INT);}
Dato che l'unico contenuto accettabile sono numeri interi procederemo a sanificare la stringa ricevuta che sarà visibile nell'URL della chiamata.
Procediamo calcolando il numero delle pagine, questo sarà il frutto della divisione fra il numero dei record potenzialmente estratti e il numero di record da visualizzare per pagina. Il risultato sarà arrotondato all'intero successivo tramite la ceil()
, questo garantirà la visualizzazione dell'ultima pagina anche senza il raggiungimento del numero di record richiesti (10).
$tot_pagine = ceil($tot_records/$perpage);
Per costruire la stringa SQL ed estrarre solo i record che saranno effettivamente visualizzati dobbiamo individuare il primo record da estrarre. La formula sarà data dalla pagina corrente meno 1 per il numero dei record da mostrare per pagina:
$pagina_corrente = $page;
$primo = ($pagina_corrente-1)*$perpage;
Possiamo preparare la SELECT introducendo la clausola LIMIT per delimitare i record da estrarre specificando l'indice del primo record e quanti record a partire dal primo dovranno essere estratti. In questo modo al nostro Web server arriveranno solo i record che effettivamente dovrà visualizzare.
$sql = 'SELECT * FROM utenti ORDER BY id DESC LIMIT '.$primo.','.$perpage.' ';
Con i dai sul nostro web server possiamo eseguire un ciclo while
per costruire l'HTML concatenando in una variabile $out
i tag dell'HTML e le variabili contenenti i dati che provengono dal database:
$stmt = $connection->prepare($sql);
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$out.='<tr>';
$out.='<td>'.$row['id'].'</td>';
$out.='<td>'.$row['nome'].'</td>';
$out.='<td>'.$row['cognome'].'</td>';
$out.='<td>'.$row['email'].'</td>';
$out.='<td><a href="?azione=dettaglio&id='.$row['id'].'"><span class="glyphicon glyphicon-zoom-in"></span></a></td>';
$out.='<td><a href="?azione=form&id='.$row['id'].'"><span class="glyphicon glyphicon-pencil"></span></a></td>';
$out.='<td><a href="?azione=elimina&id='.$row['id'].'"><span class="glyphicon glyphicon-remove"></span></a></td>';
$out.='</tr>';
}
Ogni riga conterrà 3 celle, ciascuna con i link al dettaglio, alla modifica e all'eliminazione di ciascun record.
L'output sarà completato da una pulsantiera per navigare fra le varie pagine dei risultati, ovvero ricaricare la stessa pagina, con la medesima azione "lista" ma variando il parametro page
che indica quale pagina caricare e quindi da quale record partire con l'estrazione dei dati. Per la formattazione useremo le classi e gli stili di Bootstrap:
$out.='<tr><td colspan="7"><nav><ul class="pagination">';
for($i=1; $i<=$tot_pagine; $i++)
{
$out .='<li><a href="?page='.$i.'">'.$i.'</a></li>';
}
$out .= "</ul></nav></td></tr>";
$out.='</table>';
return($out);
Ora possiamo inserire i record e visualizzarne l'elenco navigando fra le pagine nei quali sono suddivisi