limiter le nombre d'affichage en coupant en plusieurs pages

Eléphanteau du PHP | 22 Messages

08 févr. 2005, 23:38

Bon maintenant j'aimerai pouvoir afficher par exemple 20 extraits par page et avoir un petit lien qui met suivant ou précédent
exemple

http://rikikifunkin.free.fr/extraits/divers.php

Jai vu des aides sur internet mais j'avoue que c'est très mal expliqué (ou alors je comprends pas tout lol)

Mammouth du PHP | 1311 Messages

08 févr. 2005, 23:54

suffit de faire une boucle for ou while :wink:

Eléphanteau du PHP | 22 Messages

08 févr. 2005, 23:59

Bon je veux pas faire le chiant mais on peut le faire ensemble ?
Voici mon code: (c'est ptete codé à larrache mais bon je debute lol)
		$codecat = 8;  // inserer le code de la catégorie de musique
		$nombase="rikikifunkin";
$id_connex = mysql_connect("sql.free.fr","rikikifunkin","XXXX","rikikifunkin") or die("La connexion à echoué!");
mysql_select_db($nombase,$id_connex);
$id_requete = mysql_query("select * from extrais WHERE cid = $codecat");
$compteur = mysql_query("SELECT * FROM extrais WHERE cid = $codecat",$id_connex);
$compteur1=mysql_num_rows($compteur);
echo '<strong><font color=\"#FFFFFF\">il y à ',$compteur1,' extraits dans divers .</font></strong> ';
if($id_requete)
{

echo '<TABLE WIDTH=100% BORDER=0.9 align="center" CELLPADDING=0 CELLSPACING=0 bordercolor="#000000" bgcolor="#798196">
  <tr background="/images/barre.gif"> 
    <td height="3" colspan="4" background="/images/barre.gif"><div align="left"> <font color="#FFFFFF"><strong>.::Catégorie divers</strong></div></td></tr>'
.'<tr>'
.'<td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Date</div></td>
    <td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Auteur</div></td>
    <td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Titre</div></td>
	<td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Ecouter</div></td>';
While($ligne = mysql_fetch_array ($id_requete)){
echo '<tr>'
.'<td width="15%" height="3" bgcolor="#000000"><div align="center"><font color="#FFFFFF" size="-1">'.$ligne['date'].' </A></td>'
.'<td width="40%" bgcolor="#000000"><div align="center"><font color="#FFFFFF">' .$ligne['auteur'].'</td>'
.'<td width="40%" bgcolor="#000000"><div align="center"><font color="#FFFFFF">' .$ligne['titre'].'</td>'
.'<td width="10%" bgcolor="#000000"><div align="center"><a href="extraits/fichiers/'.$ligne['nomfichier'].'.mp3"><img src="/images/reala.gif" width="15" height="15" border="0"></a></td></tr>';
echo '</tr>';
}
echo '</table>';
mysql_free_result($id_requete);
}
else
{
echo"impossible d'executer la requete";
}

mysql_close();
?>
Merci d'avance
Modifié en dernier par mumulafrite le 09 févr. 2005, 00:12, modifié 1 fois.

Mammouth du PHP | 1311 Messages

09 févr. 2005, 00:01

au secour la balise php tu devrai aussi aller voir du coté du css pour le htm :wink:

Eléphanteau du PHP | 22 Messages

09 févr. 2005, 00:05

ouai je sais mais c'est une premiere version qui marche bien, ensuite je vais pofiner tout ca :oops:

Et puis je suis vraiment debutant ...

Mammouth du PHP | 1311 Messages

09 févr. 2005, 00:08

ouai pour comprendre ton code c'est mieux pour toi et surtout pour nous
edite ton poste et met ton code entre les balise PHP

Eléphanteau du PHP | 22 Messages

09 févr. 2005, 00:13

Voilà, javais pas compris le coup des balises lol dsl

Mammouth du PHP | 1311 Messages

09 févr. 2005, 00:16

moi je vois un truc comme ca
while($i!=%20)
{
affichage
$i++;
}
mais c'est pas terrible 2 boucles While imbriquer

Eléphanteau du PHP | 22 Messages

09 févr. 2005, 00:21

Jai trouvé ca sur le web
<?php
function barre_navigation ($nb_total,
        $nb_affichage_par_page,
        $debut,
        $nb_liens_dans_la_barre) {

    $barre = '';
    
    // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT
    if ($_SERVER['QUERY_STRING'] == "") {
        $query = $_SERVER['PHP_SELF'].'?debut=';
    }
    else {
        $tableau = explode ("debut=", $_SERVER['QUERY_STRING']);
        $nb_element = count ($tableau);
        if ($nb_element == 1) {
            $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut=';
        }
        else {
            if ($tableau[0] == "") {
                $query = $_SERVER['PHP_SELF'].'?debut=';
            }
            else {
                $query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'debut=';
            }
        }
    }
    
    // on calcul le numéro de la page active
    $page_active = floor(($debut/$nb_affichage_par_page)+1);
    // on calcul le nombre de pages total que va prendre notre affichage
    $nb_pages_total = ceil($nb_total/$nb_affichage_par_page);
    
    // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin)
    // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11
    if ($nb_liens_dans_la_barre%2==0) {
        $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1;
        $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2);
    }
    else {
        $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2));
        $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2));
    }
    
    if ($cpt_deb1 <= 1) {
        $cpt_deb = 1;
        $cpt_fin = $nb_liens_dans_la_barre;
    }
    elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) {
        $cpt_deb = $cpt_deb1;
        $cpt_fin = $cpt_fin1;
    }
    else {
        $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1;
        $cpt_fin = $nb_pages_total;
    }

    if ($nb_pages_total <= $nb_liens_dans_la_barre) {
        $cpt_deb=1;
        $cpt_fin=$nb_pages_total;
    }
    
    // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page
    if ($cpt_deb != 1) {
        $cible = $query.(0);
        $lien = '<A HREF="'.$cible.'"><<</A>&nbsp;&nbsp;';
    }
    else {
        $lien='';
    }
    $barre .= $lien;

    // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active
    for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) {
        if ($cpt == $page_active) {
            if ($cpt == $nb_pages_total) {
                $barre .= $cpt;
            }
            else {
                $barre .= $cpt.'&nbsp;-&nbsp;';
            }
        }
        else {
            if ($cpt == $cpt_fin) {
                $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
                $barre .= "'>".$cpt."</A>";
            }
            else {
                
                $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page);
                $barre .= "'>".$cpt."</A>&nbsp;-&nbsp;";
            }
        }
    }
    
    $fin = ($nb_total - ($nb_total % $nb_affichage_par_page));
    if (($nb_total % $nb_affichage_par_page) == 0) {
        $fin = $fin - $nb_affichage_par_page;
    }

        // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation
    if ($cpt_fin != $nb_pages_total) {
        $cible = $query.$fin;
        $lien = '&nbsp;&nbsp;<A HREF="'.$cible.'">>></A>';
    }
    else {
        $lien='';
    }
    $barre .= $lien;

    return $barre;    
}
?>

