Retourner sur PHPFrance


 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   Accéder aux archivesArchives  S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
PHPFrance est maintenu par des bénévoles et soutenu par les sociétés Actoo et Anaska, Conseil et Formation pour PHP
Pour optimiser vos chances commencez par consulter la FAQ et faites une recherche.
Bon esprit, politesse et entraide sont les règles de ce forum.

Afficher des éléments page par page

 
Poster un nouveau sujet   Ce sujet est verrouillé; vous ne pouvez pas éditer les messages ou faire de réponses.    PHPFrance Index du Forum -> FAQ et tutoriels
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Cyrano
Ganesha


Inscrit le: 07 Fév 2005
Messages: 17829
Localisation: Paris XIII
MessagePosté le: 26 Sep 2005, 21:18    Sujet du message: Afficher des éléments page par page Répondre en citant

Principe de fonctionnement d'un système d'affichage page par page

Partons d'un système de nouvelles. Nous avons un certain nombre de nouvelles enregistrées dans une base de données. Nous souhaitons limiter le nombre de nouvelles affichées sur une page. Par conséquent, nous devrons ajouter dans la page un système de navigation permettant d'aller lire les autres nouvelles.

Afin de limiter la complexité, considérons que nous avons une seule table.
L'important n'est pas la complexité, c'est de comprendre le principe général.
La structure de la table correspondra donc pour notre exemple au schéma suivant :
Code:
  *--------------------------------------------*
  |                 nouvelles                  |
  *---------------------+--------------+-------*
  | champ               | type         | index |
  *---------------------+--------------+-------*
  | nouv_id             | INT          |   PK  |
  | nouv_titre          | VARCHAR(128) |       |
  | nouv_texte          | TEXT         |       |
  | nouv_date           | DATETIME     |       |
  *---------------------+--------------+-------*

