Fonction de pagination inversee ou non depuis une bdd ou un dossier

Soyez le premier à donner votre avis sur cette source.

Vue 7 653 fois - Téléchargée 524 fois

Description

Ceci est une fonction de pagination simple depuis une base de donnée ou un dossier, facilement configurable et intégrable avec le possibilité de la mettre en invérsée ou de la laisser normale.
plusieurs ZIP disponible:

BDD_ (pagination depuis un table SQL
-"mode complet" pour les novices
-"mode invérsé ou normal"
-"mode no_fonction" a integrer directement a la page

DOSSIER (pagination depuis un dossier)
-"mode complet" pour les novices
-"mode invérsé ou normal"
-"mode no_fonction" a integrer directement a la page

Source / Exemple :


//---------------------index.php--------------------------

<?php

$depuis = 'bdd';//pour paginer un dossier mettre 'folder'
$dossier= 'gallerie';//chemin du dossier a paginer si vous faite une pagination depuis un dossier, si ce n'est pas le cas laissez tel quel

if($depuis == 'bdd'){
///////////vos identifiant de connection bdd\\\\\\\\\\\\\\\
$db = mysql_connect('localhost', 'login', 'password');
mysql_select_db('nom_de_la_base',$db);
///////////////////////////////////////////////////////////
}
require ('fonction_pagination.php');

///////////////////page///////////////////////////////////

$conteneur_bd_debut = '<table border="1"><tr><td bgcolor="red" width="300" height="300">';
$conteneur_bd_fin = '</tr></td></table>';

$conteneur_pg_debut = '<table border="1"><tr><td bgcolor="yellow" width="300">';
$conteneur_pg_fin = '</tr></td></table>';

/////////////////////a editer\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
//-------------------Général---------------------------\\

$inverse = 'non';//pour avoir la pagination invérsée (oui ou non)
$nbr_par_page = 1;//nombre d'éléments par pages
$nbr_liens = 5;//nombre de liens a afficher

//----------------------SQL-----------------------------\\

$champ = 'truc';// champ de la table a séléctionner (SELECT)
$table = 'test';//la table a séléctionner (FROM)
$where = 'id'; //a trier par... (par defaut id)

////limite de recherche BDD (utile si la table a paginer est consequente)
$active = 'oui';// 'oui' pour activer cette fonction

$limite_debut = '0';//..trié les id entre...
$limite_fin ='100';//..et... 

//-------------------------------------------------------\\
/////////////////////////\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
if(isset($_GET['page'])){
if(is_numeric($_GET['page']) && strlen($_GET['page']) < 5){
$page = addslashes($_GET['page']);
}
else{
echo 'Un problème est survenu';
exit();
}
}

//////////////////appel de la fonction\\\\\\\\\\\\\\\\\\\\\\\

pagination($depuis, $conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin, $dossier);
?>

//-----------------fonction_pagination.php-----------------

<?php
function pagination($depuis, $conteneur_bd_debut, $conteneur_bd_fin, $conteneur_pg_debut, $conteneur_pg_fin, $page, $nbr_par_page, $nbr_liens, $inverse, $champ, $table, $where, $active, $limite_debut, $limite_fin, $dossier){
if($depuis == 'bdd'){
if($active == 'oui'){
$sql = "SELECT $champ FROM $table WHERE $where BETWEEN $limite_debut AND $limite_fin";
}
else{
$sql = "SELECT $champ FROM $table ORDER BY $where";
}
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
while($data1 = mysql_fetch_assoc($req))
{
$tableau[] = $data1[$champ];
}
}
else{
$tableau = array(); 
if(is_dir($dossier)) {
$dir = opendir($dossier) or die('Impossible d\'ouvrir le dossier');

while (false !== ($file = readdir($dir))) {
if ($file != '.' && $file != '..') {
$tableau[] = $file;
}
}
}
}
$total = count($tableau);
$nbr_pages = ceil($total/$nbr_par_page);
if(!isset($page)){
if($inverse == 'non'){
$page = '1';
}
else{
$page = $nbr_pages;
}
}
if($nbr_liens >= $nbr_pages){
$nbr_liens = $nbr_pages;
}
if($page >= $nbr_pages){
$page = $nbr_pages;
}
if($inverse == 'non'){
$liens = ceil($nbr_liens/2);
$pagination_debut = $page-$liens;
if($pagination_debut < '1'){
$pagination_debut = 1;
$pagination_fin = $nbr_liens;
}
if(!isset($pagination_fin)){
$pagination_fin = $page+$liens;
if($pagination_fin >= $nbr_pages){
$pagination_fin = $nbr_pages+1;
}
}
}
else{
$nbr_pages = ceil($total/$nbr_par_page);
if($nbr_liens >= $nbr_pages){
$nbr_liens = $nbr_pages;
}
if($page >= $nbr_pages){
$page = $nbr_pages;
}
$liens = ceil($nbr_liens/2);
$pagination_debut = $page-$liens;
if($pagination_debut <= '1'){
$pagination_debut = 0;
$pagination_fin = $nbr_liens;
}
if(!isset($pagination_fin)){
$pagination_fin = $page+$liens;
if($pagination_fin >= $nbr_pages){
$pagination_fin = $nbr_pages;
}
}
}
echo $conteneur_bd_debut;
$page_fin = $page*$nbr_par_page;
$page_debut = $page_fin-$nbr_par_page;
for ($a=$page_debut; $a<$page_fin; $a++){
if($depuis == 'bdd'){
echo $tableau[$a];
}
else{
echo '<img src="'.$dossier.'/'.$tableau[$a].'">';//affichage des images
}
}
echo $conteneur_bd_fin, $conteneur_pg_debut;
if($inverse == 'non'){
if($page > '1'){
$precedent = $page-1;
$acces_precedent = '<a href="index.php?page='.$precedent.'">< </a>';
}
else{
$acces_precedent = False;
}
if($pagination_debut > '1'){
$acces_debut = '<a href="index.php?page=1"><< </a>';
$rognage_precedent = '...';
}
else{
$acces_debut = False;
$rognage_precedent = False;
}
echo $acces_debut, $acces_precedent, $rognage_precedent;
}
else{
if($pagination_fin < $nbr_pages){
$rognage_suivant = '...';
$acces_fin = '<a href="index.php?page='.$nbr_pages.'"> <<</a>';
}
else{
$rognage_suivant = False;
$acces_page_fin = False;
$acces_fin = False;
}
if($page < $nbr_pages){
$suivant = $page+1;
$acces_suivant = '<a href="index.php?page='.$suivant.'"> <</a>';
}
else{
$acces_suivant = False;
}
echo   $acces_fin, $acces_suivant, $rognage_suivant;
}
if($inverse == 'non'){
for ($b=$pagination_debut; $b<$pagination_fin; $b++){
$numero = $b;
$pointeur = str_replace($page,'<b><font size="4">'.$page.'</font></b>',$numero);
$chaine.= '<a href="index.php?page='.$b.'">'.$pointeur.'</a>|';
$pointeur = str_replace($chaine,'<b><font size="4">'.$page.'</font></b>',$chaine);
}
echo $chaine;
}
else{
for ($b=$pagination_fin; $b>$pagination_debut; $b--){
$numero = $b;
$pointeur = str_replace($page,'<b><font size="4">'.$page.'</font></b>',$numero);
$chaine.= '<a href="index.php?page='.$b.'">'.$pointeur.'</a>|';
$pointeur = str_replace($chaine,'<b><font size="4">'.$page.'</font></b>',$chaine);
}
echo $chaine;
}
if($inverse == 'non'){
if($pagination_fin < $nbr_pages){
$rognage_suivant = '...';
$acces_page_fin = '<a href="index.php?page='.$nbr_pages.'">'.$nbr_pages.'</a>';
$acces_fin = '<a href="index.php?page='.$nbr_pages.'"> >></a>';
}
else{
$rognage_suivant = False;
$acces_page_fin = False;
$acces_fin = False;
}
if($page < $nbr_pages){
$suivant = $page+1;
$acces_suivant = '<a href="index.php?page='.$suivant.'"> ></a>';
}
else{
$acces_suivant = False;
}
echo $rognage_suivant, $acces_page_fin, $acces_suivant, $acces_fin;
}
else{
if($page > '1'){
$precedent = $page-1;
$acces_precedent = '<a href="index.php?page='.$precedent.'">> </a>';
}
else{
$acces_precedent = False;
}
if($pagination_debut > '1'){
$acces_debut = '<a href="index.php?page=1">>> </a>';
$rognage_precedent = '...';
$acces_page_debut = '<a href="index.php?page=1">1</a>';
}
else{
$acces_debut = False;
$rognage_precedent = False;
}
echo $rognage_precedent, $acces_page_debut, $acces_precedent, $acces_debut;
}
echo $conteneur_pg_fin;
if($depuis == 'bdd'){
mysql_close();
}
exit();
}
?>

//---------------------------SQL------------------------------

-- phpMyAdmin SQL Dump
-- version 2.11.0
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Sam 17 Novembre 2007 à 00:16
-- Version du serveur: 5.0.45
-- Version de PHP: 5.2.4

-- --------------------------------------------------------

--
-- Structure de la table `test`
--

CREATE TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  `truc` varchar(50) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ;

--
-- Contenu de la table `test`
--

INSERT INTO `test` (`id`, `truc`) VALUES
(1, '1'),
(2, '2'),
(3, '3'),
(4, '4'),
(5, '5'),
(6, '6'),
(7, '7'),
(8, '8'),
(9, '9'),
(10, '10'),
(11, '11'),
(12, '12'),
(13, '13'),
(14, '14'),
(15, '15'),
(16, '16'),
(17, '17'),
(18, '18'),
(19, '19'),
(20, '20'),
(21, '21'),
(22, '22'),
(23, '23'),
(24, '24'),
(25, '25'),
(26, '26');

//----------------------------------------------------------------

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
kylekatarnls : "La sécurité de ma GET est à 100%, si ce n'est pas un int supérieur à 0, alors elle ne donne rien. De plus le "html perdu" et bien c'est les liens, je vais aps les coder en javascript."

Mouais, ben non... Mais séparer leur affichage du traitement, c'est pas réservé à une élite, c'est à la portée du premier venu et ça simplifie ENORMEMENT la tache du premier gus qui voudra modifier la mise en page. Parce que des liens construits sur plusieurs lignes à partir de morceaux de balises mélangés à des variables php avec des apostrophes, des guillemets échappés qu'on ne sait même plus lequel on doit fermer, excuse moi, mais c'est vraiment pas génial.
Y'a une fonciton toute bête de PHP qui permet de commencer à séparer l'affichage du traitement, c'est la base ; et cette fonction c'est sprintf, qui permet d'y voir quand même sacrément plus clair quand on balance une tripotée de variables dans une chaine.

Et puis tu parles d'une seconde pour 600 pages de 30 entrées... Moi je te parle aussi de charge mémoire et d'optimisation, d'une manière générale.
Essaie de voir un peu plus loin que le bout de ta souris... Quand on utilise une fonction de pagination pour mettre en page les résultats d'un moteur de recherche, ça peut être plusieurs utilisateurs, voire même plusieurs dizaines en même temps. 1 seconde de plus pour chaque personne, je te laisse imaginer la différence que ça fait pour le serveur. C'est pas négligeable. C'est même énorme.

Alors si tu dois charger les 15000 résultats d'une recherche dans une pauvre variable alors que tu vas n'en afficher que 30, je trouve déplorable un tel gâchis de RAM, alors qu'elle pourrait servir à autre chose (comme par exemple stocker plusieurs fois 30 résultats à afficher).

Maintenant si t'as pas du tout envie d'optimiser tes codes et préfères te contenter de piètres performances qui te suffisent, libre à toi. Si tu utilises tes codes pour un site perso avec maxi 3 utilisateurs simultanés, c'est un fait. Mais quand on publie une source, il est normal d'essayer d'optimiser le plus possible. Parce que sinon, la source ne sert à rien.

Maintenant, si tu lis un peu plus attentivement les remarques que j'ai soumises à Asherah et que tu compares sa réaction à la tienne, tu verras qu'il y a une différence.
Elle a reconnu que sa source n'était pas optimisée et elle se penche depuis sur une version orientée objet de sa source. Elle cherche à optimiser et n'a jamais prétendu que sa source était plus performante que la tienne.

Pfffffffffff
Messages postés
35
Date d'inscription
dimanche 4 février 2007
Statut
Membre
Dernière intervention
1 juillet 2008

La sécurité de ma GET est à 100%, si ce n'est pas un int supérieur à 0, alors elle ne donne rien. De plus le "html perdu" et bien c'est les liens, je vais aps les coder en javascript. Et je ne crois pas que tes 325 lignes non indentées et tes 12 zip soit plus aisés à décrypter.

Je t'ai dit ce que je pensais de ton code (que j'ai noté 5 et pas 0 quand même). Je n'ai présenté cette version que parce que tu me l'a demandé, elle a peut-être l'inconvéniant de prendre une seconde de plus lorsqu'on a 600 pages de 30 entrée BDD, tout comme elle a les avantages de prendre moins de place, de s'adpter à tous les contenus. Je prétends pas que ça vale mieux juste que je préfère utiliser ce code, et j'ai déjà expliqué pourquoi.