<html>
<head>
<title>Les livres de la bibliothèque</title>
</head>

</body>
Les différents livres de la bibliothèque :<br /><br />
<?php
// on se connecte à notre base
$base = mysql_connect ('serveur', 'login', 'nom_base');
mysql_select_db ('nom_base', $base);

// on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages
$sql  = 'SELECT count(*) FROM catalogue';

// on exécute cette requête
$resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

// on récupère le nombre d'éléments à afficher
$nb_total = mysql_fetch_array($resultat);

// on teste si ce nombre de vaut pas 0
if (($nb_total = $nb_total[0]) == 0) {
    echo 'Aucune réponse trouvée';
}
else {
    echo '<table><tr><td><td>Description</td></tr>';
    
    // sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0
    if (!isset($_GET['debut'])) $_GET['debut'] = 0;
    
    $nb_affichage_par_page = 1;
    
    // Préparation de la requête avec le LIMIT
    $sql = 'SELECT titre, description FROM catalogue ORDER BY titre ASC LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;

    // on exécute la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

    // on va scanner tous les tuples un par un
    while ($data = mysql_fetch_array($req)) {
        // on affiches les résultats dans la <table>
        echo '<tr><td><td>' , stripslashes(htmlentities(trim($data['description']))) , '</td></tr>';
    }

    // on libère l'espace mémoire alloué pour cette requête
    mysql_free_result ($req);
    echo '</table><br />';

    // on affiche enfin notre barre
    echo '<span class="gras">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 3).'</span>';
}
// on libère l'espace mémoire alloué pour cette requête
mysql_free_result ($resultat);
// on ferme la connexion à la base de données.
mysql_close ();
echo '</table><br />';
?>

</body>
</html>
Visible sur http://www.lephpfacile.com/howto/index.php?p=6 mais javoue que c pas phpfacile lol

Eléphanteau du PHP | 20 Messages

09 févr. 2005, 03:21

Bien trop compliqué pour faire un pauvre affichage de page!

Un truc simple comme ceci fonctionne

function SplitPages($nbrow, $perpage = 20)
{
    //Compte le nombre de pages
    $nbpage = ceil($nbrow/$perpage);
    for($i=0;$i<$nbpage;$i++)
    {
        echo '<a href="page.php?start='.$i*$perpage.'">'.$i+1.'</a>';
    }
}
?>
Dans la fonction le paramètre $perpage est facultatif, 20 par page par défaut si non spécifié.

Et dans ta requête tu ajoute la clause LIMIT 20, $start

Bien sur la fonction est de base, rien n'indique sur quelle page l'utilisateur se trouve, mais c'est pas tellement compliqué à ajouter, un ptit if dans la boucle et voilà ;)

Eléphanteau du PHP | 22 Messages

09 févr. 2005, 11:30

