[Résolu]Bouton <Précédent> <Suivant> Pagination

Bouton <Précédent> <Suivant> Pagination [Résolu] - PHP - Programmation

Marsh Posté le 28-07-2009 à 17:39:11    

Bonjour,
J'ai réussi à faire mon script de pagination qui fonctionne bien. Le problème c'est que depuis hier j'aimerai arriver à faire un bouton suivant et précédent et n'afficher que les 5 ou 10 pages courantes afin de pas me retrouver avec 300pages à afficher.
 
Edit: J'sais pas si j'ai bien expliqué alors j'fais un ptit dessin  [:fande--] : <précédent>...5...6...7...8...<suivant>
 
Mon code:

<h3>Liste des utilisateur</h3>
<?php
include('../admin/modules/db.php');
 
$sql = "SELECT COUNT(id_util) AS nbutil FROM utilisateur";
$req = mysql_query($sql);
$data = mysql_fetch_assoc($req);
 
$nbutil = $data['nbutil'];
$parpage = 2;
$nbpage = ceil($nbutil/$parpage);
 
if(isset($_GET['p']) && $_GET['p']>0 && $_GET['p'] <= $nbpage)
    {
    $cpage = $_GET['p'];
    }
else
    {
    $cpage = 1;
    }
         
$sql2 = mysql_query("SELECT nom_util,prenom_util,statut_util,mail
FROM utilisateur  
ORDER BY id_util  
ASC LIMIT ".(($cpage-1)*$parpage).",$parpage";);
?>
<table>
<tr>
    <th>Nom</th>
    <th>Prénom</th>
    <th>Statut</th>
    <th>E-mail</th>
</tr>
<?php
while ($data = mysql_fetch_array($sql2))
    {
?>
<tr>
    <td><?php echo $data['nom_util'];?></td>
    <td><?php echo $data['prenom_util'];?></td>
    <td><?php echo $data['statut_util'];?></td>
    <td><?php echo $data['mail'];?></td>
</tr>
<?php    
    }
?>
</table>
<?php
for ($i=1;$i<=$nbpage;$i++)
    {
    if($i == $cpage)
        {
        echo "$i |";
        }
    else
        {
        echo "<a href="admin.php?m=liste_util&p=$i">$i</a> |";
        }
    }
?>


 
 
Donc j'aimerai dans la mesure du possible un début de piste pour pouvoir me débloquer.
 
Merci  :)
 
Edit: J'ai regardé la page avec les scripts les plus demandés et j'ai bien regardé celui sur la pagination mais j'ai pas été inspiré  :(


Message édité par Profil supprimé le 31-07-2009 à 12:50:40
Reply

Marsh Posté le 28-07-2009 à 17:39:11   

Reply

Marsh Posté le 28-07-2009 à 18:51:18    

J'avais fait ca pour un site web. Tu peux t'en inspirer.
Ca affiche une barre du type :  
 

<<   <   ... 5 6 7 8 ... >    >>


 

<?
$Ncom = 1564; // Nombre de commentaires au total (modifiable)
$Nmax = 15; // Nombre de commentaires par page (modifiable)
$nbre_cle = 7; // Nombre de clés que l'on veut afficher (modifiable)
$pagin_pas = 5; // Taille du pas du défilement rapide (modifiable)
$pagin_pos = 1; // Position où l'on se trouve (modifiable)
 
$pagin_last = ((int)(($Ncom + $Nmax - 1) / $Nmax ));
 
if ($pagin_pos > 1) //Si l'on se trouve au début
{
  $debut = "<a href="page-1.htm">Début</a> ";
  $pp = "<a href="page-" . ($pagin_pos - 1) . ".htm">Précédent</a> ";
}
else
{
  $debut = "Début ";
  $pp = "Précédent ";
};
if ($pagin_pos > $pagin_pas) //Si l'on se trouve à plus de 5 pages
{
  $pp5 = "<a href="page-" . ($pagin_pos - $pagin_pas) . ".htm">Précédent5</a> ";
}
else
{
  $pp5 = "Précédent5 ";
};
if ($pagin_pos < $pagin_last) //Si l'on se trouve à la fin
{
  $fin = " <a href="page-$pagin_last.htm">Fin</a>";
  $ps = "<a href="page-" . ($pagin_pos + 1) . ".htm">Suivant</a> ";
}
else
{
  $fin = "Fin";
  $ps = " Suivant ";
};
if ($pagin_pos < ($pagin_last - $pagin_pas + 1)) //Si l'on se trouve à moins de 5 pages de la fin
{
  $ps5 = "<a href="page-" . ($pagin_pos + $pagin_pas) . ".htm">suivant5</a> ";
}
else
{
  $ps5 = " suivant5 ";
};
 
