Aller au contenu

[RESOLU] PHP - Liste page par page x éléments


ggbce

Messages recommandés

Je cherche comment faire pour lister des éléments provenant d'une BD MySQL avec PHP sous forme de liste <li> ou dans un tableau <td>, mais lorsque qu'un certain nombre d'éléments est dépassé, il faut changer de lignes... et lorsque qu'un autre nombre d'éléments est atteint il faut créer des pages !

À date je n'ai que fait des affichages dans un tableau sans limite et je sais pas trop comment me structurer pour faire des validations du genre.

Voici mon exemple de base:

<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
<ul type="square" class="tableau">
<?php
mysql_connect('localhost', 'user', 'password') or die();
mysql_select_db('mabdd') or die();
$sql = "SELECT id,titre FROM matable ORDER BY id;";
$req = mysql_query($sql) or die ();
while($data = mysql_fetch_assoc($req))
 {
 echo ('<li>'.$data['titre'].'</li>');
 }
mysql_close();
?>
</ul>
</BODY>
</HTML>

Comme vous le voyez ça donne une liste de tous les éléments de ma table dans la même page web.

1- Comment faire pour l'étendre dans 2 ou 3 colonnes de large ?

Bon c'est probablement avec un tableau, mais où ça m'enbête c'est avec le "mysql_fetch_assoc" et le "echo" si je créé mes colonnes dynamiquement.

Je commence à remplir la première colonne jusqu'à 25 lignes de haut, si elle est pleine je saute à la 2e colonne, 3e...

et

2- Lorsque le nombre de lignes maximum à afficher dans une page (ex. 25 lignes) sur le nombre de colonne maximum, comment faire pour générer des pages multiples ?

Je sais vraiment pas comment m'y prendre ??? Et je ne trouve pas d'exemple nul part :chinois:

Lien vers le commentaire
Partager sur d’autres sites

G pas mes sources, elles sont au boulot mais en gros:

- Sort tes données en utilisant un tableau HTML, ça sera plus pratique pour la mise en forme.

- Pour créer des pages d'un tableau de 10 entrées (puis suivante/précédente) utilise LIMIT dans la requête SQL et un index qui lui servira de paramètre mais aussi, dans tes liens vers les autres pages pour transmettre les coordonnées des "autres" tableaux...

Suis-je clair :incline:

:incline::chinois::francais:

Lien vers le commentaire
Partager sur d’autres sites

Sort tes données en utilisant un tableau HTML, ça sera plus pratique pour la mise en forme.

Ça je m'en doutais, c'est juste que le client aimerais avoir des "p'tit square" devant les éléments listés... comme une liste, mais ça je peux m'arranger autrement.

La partie qui m'embête dans l'utilisation du tableau c'est comment m'y prendre sir je veux remplir une colonne sur 25 lignes,

<table>
<tr>
<td> $data['titre'] </td> ...x 25
</tr>

puis si elle atteint la limite qu'une seconde colonne se génère,

<table>
<tr>
<td> $data['titre'] </td> ...x 25 (1 à 25)
<td> $data['titre'] </td> ...x25 (26 à 50)
</tr>

Dans le fetch génère une "loop" qui répète la même ligne ça fait facilement des <td> </td>

... mais là faut que j'étende ou non sur la largeur (lorsqu'une seconde ou 3e colonne est nécessaire)!

Puis lorsque je débute la seconde colonne faut que la valeur de ma variable récupéré du fetch provienne d'un autre id de la table ???

-----------------

Pour créer des pages d'un tableau de 10 entrées (puis suivante/précédente) utilise LIMIT dans la requête SQL et un index qui lui servira de paramètre mais aussi, dans tes liens vers les autres pages pour transmettre les coordonnées des "autres" tableaux

Bon, j'ai au moins un point de départ pour les pages et ça va être assez simple probablement! Je vais chercher ce que je peux faire avec LIMIT que je ne connaissais pas. :chinois:

Lorsque j'atteins ma limite (ex. 75 -> 3 colonnes x 25 lignes) j'arrête l'affichage et je le continue... et je verrai plus tard :francais:

Lien vers le commentaire
Partager sur d’autres sites

Pour la génération de ton tableau tu fais comme cela, en gros:

$result=ma_requete_sql_avec_les_LIMIT;
$rows=fetch_de_$result;

echo '<TABLE border="0" size="750">';

while($rows){
echo '<TR><TD>',$rows['nom'],'</TD><TD>',$rows['prenom'],'</TD><TD>',$rows['age'],'</TD></TR>';
}

echo '</TABLE>';

=> Tu initialise tes données, tu fais l'entête du tableau et chaque itération du while vient créer automatique une nouvelle ligne de 3 colonnes... Avec nom, prenom, age pour mon exemple...

C magic :chinois:

Lien vers le commentaire
Partager sur d’autres sites

Salut lpimpti,

Ben voilà pour faire des while avec des tableaux du genre c'est ce qui s'appelle de la base... c'est pas là mon problème (si tu lis bien comment je veux créer mon tableau.

Voici ton exemple:

while($rows){
echo '<TR><TD>',$rows['nom'],'</TD><TD>',$rows['prenom'],'</TD><TD>',$rows['age'],'</TD></TR>';
}

Tu places des données (nom,prenom,age,...) provenant d'une colonne d'une table de BD.

Mais je veux faire un tableau HTML qui contient des colonnes avec 3 éléments du même type de champs de ma BD.

Exemple:

while($rows){
echo '<TR><TD>',$rows['nom'],'</TD><TD>',$rows['nom'],'</TD><TD>',$rows['nom'],'</TD></TR>';
}

Bien sur que dans mon exemple la valeur de nom provient de plusieurs entrées de la BD et non la même répétée.

Exemple dans ma BD que j'aurais:

ID  NOM
1    Jean
2    Robert
3    Arthur
4    Yvan
5    Frédéric
6    Guillaume
7    Pierre
...

Dans ma page web je veux des colonnes avec un maximum de 5 entrées, et lorsque ces 5 entrées ont été dépassées qu'une seconde colonne continue de lister les données jusqu'à concurrence de 3 colonnes. Lorsque ces 3 colonnes sont pleines il faut créer une seconde page et ainsi de suite.

Donc si je prends exemple sur mes valeurs fictives de ma BD ci-haut, je veux afficher de cette manière:

+---------+-------------+

| Jean      | Guillaume |

+---------+-------------+

| Robert   | Pierre       |

+----------+------------+

| Arthur    |

+-----------

| Yvan      |

+-----------

| Frédéric |

+-----------