Bon ca marche pas....
jai mis la fonction et rajouté ce que tu mas dit a la requete
$id_requete = mysql_query("select * from extrais WHERE cid = $codecat LIMIT 20, $start ");
Ca me met une erreur de ce type
Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ',' or ';' in c:\program files\easyphp1-7\www\extraits\divers.php on line 48
à la ligne 48 c'est ca:
        echo '<a href="page.php?start='.$i*$perpage.'">'.$i+1.'</a>';
Voilà si tu peux maider et puis men dire un peu plus pour afficher la page parce que un if je sais ce que c'est mais pas du tout comment le mettre.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 févr. 2005, 11:56

Essaye de remplacer ça:
echo '<a href="page.php?start='.$i*$perpage.'">'.$i+1.'</a>'; 
par:
echo '<a href="page.php?start='.($i*$perpage).'">'.($i+1).'</a>'; 
Quand tout le reste a échoué, lisez le mode d'emploi...

Invité
Invité n'ayant pas de compte PHPfrance

09 févr. 2005, 12:13

Non ca marche po, mais ca sameliore un peu
ma requete
$id_requete = mysql_query("select * from extrais WHERE cid = $codecat LIMIT 20, $start ",$id_connex );
Il me met deux messages derreur
Notice: Undefined variable: start in c:\program files\easyphp1-7\www\extraits\divers.php on line 54
et
impossible d'executer la requete
Voilà...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

09 févr. 2005, 12:58

Il faut utiliser GET/POST et ton message impossible d'exécuter la requète est généré par ton code quelques lignes plus loin je suppose.
Teste ta requète dans phpMyAdmin pour t'assurer qu'elle soit ok.

Voila une modif pour récupérer start correctement et pour afficher l'erreur MySQL si ta requète ne s'exécute pas bien.
$id_requete = mysql_query("select * from extrais WHERE cid = $codecat LIMIT 20, $start ",$id_connex ); 
à remplacer par:
$id_requete = mysql_query("select * from extrais WHERE cid = ".$codecat." LIMIT 20, ".$_GET['start']." ",$id_connex ) or die("Erreur MySQL: ".mysql_error()); 
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 22 Messages

09 févr. 2005, 13:14

Oh ca me rend fou!!!
La requete marchait avant que je fasse la modif. Cela maffichait tout ce que je voulais et je voulais limiter un affichage par page...

Bon jai une nouvelle erreur...
je te passe le code e entier pour que tu puisse voir ce qui se trime la dedant:
        <? 
		 function SplitPages($nbrow, $perpage = 20)
{
    //Compte le nombre de pages
    $nbpage = ceil($nbrow/$perpage);
    for($i=0;$i<$nbpage;$i++)
    {
 echo '<a href="page.php?start='.($i*$perpage).'">'.($i+1).'</a>';     }
} 
		$codecat = 8;  // inserer le code de la catégorie de musique
		$nombase="rikikifunkin";
$id_connex = mysql_connect("localhost","root","","rikikifunkin") or die("La connexion à echoué!");
mysql_select_db($nombase,$id_connex);
$id_requete = mysql_query("select * from extrais WHERE cid = ".$codecat." LIMIT 20, ".$_GET['start']." ",$id_connex ) or die("Erreur MySQL: ".mysql_error()); 
$compteur = mysql_query("SELECT * FROM extrais WHERE cid = $codecat",$id_connex);
$compteur1=mysql_num_rows($compteur);
echo '<strong><font color=\"#FFFFFF\">il y à ',$compteur1,' extraits dans divers .</font></strong> ';//affichage du nombre de musique de la catégorie
//affichage de tous les musique de la catégorie
if($id_requete)
{

echo '<TABLE WIDTH=100% BORDER=0.9 align="center" CELLPADDING=0 CELLSPACING=0 bordercolor="#000000" bgcolor="#798196">
  <tr background="/images/barre.gif"> 
    <td height="3" colspan="4" background="/images/barre.gif"><div align="left"> <font color="#FFFFFF"><strong>.::Catégorie divers</strong></div></td></tr>'
.'<tr>'
.'<td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Date</div></td>
    <td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Auteur</div></td>
    <td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Titre</div></td>
	<td height="3" bgcolor="#000000"><div align="center"><font color="#FFFF00">Ecouter</div></td>';
While($ligne = mysql_fetch_array ($id_requete)){
echo '<tr>'
.'<td width="15%" height="3" bgcolor="#000000"><div align="center"><font color="#FFFFFF" size="-1">'.$ligne['date'].' </A></td>'
.'<td width="40%" bgcolor="#000000"><div align="center"><font color="#FFFFFF">' .$ligne['auteur'].'</td>'
.'<td width="40%" bgcolor="#000000"><div align="center"><font color="#FFFFFF">' .$ligne['titre'].'</td>'
.'<td width="10%" bgcolor="#000000"><div align="center"><a href="extraits/fichiers/'.$ligne['nomfichier'].'.mp3"><img src="/images/reala.gif" width="15" height="15" border="0"></a></td></tr>';
echo '</tr>';
}
echo '</table>';
mysql_free_result($id_requete);
}
else
{
echo"impossible d'executer la requete";
}

mysql_close();
?>
Merci d'avance