if (($pagin_pos > ((int)($nbre_cle / 2) + 1))) //Si besoin des "..." de droite
{
  $sepg = "...";
} else
{
  $sepg = "     ";
}
if (($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))) //Si besoin des "..." de gauche
{
  $sepd = "...";
} else
{
  $sepd = "     ";
}
 
if ($pagin_pos > ((int)($nbre_cle / 2))) // Arret du défilement quand on arrive aux bornes
{
  if ($pagin_pos < ($pagin_last - ((int)($nbre_cle / 2))))
  {
   $i=($pagin_pos-((int)($nbre_cle / 2)));
  }  
  else
  {
    $i=$pagin_last - $nbre_cle + 1;
  }
}  
else
{
  $i=1;
}
$liste = "";
$j = $i + $nbre_cle;
 
while ($i < $j)
{
  if (($i <= $pagin_last) and ($i >= 1))
  {
    $cle = " <a href="page-$i.htm">$i</a>";
    if ($i == $pagin_pos)
      {
        $liste = $liste . "<u>$cle</u>";
      } else
      {
        $liste = $liste . $cle . " ";
      }
  }
  ++$i;
}
 
 
echo "<div style="float:left;">" . $debut . $pp5 . $pp . $sepg .$liste. $sepd . $ps . $ps5 . $fin . "</div>";
 
echo "<div style="float:right;">Page : " .$pagin_pos. " / " .$pagin_last. "</div>";
?>


Message édité par Pascal le nain le 28-07-2009 à 20:22:34
Reply

Marsh Posté le 28-07-2009 à 19:03:58    

Houlala le gros bout de code  [:petrus75]  
 
J'vais regarder ça et j'irais surement reposter pour d'éventuelles questions sur des trucs que je pige pas. Merci quand même :D

Reply

Marsh Posté le 28-07-2009 à 20:21:40    

Je te l'ai simplifié un peu en virant les variables inutiles et en rassemblant toutes les variables au début.

Reply

Marsh Posté le 28-07-2009 à 21:31:14    

tu peux caluler le nombre total d'entrer avec SQL_CALC_FOUND_ROWS

 

$result = $dbh->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM `reponses` ORDER BY `id` ASC LIMIT 0, 10" );
$result->execute();
 
$count_result = $dbh->prepare("SELECT FOUND_ROWS() as FOUND_ROWS" );
$count_result->execute();
 
$count  = $count_result->fetch(PDO::FETCH_OBJ)->FOUND_ROWS;
$row  = $result->fetchAll(PDO::FETCH_OBJ);


Message édité par stealth35 le 28-07-2009 à 21:31:51
Reply

Marsh Posté le 28-07-2009 à 23:13:14    


<?php

 

$Nmax  = 15;
$nbre_cle  = 7;
$page  = (int) @$_GET['page'] ? (int) @$_GET['page'] : 1;
$pagin_pas  = ($page - 1) * $Nmax;
$page_max= null;

 

// PARTIE 1

 

try {
     $dbh = new PDO('mysql:unix_socket=/usr/local/zend/mysql/tmp/mysql.sock;dbname=test', 'login', 'pass');
 } catch (PDOException $error) {
     print $error->getMessage();
     die();
 }
 
 $result = $dbh->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM `data` LIMIT :s, :e" );
 $result->bindParam(':s', $pagin_pas, PDO::PARAM_INT);
 $result->bindParam(':e', $Nmax, PDO::PARAM_INT);
 $result->execute();
 
 $count_result = $dbh->prepare("SELECT FOUND_ROWS() as FOUND_ROWS" );
 $count_result->execute();
 
 $count  = $count_result->fetch(PDO::FETCH_OBJ)->FOUND_ROWS;
 $row  = $result->fetchAll(PDO::FETCH_OBJ);
 
 
// PARTIE 2

 


 $dom = new DOMDocument();
 
 $div = $dom->createElement('div');
 $div = $dom->appendChild($div);
 
 $head = sprintf('Resultat %d à %d sur %d :', $pagin_pas + 1, $pagin_pas + count($row), $count);
 
 $text = $dom->createTextNode($head);
 $text = $div->appendChild($text);

 