PS: Il serait judicieux de remplacer <<, <, >, >> dans les liens par < et > pour éviter des les erreurs de W3C.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
J'aurais effectivement pu prendre 10 secondes pour lire le code...

if(count($array)>$nepp) //on ne pagine que si c'est nécessaire

C'est bien ce qui me semblait : on stocke dans le tableau TOUT ce qui doit être paginé, même si ça ne doit pas être affiché.
En plus, en faisant comme ça, ça implique une première lecture du résultat mysql, puis une seconde du tableau... Deux boucles sur les mêmes données pour ne les afficher qu'une seule fois... C'est dommage et un vrai gâchi de performances,alors qu'un itérateur permet de ne parcourir qu'une seule fois les données, et uniquement celles que l'on souhaite afficher... Franchement, moins de lignes, c'est un mauvais argument... En plus, pour parcourir un répertoire, là où il faut 10 lignes en procédural, il en faut 3 avec un itérateur (et je ne parle même pas de récursivité, où le nombre de lignes et la charge mémoire augmente de façon phénoménale en procédural, sans bouger augmenter exagérément avec un itérateur).

"$page=$_GET['souspage']*1;//Sous-page évite d'avoir tout à récoder si on utilise déjà une get page"

Mais ça oblige à tout recoder si on utiliser déjà $_GET['souspage']

Bref... Avec un peu de bonne volonté, on peut parvenir à faire du joli code performant... C'est pas difficile, et c'est pas non plus réservé à une élite.
Messages postés
25
Date d'inscription
mercredi 14 novembre 2007
Statut
Membre
Dernière intervention
25 novembre 2007

Tu ne fait aucunes verifications sur tes transmissions de variable par get, j'aimerais pas l'avoir sur mon site.

Et c'est bete qu'il ne marche pas, car je suis sur que j'aurais pu trouver pleins de trucs du genre. si tu passe a la page 9 alors qu'il n y a que 6 pages tu retrouve dans le vide intersidérale de la bdd.

et puis beaucoup moins de lignes oui, mais sans possibilité de faire un pagination invérsée.

bref, j'aimerais que tu post cette source, voir ce que les autres en pense.

Ils y en a ici qui prennent du temp a faire des reponses constructive.
Et je les remercis beaucoup,et peut etre devrait tu prendre exemple sur eux.

Bon allé sur ce, je n'ajouterais rien, je viens ici pour partager et apprendre.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
18
Salut,

@kylekatarnls : J'ai pas regardé ton code en détails, mais si on récupère ce qu'on veut paginer dans un array, excuse moi, mais niveau performances, c'est pas top... Inutile de récupérer TOUTES les données qui sont affichées sur plusieurs pages alors qu'on n'en affiche qu'une partie par page, et qu'on ne peut pas en afficher plus d'une page à chaque fois...
L'itérateur permet de n'itérer que sur une partie, sans surcharger le traitement et la mémoire. En plus, c'est plus joli et plus clair que plein de code avec du html perdu dedans et que personne n'a envie de chercher à décrypter...
Afficher les 25 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.