PHP - MySQL : paginer les enregistrements d’une table
Lorsqu’une table contient “un certain nombre” d’enregistrements, il devient utile d’afficher ces enregistrements sur plusieurs pages. Cet article explique comment réaliser un affichage par page et une barre de navigation qui permettra de naviguer entre ces pages.
Pour afficher une page, il faut d’abord récupérer dans la base les enregistrements correspondants à la page en cours :
SELECT SQL_CALC_FOUND_ROWS *
FROM customer
LIMIT '.(int)$offset.', '.(int)$nb_enregs_page.'
SQL_CALC_FOUND_ROWS indique à MYSQL de récupérer le nombre total d’enregistrements qui seraient retournés par la requête sans la clause LIMIT (dans notre cas, le nombre total d’enregistrements dans la table customer).
LIMIT ‘.(int)$offset.’, ‘.(int)$nb_enregs_page.’, indique à MYSQL de récupérer “$nb_enregs_page” enregistrements à partir de la position $offset. Ce qui signifie que si on souhaite afficher 10 enregistrements par page, à l’affichage de la page 1 la clause LIMIT sera “LIMIT 0, 10″, pour la deuxième page “LIMIT 10, 10″, etc.
Une fois qu’on a récupérer les enregistrements qui nous intéressent, la requête :
SELECT FOUND_ROWS() AS total
nous permet de récupérer le nombre total d’enregistrements qui aurraient été récupérés par MYSQL sans la clause LIMIT.
Un petit exemple :
// réaliser ici la connexion à la base
$limit = 15;
$offset = ((isset($_REQUEST['offset']) && $_REQUEST['offset'] > 0) ? $_REQUEST['offset'] : 0);
// la requête récupère $limit enregistrements, à partir de l'enregistrement à la position $offset
$sql_str = 'SELECT SQL_CALC_FOUND_ROWS * FROM customers LIMIT '.$offset.', '.$limit.' ';
$result = mysql_query($sql_str);
while ($data = mysql_fetch_assoc($result)) {
echo $data['customers_firstname'].' '.$data['customers_lastname'].'<br/>';
}
// récupère le nombre total d'enregistrements dans la table
$result = mysql_query('SELECT FOUND_ROWS() AS total');
// $data['total'] contient le nombre total d'enregistrements dans la table
$data = mysql_fetch_assoc($result);
// appel de la fonction d'affichage de la pagination
echo paging('test.php', $data['total'], $limit, $offset);
La fonction pour afficher la pagination :
Cette fonction affiche une liste déroulante qui permet de naviguer entre les pages ainsi que des liens vers les pages d’enregistrements précédente et suivante. Vous pouvez bien sûr l’adapter à vos besoins.
/**
* Affiche la pagination
*
* @param string $page
* @param integer $total_rows
* @param integer $limit
* @param integer $offset
* @param array $preserved_params, permet de spécifier des paramètres supplémentaires
* Ã transmettre entre les pages array('param1'=>'valeur', 'param2'=>'valeur', [...])
* @return string
*/
function paging($page, $total_rows, $limit, $offset, $preserved_params = null){
$query = '';
$str_hidden = '';
if (is_array($preserved_params)) {
foreach ($preserved_params as $k=>$v) {
if ($k != 'offset') {
$query .= $k.'='.urlencode($v).'&';
$str_hidden .= '<input type="hidden" name="'.$k.'" value="'.htmlentities($v).'" />';
}
}
}
if (strpos($page, '?') !== false) {
$page = substr($page, 0, strpos($page, '?'));
}
$nb_pages = ceil($total_rows / $limit);
$i = 0;
$j = 0;
$idx_page = 0;
while ($i < $total_rows) {
$tab_pages[$j]['id'] = $i;
$tab_pages[$j]['text'] = ($j + 1).' / '.$nb_pages;
if ((int)$offset >= $i) {
$idx_page = $j;
}
$i += $limit;
$j++;
}
$reponse = '<form class="barre-navigation-pages" action="'.$page.'">';
$page .= '?'.$query;
if ($offset > 0) {
$reponse .= '<p><a href="'.$page.'&offset='.($offset - $limit).'" class="lien-precedant">Précédent</a></p> ';
}
$reponse .= '<p>Page <select name="offset">';
for ($i = 0; $i < $nb_pages; $i++) {
$reponse .= '<option value="'.$tab_pages[$i]['id'].'" ';
if ($i == $idx_page) {
$reponse .= 'selected="selected"';
}
$reponse .= '>'.$tab_pages[$i]['text'].'</option>';
}
$reponse .= '</select>'.$str_hidden.'</p>';
if ($offset < ($total_rows - 1) && isset($tab_pages[$idx_page + 1])) {
$reponse .= '<p><a href="'.$page.'offset='.$tab_pages[$idx_page + 1]['id'].'" class="lien-suivant">Suivant</a></p>';
}
$reponse .= '</form>';
return $reponse;
}