$table = $dom->createElement('table');
 $table = $dom->appendChild($table);
 
 foreach($row as $data){
  $tr = $dom->createElement('tr');
  $tr = $table->appendChild($tr);
 
  foreach($data as $value){
   $td = $dom->createElement('td');
   $td = $tr->appendChild($td);
   
   $text = $dom->createTextNode($value);
   $text = $td->appendChild($text);
  }  
 }

 


// PARTIE 3

 


 $foot  = array();
 $page_max  = ceil($count / $Nmax) + 1;
 
 if(($page + $nbre_cle) < $page_max){
  $start  = $page;
  $end  = $page + $nbre_cle;
 }else{
  $start = $page_max - $nbre_cle;
  $end = $page_max;
 }

 

if($page > 1){
  $link = (object) array('text' => '<<', 'num' => '1');
  array_push($foot, $link);
 
  $link = (object) array('text' => '<', 'num' => ($page - 1));
  array_push($foot, $link);
 }
 
 for($i = $start; $i < $end; $i++){
  $link = (object) array('text' => $i, 'num' => $i);  
  array_push($foot, $link);
 }
 
 if($page < $page_max - 1){
  $link = (object) array('text' => '>', 'num' => ($page + 1));
  array_push($foot, $link);
 
  $link = (object) array('text' => '>>', 'num' => $page_max);
  array_push($foot, $link);
 }
 
 $div = $dom->createElement('div');
 $div = $dom->appendChild($div);
 
 foreach($foot as $link){
  $a = $dom->createElement('a');
  $a->setAttribute('href', '?page=' . $link->num);
 
  if($link->num == $page)
  $a->setAttribute('class', 'onpage');
 
  $a = $div->appendChild($a);
 
  $text = $dom->createTextNode($link->text);
  $text = $a->appendChild($text);
 }
 
 echo $dom->saveHTML();
?>


Message édité par stealth35 le 28-07-2009 à 23:44:22
Reply

Marsh Posté le 28-07-2009 à 23:31:57    

Houla, y a plein de truc que je connais pas encore là dedans  :whistle:  
 
Y a rien de plus simple pour faire ce que je veux ?  Ou alors c'est moi qui suis ptète un bon gros noob... ce qui n'est pas à exclure  [:sniperlk]

Reply

Marsh Posté le 28-07-2009 à 23:41:30    

c'est simple la, meme si ca en a par l'air,
 
le probleme est qu'il faut beaucoup de condition comme te le montre le code de Pascal.
 
a l'affiche c'est simple, mais deriere ca l'est moins et encore la ca va, y'a 3 grandes partie
 
1 : connexion + requete  
2 : affichage du tableau
3 : la pagination
 
apres moi j'utilise DomDocument   pour generer plus facilement du HTML, mais c'est pas obligé.

Reply

Marsh Posté le 28-07-2009 à 23:58:32    

1)La connexion + requête ça je l'ai fais
2) affichage je l'ai fais aussi
3) ben à moitié fait en fait :D
 
J'avais vu des mecs qui faisait des fonctions mais j'ai encore du mal avec ça et j'sais pas trop comment les intégrer donc...
J'vais essayer de voir son code et de bidouiller un truc

Reply

Marsh Posté le 29-07-2009 à 00:10:51    

tien je t'ai fait le code en version un peu plus débutant,

 

<?php
 $Nmax   = 15;
 $nbre_cle  = 7;
 $page   = (int) @$_GET['page'] ? (int) @$_GET['page'] : 1;
 $pagin_pas  = ($page - 1) * $Nmax;
 $page_max = null;

 


// PARTIE 1

 


 $dbh = mysql_connect('localhost', 'root', '');
 mysql_select_db('baseflashfoad', $dbh);
 
 $sql  = sprintf("SELECT SQL_CALC_FOUND_ROWS * FROM `t_stages` LIMIT %d, %d", $pagin_pas, $Nmax);
 $result = mysql_query($sql);
 
 $count_result = mysql_query("SELECT FOUND_ROWS() as FOUND_ROWS" );
 $count_result = mysql_fetch_object($count_result);
 
 $count  = $count_result->FOUND_ROWS;
 $row = array();
 
 while($data = mysql_fetch_object($result))
 array_push($row, $data);

 


