pagination

Petit nouveau ! | 2 Messages

02 févr. 2011, 17:35

Bonjour à tous
J'ai un souci depuis deux jours, je ne parviens pas a faire la pagination
En fait je gere facilement lorsqu'il me faut afficher le contenu d'une table simplement
mais dans le cas présent il est question d'afficher une partie des élement de la table ainsi que certains liens sur chaque ligne.
le plus dur pour moi c'est surtout au niveau de l'interpretation du code car c'est une application que je dois améliorer.
le code est structuré comme suis:
on a un fichier SearchEvt.php dont le code est le suivant

//------------------------------------------------------
<?php
//début de la requete sql
$req = "select e.id, e.type, e.titre, e.lieu, e.debut, e.region, e.active, e.dateVariable, e.latence";
$from = "from evt_rec e";
$where = "where e.debut + interval e.latence day>=CURRENT_DATE()-1 ";

//mots clés
if(!$oper_cles){
$oper_cles="and";
}
if($cles){
$ClauseWhere = 1;
$TabCles = explode(' ', $cles);
$NbCles = count($TabCles);

$cle = $TabCles[0];
$cle = majuscule($cle);
$where .= " $oper_cles cles like '%$cle%'";

for($i=1; $i<$NbCles; $i++){
$cle = $TabCles[$i];
$cle = majuscule($cle);
$where .= " $oper_cles cles like '%$cle%'";
}
}
if($cat){
$from .= ", evt_cat ec";
$where .= " and ec.evt=e.id and ec.cat='$cat'";
}

if($aValider){
$where .= " and (e.active is NULL or e.active=0 or e.dateVariable=1) and e.debut < current_date()+ interval 90 day ";
$aValider = FALSE;
}

$req .= " $from $where order by e.debut";
echo "<font size=-1> req = " . $req . "<br>";

$res = mysql_query($req, $connexion);

$reponse = "<table border=0 cellspacing=10>\n";
while($evt = mysql_fetch_row($res)){
$reponse .= "<tr>";
$reponse .= "<td><font size=-1>".$evt[1]."</td>";
//$reponse .= "<td><font size=-1><a href=\"../calendrier/detail.php?id=".$evt[0]."\" target=_blank>".$evt[2]."</a> </font></td>";
$reponse .= "<td><font size=-1><a href=\"../detail.php?id=".$evt[0]."\" target=_blank>".$evt[2]."</a> </font></td>";
$reponse .= "<td><font size=-1>".$evt[3]."</td>";
$reponse .= "<td><font size=-1>".$evt[4]."</td>";
$reponse .= "<td><font size=-1>".$evt[5]."</td>";
$reponse .= "<td><font size=-1><a href=\"editEvt.php?id=".$evt[0]."\">modifier</a> </font></td>";
if($evt[6] != 1){
$reponse .= "<td><font size=-1><a href=\"activeEvt.php?id=".$evt[0]."\">activer</a> </font></td>";
}
//$reponse .= "<td><font size=-1><a href=\"delateEvtphp?id=".$evt[0]."\">supprimer</a> </font></td>";
//if( $evt[2] ) { $reponse .= "<td><font size=-1> <a href=\"exercices/corriges/" . $evt[2] . "\">corrigé</a></font></td>"; }
$reponse .= "</tr>\n";
}
$reponse .= "</table>\n";

?>
//---------------------------------------------------------------------------------------


et le fichier index qui gere l'affichage et où on a simplement appelé le tableau en faisant echo"$reponse"
comment est ce que je pourrai gerer cela. j'aimerai afficher 5 élements par page
merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 févr. 2011, 18:00

salut,

tu peut adapter ceci a ton besoin :)

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 2 Messages

04 févr. 2011, 10:29

Merci bien pour ta reponse
Hier j'ai éssayé cette solution mais j'ai toujours un peu du mal à m'ensotir, je suis un vrai novice dans le developpement et ici ma vrai préoccupation est que l'affichage est geré dans le fichier index par le code suivant echo"$reponse", or reponse provient d'un autre fichier dont le code a été donné dans mon message précedent. Je static depuis SVP faite quelque chose pour moi.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

04 févr. 2011, 15:00

il faut utiliser la clause LIMIT de mysql dans le select
La clause LIMIT peut être utilisée pour limiter le nombre d'enregistrements retournés par la commande SELECT. LIMIT accepte un ou deux arguments numériques. Ces arguments doivent être des entiers constants.

Avec un argument, la valeur spécifie le nombre de lignes à retourner depuis le début du jeu de résultat. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décalage du premier enregistrement est 0 (pas 1) :

Pour être compatible avec PostgreSQL, MySQL supporte aussi la syntaxe : LIMIT row_count OFFSET offset.

mysql> SELECT * FROM table LIMIT 5,10; # Retourne les enregistrements 6 à 15

Pour obtenir tous les enregistrement d'un certain décalage jusqu'à la fin du résultat, vous pouvez utiliser de grands entier en tant que second paramètre :

mysql> SELECT * FROM table LIMIT 95,18446744073709551615; # Retourne les enregistrements de 96 jusqu'au dernier.

Si un seul argument est donné, il indique le nombre maximum d'enregistrements à retourner :

mysql> SELECT * FROM table LIMIT 5; # Retourne les 5 premiers enregistrements

Autrement dit, LIMIT n est équivalent à LIMIT 0,n.
ensuite il te faut gérer la pagination, comment ? comme dans le lien que je t'ai mis dans mon 1er message
algo
1/ est ce que j'ai une demande de page particulière ? oui => 2 non => 3
2/
a / je prépare mes variables pour construire ma limite dynamique
b / Je fait mon select

3/
a / la variable debut vaut zéro
b / la variable nombre vaut 5

comment gérer les variables ?

il faut retenir que
Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décalage du premier enregistrement est 0 (pas 1)

donc tu peut toujours laisser le 2nd argument à 5 et gérer le 1er en fonction de la page avec une simple multiplication du numéro de page par le nombre d’élément sur la page.

tu peut aussi imaginer de ne prendre d'un paramètre à limit (donc laisser 5) et de jouer sur la valeur de la clef primaire avec dans le where un truc du genre clef primaire > dernière clef affichée.


@+
Il en faut peu pour être heureux ......