[RESOLU] pagination PHP

Eléphanteau du PHP | 17 Messages

09 juil. 2013, 12:10

Quelqu'un pourrait m'aider pour créer un système de pagination, j'ai déjà galérer pour écrire ce code :( mon niveau en php est assez médiocre), je voudrais créer un système de pagination qui m'affiche 8 éléments par page sachant que ma table en base de données contient plusieurs centaines d'utilisateurs. Voilà mon code je voudrais savoir comment je dois procéder pour créer mon système de pagination avec navigation(suivant précédent).
voila le code de ma page ou j'inclus mon tableau : Nom de la page: page_etat_admin.php
<?php
session_start();
?>
<html>
<title>Page d'etat</title>
<?php include('../charte/corps.php');?>

<body>
<?php include('../charte/database_connexion.php');
include('etat_general_admin.php');
</html>

Et voilà ma page qui traite mes données: Nom de la page: etat_general_admin.php
<?php

$req = $bdd->query("SELECT min(date_embauche) AS min_date FROM collaborateurs") or die();

while ($donnee = $req->fetch())
$d2=$min = $donnee['min_date'];
$s=$difference=date('Y')-date('Y',strtotime($min));
echo '<table align="center" class="tableau"><tr>';
echo '<td rowspan="2"> Matricule </td><td colspan="' . (date('Y',strtotime('+1 year'))-date('Y',strtotime($min))) . '"> Année</td></tr><tr>';
do {
    echo '<td>' . date('Y', strtotime($min)) . '</td>';
	$min= $min . '+1year';
}while (date('Y')>=date('Y',strtotime($min)));
echo '</tr>';


$req=$bdd->query("SELECT * FROM craaligneother GROUP BY uidPersonne ORDER BY uidPersonne ASC");
while($personne=$req->fetch()){
	echo '<tr><td>';
		echo '<a href="page_etat_admin.php?matricule=' . $personne['uidPersonne'] . '">' . $personne['uidPersonne'];
		echo '</a></td>';
	$min=$d2;
	$difference=$s;
	$req1=$bdd->query("SELECT SUM(valJourCra) AS jour, AnneeCra FROM craaligneother WHERE uidPersonne='" . $personne['uidPersonne'] . "' AND idOther=5 GROUP BY AnneeCra ORDER BY AnneeCra ASC");
			$info=$req1->fetch();
				while(date('Y')>=date('Y',strtotime($min))){
					if($info['AnneeCra']==date('Y',strtotime($min))){
						echo '<td>' . $info['jour'] . '</td>';
						$info=$req1->fetch();
					}
					else
						echo '<td>---</td>';
					$min=$min . '+1 year';
				}
	echo '</tr>';
				}

echo '</table>';

?>

Eléphant du PHP | 79 Messages

09 juil. 2013, 17:19

Pour faire une pagination de ce style je te conseille d'utiliser jquery (JS).

Habituellement tu boucles le résultat que tu reçois de ta base de données. L'idée est d'ajouter un compteur pour que toutes les X valeurs il y est une mise en forme différente.

Je te conseil aussi d'utiliser PDO pour faire ta connexion à ta bdd. Serte c'est une classe mais ce n'est pas plus dure à utiliser que les fonctions mysql, même a un niveau comme le tiens.

Exemple d'utilisation de PDO :

$dsn = "mysql:host=127.0.0.1;port=3306;dbname=mydb;" ;

$db = new PDO( $dsn, 'root', null ); // null étant le mot de passe en lan ;

// maintenant tu peux utiliser la variable $db pour effectuer du traitement avec ta base de données ;

$statement = "SELECT * FROM craaligneother GROUP BY uidPersonne ORDER BY uidPersonne ASC" ;

$req = $db-> prepare( $statement );

$req-> execute();

$personnes = $req-> fetchAll( PDO::FETCH_ASSOC );

// Bouclage sur les données, toi tu le faisais avec le while ;

// Avec comme valeur de fetchAll = PDO::FETCH_ASSOC (en tableau quoi) ;
foreach( $personnes as $result )
{
    echo "{$result['id']} + {$result['nom']}" ;
}

// Avec comme valeur de fetchAll = PDO::FETCH_OBJ (en objet) ;
foreach( $personnes as $result )
{
    echo "{$result-> id} + {$result-> nom}" ;
}

Pour la pagination, rien de plus simple. Si je me référé à l'exemple du dessus :
<?php $i = 0; $step = 8 ; ?>
<div id='personnes'>

<div id='groupe-<?php echo $i ?>'>
<?php foreach( $personnes as $result ): ?>
<div id="une-personne">
<?php echo "{$result['id']} + {$result['nom']}"  ?>
</div>
<?php if( $i > $step ): ++$i ?>
</div>
<div id='groupe-<?php echo $i ?>'>
<?php endif ?>
<?php endforeach ?>
</div>

<div id="cmd">
<?php $cmd = round( count( $personnes ) / $step, 0, PHP_ROUND_HALF_UP ) ?>
<?php for( $i = 0 ; $i < $cmd ; $i++ ): ?>
<a href="#"><?php $id ?></a>
<?php endfor ?>
</div>

</div>
L'idée est simple, quand je boucle le résultat, t’ajoute +1 à $i quand on dépasse $step ( qui est égale à 8 dans l'exemple ) je ferme la div et j'en ré ouvre une avec la nouvelle valeur de $i. En gros je regroupe 8 résultats dans une div et ceci jusqu’à la fin de ma boucle.

Reste plus qu'à faire un script js pour faire le lien entre les différentes div avec l'id = "groupe-id" ou id est un valeur numérique et les bouton dans le div avec l'id = cmd. En gros au clique de l'un de ces bouton, sa valeur (1, 2 ou 3, etc) permettra d'afficher la div avec l'id groupe-1, groupe-2 ou groupe-3, groupe-etc ..

Je laisse quelqu'un de plus doué que moi en js/jquery te faire un script fonctionnant avec ce que j'ai fait je ne suis pas très bon dans ce domaine.

Ciao

Eléphanteau du PHP | 17 Messages

10 juil. 2013, 11:41

Merci beaucoup je vais tester ça tout de suite :D

Eléphant du PHP | 79 Messages

10 juil. 2013, 16:19

Attention j'ai fait une erreur dans la dernier boucle for.

La valeur du lien <a> n'ai pas $id mais $i !
<div id="cmd">
<?php $cmd = round( count( $personnes ) / $step, 0, PHP_ROUND_HALF_UP ) ?>
<?php for( $i = 0 ; $i < $cmd ; $i++ ): ?>
<a href="#"><?php $i ?></a>
<?php endfor ?>
</div>

Eléphanteau du PHP | 17 Messages

10 juil. 2013, 16:22

Merci beaucoup ça m'a énormément aider a comprendre le mécanisme, j'ai réussi à réaliser ma pagination en me passant d'ajax, le fait de recharger la page ne gêne pas :lol: