dimanche 25 septembre 2011

PHP - Affichage tableau de données avec système de pagination -

Cette fonction permet d'afficher en PHP des données provenant d'une base de données MySQL avec un système de pagination dynamique.
l’accès à la base de données est réalisée grâce à l'extension PDO, il est donc à noter qu'il faut activer l'extension sur votre serveur Apache (dé-commenter la ligne extension=php_pdo_mysql.dll dans le fichier php.ini), ou procéder aux modifications nécessaires dans l’écriture des parties du codes relatives à la connexion à la base de données et aux préparations des requêtes.


La classe de connexion:

class Connexion extends PDO {

private static $_instance;

/* Constructeur : héritage public obligatoire par héritage de PDO */
public function __construct( ) {
}
// End of Connexion::__construct() */

/* Singleton */
public static function getInstance() {
if (!isset(self::$_instance)) {
try {
self::$_instance = new PDO("mysql:host=your-hostname;dbname=your-dbname" , "your-username" ,             "your-password");
} catch (PDOException $e) {
echo $e;
die ('SQL Error');
}
return self::$_instance; 
}
// End of Connexion::getInstance() */

}

La Méthode de génération et d'affichage de la table de données avec le système de pagination:

class gui {
.
.
.
.

/**
* Méthode qui permet de dessiner à partir d une requête, le tableau de données correspondant avec un système de pagination.
* @param $query : chaine de cacaractère contenant la requête avec la partie statique de la clause where
* @param $number_of_rows_per_page : nombre de lignes à afficher par page
* @param $page_uri : uri de la page pour le rafraichissement selon le n° de page sélectionnée
* @param $paramsArray : tableu de paires clé=>caleur pour former la partie dynamique de la clause where
*/
public static function createTable($query , $number_of_rows_per_page , $page_uri , $paramsArray=null){
// Préparation de la requête selon le tableau de paramètres.
if(!empty($paramsArray)){
// la chaine ne contient pas déjà une clause where
if (!stripos($query , 'where'))
$query = $query.' where 1=1 ';
// Parcours du tableau des paramètres et construction de la requête complète
foreach($paramsArray as $paramsArray_key=>$paramsArray_value){
$query = $query.' and '.$paramsArray_key.' = :'.$paramsArray_key; 
}
}
// Préparation à la création du système de pagination
// Compter le nombre de lignes à extraire
$query = strtolower($query);
$query_array = explode("from",$query);
$query_for_number_of_rows = 'select count(*) from '.$query_array[1];
$connexion = Connexion::getInstance();

$requete = $connexion->prepare($query_for_number_of_rows);
foreach($paramsArray as $paramsArray_key=>$paramsArray_value){
$requete->bindValue(':'.$paramsArray_key,$paramsArray_value);
}
if($requete->execute()){
$donnes_number_of_rows = $requete->fetch();
$total_number_of_rows  = $donnes_number_of_rows[0];
}
// Nombre de pages
$number_of_pages = ceil($total_number_of_rows/$number_of_rows_per_page);
// On cherche dans quel page on est
if(isset($_GET['page'])) // Si la variable $_GET['page'] existe on affiche la page correspondante 
{
    $actual_page=intval($_GET['page']);
    
    if($actual_page > $number_of_pages) // Si la valeur de $actual_page (le numéro de la page) est plus grande que $numebr_of_pages on affiche la dernière page
    {
         $actual_page = $number_of_pages;
    }
}
else // Sinon
{
    $actual_page = 1; // La page actuelle est la n°1    
}
// On calcul la première entrée à lire
$first_row_in_page = ($actual_page-1)*$number_of_rows_per_page; 
// Récupération des enregistrements à afficher dans la page actuelle.
$query = $query.' LIMIT '.$first_row_in_page.' , '.$number_of_rows_per_page;
$connexion = Connexion::getInstance();

$requete = $connexion->prepare($query);
foreach($paramsArray as $paramsArray_key=>$paramsArray_value){
$requete->bindValue(':'.$paramsArray_key,$paramsArray_value);
}
if($requete->execute())
{
$donnees = $requete->fetchAll();
// Formation des clés du tableau à afficher : liste des champs sélectionnées dans la requete.
$first_row_donnees = $donnees[0];
foreach($first_row_donnees as $row_cle=>$row_valeur) 
{
if(gettype($row_cle)!='integer')
{
$tab_keys[] = $row_cle;
}
}
foreach ($donnees as $row_donnees){
foreach ($tab_keys as $tab_keys_value){
//echo $tab_keys_value.'<br/>';
$tab_values_row[$tab_keys_value] = $row_donnees[$tab_keys_value];
}
$tab_values[] = $tab_values_row;
}
// Dessinser le tableau HTML
echo '<table>';
echo '<thead>';
echo '<tr>';
foreach ($tab_keys as $tab_keys_value){
echo '<th>'.$tab_keys_value.'</th>';
}
echo '</tr>';
echo '</thead>';
echo '<tbody>';
foreach ($tab_values as $tab_values_row){
echo '<tr>';
foreach ($tab_values_row as $tab_values_row_value){
echo '<td>'.$tab_values_row_value.'</td>';
}
echo '<tr>';
}
echo '</tbody>';
echo '</table>';
// Afficher la liste des pages.
echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
for($i=1; $i<=$number_of_pages; $i++) //On fait notre boucle
{
    //On va faire notre condition
    if($i==$actual_page) //Si il s'agit de la page actuelle...
    {
        echo ' [ '.$i.' ] '; 
    }
    else //Sinon...
    {
         echo ' <a href="'.$page_uri.'?page='.$i.'">'.$i.'</a> ';
    }
}
echo '</p>';
}
}
.
.
.
}


Exemple d'appel:


gui::createTable("
select cv.cv_id , cv.cv_date_creation , cv.cv_titre , langue.lang_lib 
from    cv cv , langue langue where langue.lang_id =         cv.langue_lang_id
"
    ,
    4
    ,
    "/cv/afficher_cvs"
    ,
    array(
    'candidat_compte_cpt_id' => '2',
    'cv_langue_maternelle' => '5'
    )
    );