// PARTIE 2
 
 echo '<div>' . sprintf('Resultat %d à %d sur %d :', $pagin_pas + 1, $pagin_pas + count($row), $count) . '</div>';
 echo '<table>';
 
 foreach($row as $data){
  echo '<tr>';
 
  foreach($data as $value)
  echo "<td>$value</td";
 
  echo '</tr>';  
 }

 


// PARTIE 3

 


 $foot  = array();
 $page_max  = ceil($count / $Nmax) + 1;
 
 if(($page + $nbre_cle) < $page_max){
  $start  = $page;
  $end  = $page + $nbre_cle;
 }else{
  $start = $page_max - $nbre_cle;
  $end = $page_max;
 }

 

if($page > 1){
  $link = (object) array('text' => '<<', 'num' => '1');
  array_push($foot, $link);
 
  $link = (object) array('text' => '<', 'num' => ($page - 1));
  array_push($foot, $link);
 }
 
 for($i = $start; $i < $end; $i++){
  $link = (object) array('text' => $i, 'num' => $i);  
  array_push($foot, $link);
 }
 
 if($page < $page_max - 1){
  $link = (object) array('text' => '>', 'num' => ($page + 1));
  array_push($foot, $link);
 
  $link = (object) array('text' => '>>', 'num' => $page_max);
  array_push($foot, $link);
 }
 
 echo '</table>';
 echo '<div>';
 
 foreach($foot as $link)
 echo '<a href="?page=' . $link->num . '">' . $link->text . '</a>';
 
 echo '</div>';
?>


Message édité par stealth35 le 29-07-2009 à 00:22:05
Reply

Marsh Posté le 29-07-2009 à 00:10:51   

Reply

Marsh Posté le 29-07-2009 à 01:29:53    

Whoa c'est super sympa, merci beaucoup :)
 
J'vais étudier ça  :jap:
 

$page   = (int) @$_GET['page'] ? (int) @$_GET['page'] : 1;


A quoi ça sert de mettre des (int) devant les variables ? C'est une protection ? ça fait penser au C.  Le "?" je sais pas non plus à quoi il sert  :D  ni le ": 1" à la fin.
 
Sinon dans l'ensemble y a beaucoup de fonction que je connais pas et que je n'ai jamais utilisé  [:tinostar]  
 
array_push (ok j'ai pigé en regardant la doc php)
SELECT SQL_CALC_FOUND_ROWS (ça équivaut pas à un COUNT ça ?  [:tinostar] ²)
sprintf avec les %d (ça me rappel le C ça  :whistle: )

Message cité 1 fois
Message édité par Profil supprimé le 29-07-2009 à 12:11:13
Reply

Marsh Posté le 30-07-2009 à 11:03:41    


 
Oui, ca marche aussi en C. C'est pour caster une variable. Ici on force une variable à être un int.

Reply

Marsh Posté le 30-07-2009 à 11:32:28    

Le (int) permet en effet de s'assurer qu'on a bien un entier.
Sinon, la structure condition ? if : else est une expression qui renvoie if si la condition est remplie, else sinon.
Pour être plus clair ici si $_GET['page'] peut être cast en entier, ça le renvoie, et sinon ça renvoie 1.

Reply

Marsh Posté le 30-07-2009 à 11:54:42    

Ouais donc mettre 'in' c'est avant tout pour la sécurité non ?

Reply

Marsh Posté le 30-07-2009 à 12:01:36    


 
Je crois comprendre que c'est au cas où l'utilisateur fait une connerie.
 
s'il demande la page liste.php?page=4 on lui donne la 4ème page.
 
par contre s'il demande la page liste.php?page=coucou, le script a des risques de planter lamentablement, car coucou n'est pas un entier.
C'est pour ça qu'on vérifie que page est bien un entier. Si ce n'est pas le cas, on le renvoie a la première page.
 
A confirmer...


Message édité par Pascal le nain le 30-07-2009 à 12:05:09
Reply

Marsh Posté le 31-07-2009 à 13:08:58    

Re  :hello:  
 
Bon en fait j'ai trouvé un script de pagination sur internet que j'ai réussi à adapter grâce à la tonne de commentaires qui m'a fait apprendre pas mal de ptits trucs.
Au fait, pour le coup du int, avec ce que j'avais écris tout marche bien et même si on écrit coucou rien ne plante.
 

if(isset($_GET['p']) && $_GET['p']>0 && $_GET['p'] <= $nbpage)
    {
    $cpage = $_GET['p'];
    }
else
    {
    $cpage = 1;
    }


Merci de votre aide, j'aurai appris des trucs  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed