[PHP] Automatisation de passage de page

Papage -  
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je voudrais réaliser un code qui me parait simple mais je n'y arrive pas.
Je voudrais faire comme le pied de page du forum comme ceci
http://imageshack.us/photo/my-images/5/ccm1v.jpg/

C'est à dire: Select de champs d'une table de bdd, mettre en place des pages en fonction du nombre d'entrées.
Exemple: afficher sur une page (liste_membres.php) les 10 premiers membres puis sur la même page, charger les 10 suivants ...
J'ai essayé avec la méthode $_GET mais je m'emmêle les pinceaux, pouvez-vous m'aider ?

Merci d'avance
A voir également:

6 réponses

Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
petite erreur j'ai rectifié pour le comptage du nbr enr

<style type="text/css">
.num_page_courante {
	font-size:14px;
	font-weight:bold;
	padding:10px;
}

.num_pages {
	font-size:12px;
	padding:10px;
}
</style>
<?php session_start();
if(isset($_GET["page"]) && $_GET["page"]!=""){
	//si reçu par url on le récupère
	$page = $_GET["page"];
}else{
	//sinon on initialise à 1
	$page=1;
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>

<?php
//parametres (modifiables)
$nb_par_page=10;

//il faut d'abbord calculer le nombre total de pages
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test','root','',$pdo_options);

////nombre total de pages
if(isset($_GET['nb_pages']) && $_GET['nb_pages']!=""){
	//si on l'a reçu par l'url on le récupère
	$total_pages = $_GET['nb_pages'];
}else{
	//sinon on fait une interro base pour le calculer
	$result_total=$bdd->query("SELECT * FROM membres");
	$nb_enregistrements=$result_total->rowCount();
	$total_pages= ceil($nb_enregistrements / $nb_par_page);
}
///// il faut faire une requette en jouant sur LIMIT pour afficher les enr voulus 0 à 9 puis 10 à 19 etc..
//calcul debut et fin de LIMIT
$debut=10*($page-1);
$fin=$debut+($nb_par_page-1); //-1 car les enr commencent à 0

$reponse = $bdd->query("SELECT * FROM membres ORDER BY id ASC LIMIT ".$debut.",".$fin."");

    while ($donnees = $reponse->fetch())
    {
        //affichage
    }
$reponse->closeCursor();
	//affichage des lien qui permettent de passer de page en page
	//par une boucle sur le total pages
	for($n=1;$n<=$total_pages;$n++){	
		//on va faire un affichage différent si page courante
		//et tu fais du CSS sur les class num_page_courante et num_pages
		if($n==$page){
			echo '<span class="num_page_courante">'.$n.'</span>';;
		}else{
			echo '<span  class="num_pages"><a href="liste_membres.php?page='.$n.'&nb_pages='.$total_pages.'">'.$n.'</a></span>';
		}
	}

	
	
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>
</html>
1
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
t'aider oui mais il nous faudrait ton code ?
0
Papage
 
voici ma page (liste_membre.php)

<?php session_start();
$page = $_GET["page"];
$finale = $_GET["finale"];
$requete = $_GET["requete"];
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>

<?php
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test','root','',$pdo_options);
$reponse = $bdd->query('SELECT * FROM membres ORDER BY id ASC LIMIT 0,10');

    while ($donnees = $reponse->fetch())
    {
        //affichage des 10 premiers membres selon un tableau défini par du css trop long à mettre ici
    }

echo '<a href="liste_membres_suite.php?page=1&finale=3&requete=1">1</a> | 
<a href="liste_membres_suite.php?page=2&finale=3&requete=2">2</a> | 
<a href="liste_membres_suite.php?fin=1">3</a>'; //pied de page qui mène sur la même page sans me mettre les 10 membres suivants
	
	$reponse->closeCursor();
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>
</html>


Puis ma page (liste_membres_suite.php)
<?php if (isset($_GET["fin"]))
{
echo "Fin de page";
exit();
}
else
{
$page = $_GET["page"];
$finale = $_GET["finale"];
$requete = $_GET["requete"];
$base = mysql_connect ('localhost','root',''); 
mysql_select_db ('test',$base);
$requete = 'SELECT * FROM membres ORDER BY id ASC LIMIT 10,10';
mysql_query ($requete) or die ('Erreur SQL !<br />'.mysql_error());

echo '<meta http-equiv="refresh" content="0.2; url=liste_membres.php?page='.$page.'&finale='.$finale.'&requete=1" />';
}
?>


Merci de ton attention
0
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
pourquoi fais tu deux fichiers, il faut faire retour au premier pour voir une autre page, un seul suffit
et il faut faire des calculs sur le nombre total de pages sinon si tu le met en dur dans ton code, si tu as plus de membres ça ne marchera plus
J'ai pas testé, il peut subsister des erreurs de frappe ou autre !

fichier liste_memebres.php
<?php session_start();
if(isset($_GET["page"]) && $_GET["page"]!=""){
	//si reçu par url on le récupère
	$page = $_GET["page"];
}else{
	//sinon on initialise à 1
	$page=1;
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>

<?php
//parametres (modifiables)
$nb_par_page=10;

//il faut d'abbord calculer le nombre total de pages
try
{
$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=test','root','',$pdo_options);

////nombre total de pages
if(isset($_GET['nb_pages']) && $_GET['nb_pages']!=""){
	//si on l'a reçu par l'url on le récupère
	$total_pages = $_GET['nb_pages'];
}else{
	//sinon on fait une interro base pour le calculer
	$result_total=$bdd->query("SELECT COUNT(*) FROM membres");
	$nb_enregistrements=$bdd->fetchColumn();
	$total_pages= ceil($nb_enregistrements / $nb_par_page);
}
///// il faut faire une requette en jouant sur LIMIT pour afficher les enr voulus 0 à 9 puis 10 à 19 etc..
//calcul debut et fin de LIMIT
$debut=10*($page-1);
$fin=$debut+($nb_par_page-1); //-1 car les enr commencent à 0

$reponse = $bdd->query("SELECT * FROM membres ORDER BY id ASC LIMIT ".$debut.",".$fin."");

    while ($donnees = $reponse->fetch())
    {
        //affichage  $nb_par_page membres page par page
    }
$reponse->closeCursor();
	//affichage des lien qui permettent de passer de page en page
	//par une boucle sur le total pages
	for($n=1;$n<=$total_pages;$n++){	
		//on va faire un affichage différent si page courante
		//et tu fais du CSS sur les class num_page_courante et num_pages
		if($n==$page){
			echo '<a class="num_page_courante" href="liste_membres.php?page='.$n.'&nb_pages='.$total_pages.'">'.$n.'</a> ';
		}else{
			echo '<a  class="num_pages href="liste_membres.php?page='.$n.'&nb_pages='.$total_pages.'">'.$n.'</a> ';
		}
	}

	
	
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}
?>
</html>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Papage
 
Merci de ton attention et de m'avoir appris une fonction (ceil) !

Dans cette partie là de ton code, ça ne fonctionne pas:
}else{
	//sinon on fait une interro base pour le calculer
	$result_total=$bdd->query("SELECT COUNT(*) FROM membres");
	$nb_enregistrements=$bdd->fetchColumn();
	$total_pages= ceil($nb_enregistrements / $nb_par_page);
}


J'ai essayé (vite fait) de remplacer par mysql_num_rows (sans passer par PDO) pour compter le nombre d'entrées mais ça ne fonctionne pas ...

$result_total = mysql_num_rows("SELECT COUNT(*) FROM membres");
	$nb_enregistrements = mysql_fetch_assoc($result_total);
$total_pages= ceil($nb_enregistrements / $nb_par_page);


J'essaierais quand j'aurais plus de temps un autre moyen à moins que tu ne passes par là et que tu m'apportes ton aide si précieuse.

Merci encore
0
Papage
 
Merci, ça marche !

Mais j'ai changé ce bout de code pour que ce soit parfait.

$debut = 10*($page-1);
$fin = $nb_par_page;


Merci encore
0
Alain_42 Messages postés 5361 Date d'inscription   Statut Membre Dernière intervention   894
 
ha oui pardon une petite erreur d'inattention, c'est bien que tu ai rectifié cela prouve que tu as compris le code.

Amicalement
@lain
0