Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 20 di 56
  • livello intermedio
Indice lezioni

Estrazione dei dati e paginazione

Impariamo ad estrarre i record dalla tabella di un database MySQL con PHP e MySQLi per poi stamparli in output suddivisi in più pagine.
Impariamo ad estrarre i record dalla tabella di un database MySQL con PHP e MySQLi per poi stamparli in output suddivisi in più pagine.
Link copiato negli appunti

Scopo della funzione lista() è estrarre dal database la lista degli utenti e creare una tabella HTML con tutti i record estratti mediante un ciclo while. Nel nostro HTML andremo anche a prevedere due link per ciascuna riga alle funzioni di modifica ed eliminazione dei relativi record.

L'estrazione dei record in una tabella pone normalmente il problema della paginazione, se vengono estratti molti record visualizzarli tutti nella stessa pagina è infatti un'operazione inutile per l'utente, che riceve troppe informazioni, nonché gravosa per il server. Meglio suddividere i record in più pagine.

Iniziamo dunque creando la tabella HTML, in particolare l'intestazione e il link al form d'inserimento:

function lista() {
	global $mysqli;
	$out='<table class="table">';
	$out.='<thead>';
	$out.='<tr><td><a href="?azione=form">Inserisci nuovo</a></td></tr>';
	$out.='<tr><th>Id</th><th>Nome</th><th>Cognome</th><th>Email</th>';
	$out.='</thead>';
	}

Ora affrontiamo il problema della paginazione, per questo necessitiamo di sapere il numero totale di record in tabella, il numero di record da visualizzare per singola pagina ed eventualmente la pagina corrente. Partiamo dal primo aspetto, eseguiremo un SELECT COUNT(*) sulla tabella e memorizzeremo tutto in una variabile $totale dopo il fetch:

$result = $mysqli->query("SELECT COUNT(*) FROM utenti");
	$row = $result->fetch_row();
	$tot_records = $row[0];

Assegniamo una variabile $perpage con il numero di record da visualizzare per pagina:

$perpage = 10;

E infine andiamo a leggere la pagina corrente, in caso mancasse questo valore saremo sulla pagina 1. Anche in questo caso sanitizzeremo l'input.:

$page = 1;
	if(isset($_GET['page'])){$page = filter_var($_GET['page'],FILTER_SANITIZE_NUMBER_INT);}

Procediamo con i calcoli: dobbiamo sapere quante sono le pagine totali dividendo il totale dei record per il numero dei record per pagina e arrotondando il risultato all'intero successivo:

$tot_pagine = ceil($tot_records/$perpage);

Procediamo con l'individuazione del primo record da estrarre:

$pagina_corrente = $page;
	$primo = ($pagina_corrente-1)*$perpage;

e creiamo la nostra SELECT con la clausola LIMIT che stabilirà quali record dovranno essere estratti, a partire da quale e quanti:

$sql = 'SELECT * FROM utenti ORDER BY id DESC LIMIT '.$primo.','.$perpage.' ';

A questo punto possiamo eseguire la query e procedere con il ciclo while per la concatenazione della stringa HTML da restituire in output:

$result = $mysqli->query($sql);
	while($row = $result->fetch_array(MYSQLI_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>';
		}

Le ultime tre celle relative a ciascuna riga della tabella contengono i link al dettaglio, alla modifica e all'eliminazione di ciascun record.

Concludiamo con la pulsantiera che ci permetterà di passare alle pagine successive alla prima. Si tratta di creare un ciclo da 1 al numero totale di pagine calcolato precedentemente e per ciascuno stampare un link che ricarica la pagina stessa con la variabile $page opportunamente valorizzata. Lo stile ci verrà fornito da 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);

A questo punto la lista dei record è visibile insieme alla paginazione per scorrere fra le varie pagine.

Ti consigliamo anche