Je sais pas si tu vois où je veux en venir. mais je sais pas comment faire mon FETCH afin de récupérer les valeur de nom afin que sur la même ligne de mon tableau je retrouverais la valeur de nom avec l'ID 1 et l'ID 6 (puis l'ID 11 si je me rends jusqu'à ma 3e colonne ou sinon faire en sorte que la requête n'appelle pas de valeur si elle n'existe pas dans la BD... sans empêcher les colonnes précédentes d'être listées) puis finalement continuer comme ça en débutant avec l'ID 16 sur la page 2....

Lien vers le commentaire
Partager sur d’autres sites

Hum... En effet, j'étais pas sur la même longueur d'onde...

Alors, pour faire ça, j'essairai de contourner le problème.

Remplir des lignes complètes et ensuite allez à la ligne suivant.

=> + facile, il suffit d'adapter le while avec un compteur qui s'incrémente, une fois arrivé sur un nombre qui détermine une nouvelle ligne, un "IF" tout bête insère le code de fin puis nouvelle ligne :non:

Si tu dois fonctionner obligatoirement en colonne, il faut t'amuser à sortir le nombre d'éléments, voir cbm de colonne tu peux remplir en entier et ensuiste avec 2 compteurs (ligne/colonne) t'amuser à reconstruire ton tableau (tjs ligne par ligne) mais en allant chercher tes données dans le bon ordre dans le FETCH...

Bref, ya de quoi s'amuser :francais:

Lien vers le commentaire
Partager sur d’autres sites

Comme je pensais... ce n'est pas super évident ! C'est un vrai casse-tête pour un débutant comme moi :mdr:

Je crois que je vais m'attaquer à d'autres parties du site en premier et lorsque j'aurai acquis de nouvelles connaissances je pourrai peut-être mieux visualiser le concept pour arriver au résultat que je veux.

Merci quand même des conseils, ça me dit où débuter mes recherches.

Lien vers le commentaire
Partager sur d’autres sites

C'est un vrai casse-tête pour un débutant comme moi  :mdr2:

Mouaih, même moi qui pense avoir un peu de bouteille en php je suis pas sûr de réussir les doigts dans le nez... :p

Mais ton idée est bonne, fait toi la main sur des fonctions plus simple et qui sait, peut-être tu trouveras simplement la soluce... :keskidit:

Ou alors il faudra contourner la difficulté... :D

Tiens moi au courant ! :mdr:

Ciao :D

Lien vers le commentaire
Partager sur d’autres sites

J'ai pas le code ici, mais j'ai fait exactement ça, dans une appli PHP il y a pas longtemps.

Si c'était ligne par ligne, ça serait plus sympa (soit dit au passage).

Sous réserve que tu affiches ta liste par ID croissant (ton exemple, donc):

- SELECT * FROM table WHERE ID>=$index ORDER BY ID LIMIT 0,15;

Pour la première page: $index = 0

Deuxième page: $index = (max de l'ID précédent +1 à passer par GET ou POST)

etc...

Ca c'est pour le cas, idéal, où tu navigues d'une page à l'autre par des liens (précédent-suivant). Si tu veux un index chiffré, il te faut en plus, déterminer les ID de toutes les quinzièmes entrées -> un peu plus pénible mais loin d'être insurmontable.

Après, pour l'affichage:

-Stocke le résultat de la requête dans un tableau $tab (de longueur max 15 donc).

-Une boucle for avec un index $i de 0 à 4 avec à chaque passage:

Affichage de $tab[$i] $tab[$i+5] $tab[$i*10]

Lien vers le commentaire
Partager sur d’autres sites

  • 5 semaines après...

De retour...

Je me suis finalement restreint à utiliser un tableau ligne par ligne (au-lieu de créer les listes <LI> monté sur un tableau à 3 colonnes..)

Ça va plutot bien pour débuter, mais j'accroche à un endroit.

Je suis capable de faire ma requête avec mon LIMIT (que j'ai configuré à 15), il n'y a que 15 items qui s'affichent dans la page et c'est OK.

Maintenant je ne sais pas trop comment me structurer afin d'avoir un lien qui me permettra de passer au 15 autres items (page2), et autres 15 autres (page3),...

Je me suis fait conseillé:

select * from items limit $lignede, $lignea
$lignede = 0, $lignea = 15 pour la premier page
$lignede = 15, $lignea = 30 pour la deuxième ....

Ce qui semble logique, mais comment faire pour déterminer le nombre de lignes total dans ma BD pour créer un index numéroté (page1, page2, page3, ...)

Lien vers le commentaire
Partager sur d’autres sites

Select ... from ... LIMIT 15 OFFSET 16	

L'offset permet de préciser ne numéro de la première ligne retournée. Ici tu as donc les lignes 16 à 30.

Ensuite pour paginer c'est très simple, il suffit de calculer l'offset dynamiquement :

offset = 1 + 15*page

PS : c'est incroyable le nombre de problèmes qu'on peut résoudre simplement en se donnant la peine de lire la doc... :-D

http://dev.mysql.com/doc/refman/4.1/en/select.html

Lien vers le commentaire
Partager sur d’autres sites


J'ai du faire ca y a pas longtemps pour afficher une grande liste d'annonces de voitures.

J'ai imaginé le système dans ma petite tete et voici le résultat:

<?php
include('connect.php');
$j=0;
$limit=7;
@$query1="SELECT * FROM voiture WHERE vendu=0;";
$result1=@pg_exec($cnx,$query1);
while($liste1=@pg_fetch_array($result1,$j++))
{
}
$j=$j-1;
$nbpages=ceil($j/$limit);
@$debut=@$_GET[debut];
@$page=@$_GET

;
@$query="SELECT * FROM voiture WHERE vendu=0 ORDER BY marque,modele,prix_de_vente LIMIT $limit OFFSET $debut;";
$result=@pg_exec($cnx,$query);
if(!$result)
{
echo("Erreur");
exit();
}
if($result)
{
$i=0;
while($liste=@pg_fetch_array($result,$i++))
{
echo("<table width=100% border=1>");
echo("<tr>");
if(@$liste[photo]==0)
{
echo("<td width=15%> <a href=details_voiture.php?Submit=Détails&hiddenField=$liste[id_voiture]><img src=C:/images/noimage.gif width=60 height=45></a></td>");
echo("<td width=85%> <b>$liste[marque] $liste[modele]</b> $liste[couleur] de $liste[annee]<br> $liste[kilometrage] km, moteur $liste[carburant] de $liste[puissance] ch. <br> Prix (HTVA): $liste[prix_de_vente]<br></td>");
}
else
{
echo("<td width=15%> <a href=details_voiture.php?Submit=Détails&hiddenField=$liste[id_voiture]><img src=C:/images/$liste[id_voiture].jpg width=60 height=45></a></td>");
echo("<td width=85%> <b>$liste[marque] $liste[modele]</b> $liste[couleur] de $liste[annee]<br> $liste[kilometrage] km, moteur $liste[carburant] de $liste[puissance] ch. <br> Prix (HTVA): $liste[prix_de_vente]<br></td>");
}
echo("</tr>");
echo("</table>");
}
echo("<br><div align=center>");
if(@$_GET

!=1)
{
@$precedent=$_GET[debut]-$limit;
@$page_precedente=$_GET

-1;
echo("<a href=liste_voitures.php?debut=$precedent&page=$page_precedente>Page précédente</a>  ");
}
if($page<$nbpages)
{
@$page_suivante=$_GET

+1;
@$suivant=$_GET[debut]+$limit;
echo("<a href=liste_voitures.php?debut=$suivant&page=$page_suivante>Page suivante</a>");
}
echo("</div>");
if($i==1)
{
echo("Aucune voiture n'a été trouvée selon les critères choisis");
}
}
?>

Il faut juste penser, lorsque tu accèdes pour la premiere fois à la page, à envoyer en parametres (dans l url) ?debut=0&page=1

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos conseils !

Voici le résultat final avec le code HTML et PHP incluant tout : (nom du fichier: search.php)

<html>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<TITLE>Recherche</TITLE>
</HEAD>
<BODY bgcolor="white" scroll="auto">

<form name="form" action="search.php" method="get">
<input type="text" name="motcle" class="bouton">
<input type="submit" name="submit" value="Rechercher">
</form>

<table border="0" cellspacing="0" width="100%">

<?php
$var = $_GET['motcle'];
$recherche = trim($var);
if (!($limit))
{
$limit = 15;
}
if (!($page))
{
$page = 0;
} 
if($recherche == "")
{
$recherche = "%";
}
mysql_connect('localhost', 'user', 'password') or die('Impossible de se connecter au serveur MySQL');
mysql_select_db('mabdd') or die('Base de données inexistante');
$numresults = mysql_query("SELECT * FROM matable WHERE titre LIKE \"%$recherche%\" ORDER BY titre");
$numrows = mysql_num_rows($numresults);
if($numrows == 0)
{
echo ("<tr><td>Aucun résultat trouvé</td></tr></table></body></html>");
exit;
}
$pages = intval($numrows/$limit);
if ($numrows % $limit)
{
$pages++;
}
$current = ($page/$limit) + 1;
if (($pages < 1) || ($pages == 0))
{
$total = 1;
}
else 
{
$total = $pages;
}
$first = $page + 1;
if (!((($page + $limit) / $limit) >= $pages) && $pages != 1) 
{
$last = $page + $limit;
} 
else
{
$last = $numrows;
}
echo ("<tr><td width=\"100%\" align=\"left\"><font face=\"Verdana\" size=\"-2\">Résultats <b>$first</b> à <b>$last</b> (total:$numrows) --- Page <b>$current</b> de <b>$total</b></font></td></tr>");
echo ("<tr><td><hr></td>\n</tr>");
$results = mysql_query("SELECT * FROM procedures WHERE titre LIKE \"%$recherche%\" ORDER BY titre ASC LIMIT $page, $limit") or die("Erreur de requête");
while($row = mysql_fetch_assoc($results))
{
$titre = $row['titre'];
$lien = $row['lien'];
echo ("<tr onmouseover=\"style.color='#FFD742'\" onmouseout=\"style.color='#000000'\"><td valign=\"top\" width=\"100%\">\n<font onclick=\"window.open('data/$lien','_blank','')\" style=\"cursor:pointer\" title=\"Cliquez pour visualiser le fichier\">$titre ( $lien )</font></td>\n</tr>");
echo ("\n");
}
echo ("<tr><td><hr></td>\n</tr>");
if ($page != 0) 
{
$back_page = $page - $limit;
echo("<tr><td><font face=\"Verdana\" size=\"-2\"><a href=\"$PHP_SELF?query=$query&page=$back_page&limit=$limit\">précédent</a> ");
}
else 
{
$back_page = $page - $limit;
echo("<tr><td><font face=\"Verdana\" size=\"-2\">précédent ");
}
for ($i=1; $i <= $pages; $i++)
{
	$ppage = $limit*($i - 1);
if ($ppage == $page)
	{
		echo("<b>$i</b> ");
	}
	else
	{
		echo("<a href=\"$PHP_SELF?query=$query&page=$ppage&limit=$limit\">$i</a> ");
	}
}
if (!((($page+$limit) / $limit) >= $pages) && $pages != 1) 
{
$next_page = $page + $limit;
echo("<a href=\"$PHP_SELF?query=$query&page=$next_page&limit=$limit\">suivant</a></font></td></tr>");
}
else 
{
$next_page = $page + $limit;
echo("suivant</font></td></tr>");
}
mysql_close();
?>
</table>
</body>
</html>

Lien vers le commentaire
Partager sur d’autres sites

Pourquoi utilises tu le fetch comme source directe d'information.

Il n'y a pas beaucoup de donnée dans ce tableau apparemment.

Si tu veux le mettre sur 3 colonnes:

Tu vide ton fetch dans un nouveau tableau

Et ensuite tu balayes ton tableau par pas de 3.

$i=0;

while(($i+3)<count($tab))

{

print($tab[$i][$titre]);

print($tab[$i+1][$titre]);

print($tab[$i+2][$titre]);

$i+=3;

}

print les éléments qui restent dans le tableau (1 ou 2)

Vu que ton tableau contient peut de données, balayer 2X le tableau à peut d'influence.

1X pour mettre le resultat de ta requète dans un tableau

1X pour afficher les infos du tableau

Lien vers le commentaire
Partager sur d’autres sites

... ma fonction initiale c'est technicien et non programmeur

Je suis pas un expert en prog. Si je trouve quelque chose qui fait le boulot, ça fait mon affaire !

Mais merci du conseil, je vais en tenir compte pour des pojets futurs. C'est pas évident de comprendre toutes les possibilités de programmation, surtout quand on ne fait pas ça à la journée longue.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...