Peu de champs, c'est largement suffisant pour les besoins de l'exercice.
Ci-dessous, le script SQL de jeu d'essai pour voir fonctionner ce système:
Code:
DROP TABLE IF EXISTS `nouvelles`;
CREATE TABLE `nouvelles` (
  `nouv_id` int(11) NOT NULL auto_increment,
  `nouv_titre` varchar(128) collate latin1_bin NOT NULL default '',
  `nouv_texte` text collate latin1_bin NOT NULL,
  `nouv_date` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`nouv_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

INSERT INTO `nouvelles` VALUES (1, 'PHPFrance change d''hébergeur', 'La nouvelle n''a pas fait de bruits, le site aujourd''hui fort reconnu PHPFrance.com a déménagé. Le nouvel hébergeur a suivi de quelques mois un incident technique qui a privé la communauté des développeur de leur forum préféré pendant quelques jours.\r\n\r\nL''adresse n''a pas changé et on se rend toujours sur le site à www.phpfrance.com', '2005-07-15');
INSERT INTO `nouvelles` VALUES (2, 'Un ouvrage de référence en français sur les styles', 'Fraichement paru aux éditions Eyrolles, un nouvel ouvrage sur les feuilles de style en cascade (CSS) écrit par Raphaël Goetter a inauguré l''apparition de titres en français dans ce domaine. Nous étions jusqu''alors plus habitués à trouver des livres sur le sujet traduit de l''amméricain voire carrément en anglais.\r\n\r\nÀ la lecture du contenu de l''ouvrage de R. Goetter, il y a fort à parier que malgré ses dire, il serve de référence de base à de nombreux développeurs. Souhaitons que ces derniers mettent en application ce contenu pour voir la toile française devenir plus accessible à tous.', '2005-07-25');
INSERT INTO `nouvelles` VALUES (3, 'Cyrano ne ralentit pas la cadence', 'Depuis sa réinscription comme membre sur le forum de PHPFrance, Cyrano est devenu au fil des semaines et des mois une figure notoire. Il a récemment posté son sept millième message. On notera que sur l''ensemble de son "oeuvre", Cyrano ne pose pratiquement jamais de question pour son propre compte, ses rares questions étant des demandes de précisions à d''autres posteurs qui demandent de l''assistance.\r\n\r\nSouhaitons une bonne continuation à ce membre émérite.', '2005-09-15');
INSERT INTO `nouvelles` VALUES (4, 'Un nouveau tutorial de Cyrano', 'Dernière contribution de Cyrano dont nous faisons mention lors de la dernière parution, un tutorial pour construire un système de navigation page par page.\r\n\r\nIl arrive en effet fort souvent que nous ayons besoin pour notre site Internet de n''afficher des données que partiellement pour ne pas voir des pages démesurément longues. Il faut toutefois avoir accès aux données non affichées en disposant de liens vers les pages suivantes et/ou précédentes.\r\n\r\nCe tutorial explique les principes essentiels de cette technique pour réaliser la programmation de ce système. Le code de l''exemple est largement commenté et chacun pourra y trouver de quoi s''instruire utilement.\r\n\r\nMerci à Cyrano pour cette contribution.', '2005-09-23');



Explications du principe de fonctionnement

Nous allons dans un premier temps compter le nombre de nouvelles enregistrées. De ce nombre, nous pourrons déduire le nombre de page nécessaires. Ceci signifie que nous avons un paramètre à configurer : le nombre de nouvelles par page. Nous aurons donc deux requêtes SQL à exécuter. La première pour compter le nombre de nouvelles, la seconde pour récupérer un nombre limité de nouvelles, nombre correspondant au paramètre mentionné plus haut. Connaissant le nombre de nouvelles, nous pouvons déterminer le nombre de page et s'il est supérieur à 1, nous devrons alors afficher des liens vers les pages suivantes. Nous devrons également savoir en tout temps sur quelle page nous sommes afin que les liens correspondent. Le lien vers la page courante n'aura pas lieu d'être actif, mais si nous sommes sur la page 3 par exemple, nous aurons besoin d'un lien vers la page précédente, et s'il y en a une, un lien vers la page suivante.

NOTE IMPORTANTE :

le système présenté ici est basé sur une base de données MySQL, il sera important de modifier les fonctions utilisées et éventuellement les requêtes pour un SGBD différent.

D'autre part, ne négligez pas les commentaires qui sont dans le code, ils ont des choses à raconter qui peuvent vous aider Smile

PHP:
<?php
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
<title></title>
<meta name="description" content="" />
<meta name="keywords" content="" />
<meta name="author" content="Jean Molliné" />
<meta name="generator" content="Zend Studio Environnement et WebExpert 5" />
<meta http-equiv="imagetoolbar" content="no" />
<meta http-equiv="Pragma" content="no-cache" />
<style type="text/css">
/* <![CDATA[ */ 
body {
    color: #000;
    background-color: #efefef;
    font-family: verdana, helvetica, sans-serif;
    font-size: 80% !important;
}
p.situation {
    text-align: right;
    padding: 1em;
}
p.navigation {
    text-align: center;
    font-size: 0.85em;
    text-decoration: underline;
}
p.date_nouv {
    float: right;
    font-size: 0.85em;
}
/* ]]> */
</style>
</head>
<body>
<?php
/**
Commençons par fixer les paramètres :
 */
/* Paramètres de connexion */
$admin_bd   "root";              /* Le pseudonyme permettant à l'administrateur de se connecter */
$mdp_bd     "";                  /* Le mot d passe de l'administrateur de base de données */
$serveur_bd "localhost";         /* L'adresse du serveur de base de données */
$base_bd    "test";           /* La base de données où sont enregistrées les informations */

/* Paramètres de pagination */
$nb_nouv_par_page 1;             /* Nombre de nouvelles qui seront affichées sur chaque page */
$url "./pageparpage.php?page=";

/* On détermine quelle est la page qui est actuellement affichée */
$page_en_cours    = isset($_GET['page']) ? $_GET['page'] : 0;
$page_affichee    = ($page_en_cours 1);

/* Connexion au serveur de base de données */
$connexion mysql_pconnect($serveur_bd$admin_bd$mdp_bd);
mysql_select_db($base_bd);

/* Requête pour compter les nouvelles présentes dans notre base de données */
$sql_nb "SELECT COUNT(*) FROM `nouvelles`";

/* Exécution de la requête et récupération du résultat */
$resultat_1 mysql_query($sql_nb);
$nb_nouvelles mysql_result($resultat_10);

/* Calcul du nombre total de pages : on arrondit à l'entier supérieur (ceil() ) */
$nb_pages ceil($nb_nouvelles $nb_nouv_par_page);

/** 
Nous disposons maintenant de suffisament d'éléments pour créer notre barre de navigation.
Première chose à vérifier : avons-nous plusieurs pages, et au moins une ?
 */
if($nb_pages 0)
{
    
/* On définit une variable qui contiendra les données de navigation */
    
$barre_nav "";
    
/* Nous avons au moins une page : avons nous besoin d'une barre de navigation ? */
    
if($nb_pages 1)
    {
        
/** 
        Nous avons plusieurs pages: nous allons afficher successivement les liens vers
        les pages précédentes s'il y en a, la page en cours et les liens vers les pages
        suivantes. Nous aurons une barre sous la forme : 1 | 2 | 3 etc.. en liens clicables
        sauf pour la page en cours dont nous mettrons le chiffre en gras
         */
        
if($page_en_cours 0)
        {
            for(
$i 0$i $page_en_cours$i++)
            {
                
$p $i 1;
                
$barre_nav .= "<a href=\""$url $i ."\" title=\"page "$p ."\">"$p ."</a> | ";
            }
        }
        
/**
        On affiche la page en cours : notez le (+ 1) : pour les calculs, nous partons d'une 
        page 0 mais pour l'internaute, il est préférable de commencer à la page 1, donc on incrémente
         */
        
$barre_nav .= "<strong>"$page_affichee ."</strong>";
        
/* Enfin on affiche (s'il y a lieu) les liens vers les pages suivantes */
        
if(($page_affichee) < $nb_pages)
        {
            
/* Il reste encore d'autres pages à afficher */
            
$nb_suivantes $nb_pages - ($page_affichee);
            for(
$j = ($page_affichee); $j $nb_pages$j++)
            {
                
$p $j 1;
                
$barre_nav .= " | <a href=\""$url $j ."\" title=\"page "$p ."\">"$p ."</a>";
            }
        }
        
        
/* On peut définir en plus la situation dans une autre variable à afficher ailleurs */
        
$page_affichee "Page "$page_affichee ." sur un total de "$nb_pages ." pages.";
    }
    else
    {
        
/* Nous n'avons qu'une seule page, on peut se contenter d'afficher juste page 1/1 */
        
$barre_nav .= "page 1/1";
    }
    
/**
    On peut maintenant afficher notre page. On va commencer par récupérer les informations
    On doit définir à partir de quelle nouvelle on doit récupérer les données dans la clause LIMIT.
     */
    
$debut $page_en_cours $nb_nouv_par_page;
    
$sql_n "SELECT nouv_titre, nouv_texte, nouv_date FROM nouvelles LIMIT "$debut .", "$nb_nouv_par_page .";";
    
$nouvelles mysql_query($sql_n);
?>
<p class="situation"><?php echo($page_affichee); ?></p>
<?php
    
while($nouv mysql_fetch_assoc($nouvelles))
    {
?>
<p class="date_nouv">Publié le <?php echo($nouv['nouv_date']); ?></p>
<h3><?php echo($nouv['nouv_titre']); ?></h3>
<p><?php echo(nl2br($nouv['nouv_texte'])); ?></p>
<hr />
<?php
    
}
    
/* on libère la mémoire */
    
mysql_free_result($resultat_1);
    
mysql_free_result($nouvelles);
    
/* On peut fermer la connexion à MySQL */
    
mysql_close($connexion);
    
/* On affiche maintenant la barre de navigation */
?>
<p class="navigation"><?php echo($barre_nav); ?></p>
<?php
}
else
{
    
/** 
    Nous n'avons aucune page, on peut alors afficher un message autre 
    sans devoir nous préoccuper de la navigation
     */
?>
<h3>Aucune nouvelle n'a encore été publiée à ce jour</h3>
<hr />
<?php
}
?>
</body>
</html>

Voilà, si vous avez des problèmes avec, allez poser une question dans le forum "Débuter en PHP" ou "PHP", et argumentez votre question en expliquant ce qui ne fonctionne pas.

Soyez aussi assez aimables de ne pas m'interpeller personnellement pour que je vous fasse une variante dans le résultat affiché: je vous donne le principe, à vous d'imaginer d'autres possibilités.
_________________
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse Axe
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Ce sujet est verrouillé; vous ne pouvez pas éditer les messages ou faire de réponses.    PHPFrance Index du Forum -> FAQ et tutoriels Toutes les heures sont au format GMT + 2 Heures
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum
Powered by phpBB © phpBB Group - PHPFrance est hébergé par Sivit