Tabel splitsen en meerdere pagina's
We hebben een site (soort toprank site) waarbij men sites kunnen aanmelden, doormiddel van clicks komen ze hoger op de pagina...
Alles werkt ook tot zover alleen willen wij de tabel die we hebben opsplitsen in 3 per pagina en wanneer we naar pagina 2 gaan klopt de telling niet meer.
Op pagina 1 zie je netjes nummer 1, 2, 3 enzovoor enzovoort.. Tot aan 30 toe maar wanneer we naar pagina 2 gaan begint de telling opnieuw, hier zal juist nummer 31 dan moeten komen.
Verder willen wij dus ook in plaats van 1 tabel die we nu hebben 3 tabellen per pagina laten zien met 10 records per tabel zodat we daar tussenin een advertentie ruimte kunnen maken.
Wie is hier eventueel heel handig in en kan dit snel vinden doormiddel van onze code?
Onze code bovenaan de pagina:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
$per_pagina_record = 30;
if (isset($_GET["pagina"])) {
$pagina = $_GET["pagina"];
} else {
$pagina=1;
}
if (isset($_GET["pagina"])) {
$pagina = $_GET["pagina"];
} else {
$pagina=1;
}
Dan onze tabel:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<table class="tabel">
<tr>
<td class="tabelkop" style="width:5%;text-align: center;">Nummer</td>
<td class="tabelkop" style="width:85%;text-align: center;">Naam en content</td>
</tr>
<?php
$sql = "SELECT * from websites WHERE `status` = '2' ORDER BY aantalin DESC LIMIT $start_from, $per_pagina_record";
$return = $conn->query($sql );
while ($row = $return->fetch_object()){
if($i%2 == 0)
{
$color = "row1"; // Kleur 1
}
else
{
$color = "row2"; // Kleur 2
}
++$i;
echo '<tr class="'.$color.'"><td class="rank">'.$i.'</td><td class="col2"> <div style="text-align: center;"> <a href="index.php?uit='.$row->link_id.'" target="_blank"><img src="'.$row->banner.'" class="b468" alt="'.$row->site_naam.'"></a></div> <a href="index.php?uit='.$row->link_id.'" target="_blank"><strong>'.$row->site_naam.'</strong></a><br>
'.$row->beschrijving.' </td>
</tr>'; } ?>
</table>
<tr>
<td class="tabelkop" style="width:5%;text-align: center;">Nummer</td>
<td class="tabelkop" style="width:85%;text-align: center;">Naam en content</td>
</tr>
<?php
$sql = "SELECT * from websites WHERE `status` = '2' ORDER BY aantalin DESC LIMIT $start_from, $per_pagina_record";
$return = $conn->query($sql );
while ($row = $return->fetch_object()){
if($i%2 == 0)
{
$color = "row1"; // Kleur 1
}
else
{
$color = "row2"; // Kleur 2
}
++$i;
echo '<tr class="'.$color.'"><td class="rank">'.$i.'</td><td class="col2"> <div style="text-align: center;"> <a href="index.php?uit='.$row->link_id.'" target="_blank"><img src="'.$row->banner.'" class="b468" alt="'.$row->site_naam.'"></a></div> <a href="index.php?uit='.$row->link_id.'" target="_blank"><strong>'.$row->site_naam.'</strong></a><br>
'.$row->beschrijving.' </td>
</tr>'; } ?>
</table>
En vervolgens onze pagination:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<div class="pagination">
<?php
$query = "SELECT COUNT(*) FROM websites WHERE `status` = '2'";
$rs_result = mysqli_query($conn, $query);
$row = mysqli_fetch_row($rs_result);
$total_records = $row[0];
echo "</br>";
$total_paginas = ceil($total_records / $per_pagina_record);
$pagLink = "";
if($pagina>=2){
echo "<a href='index.php?pagina=".($pagina-1)."'><b> Vorige pagina </b></a>";
}
for ($i=1; $i<=$total_paginas; $i++) {
if ($i == $pagina) {
$pagLink .= "<a class = 'active' href='index.php?pagina=".$i."'><b>".$i."</b> </a>";
} else {
$pagLink .= "<a href='index.php?pagina=".$i."'><b>".$i."</b> </a>";
}
};
echo $pagLink;
if($pagina<$total_paginas){
echo "<a href='index.php?pagina=".($pagina+1)."'><b> Volgende pagina </b></a>";
}
?>
</div>
<?php
$query = "SELECT COUNT(*) FROM websites WHERE `status` = '2'";
$rs_result = mysqli_query($conn, $query);
$row = mysqli_fetch_row($rs_result);
$total_records = $row[0];
echo "</br>";
$total_paginas = ceil($total_records / $per_pagina_record);
$pagLink = "";
if($pagina>=2){
echo "<a href='index.php?pagina=".($pagina-1)."'><b> Vorige pagina </b></a>";
}
for ($i=1; $i<=$total_paginas; $i++) {
if ($i == $pagina) {
$pagLink .= "<a class = 'active' href='index.php?pagina=".$i."'><b>".$i."</b> </a>";
} else {
$pagLink .= "<a href='index.php?pagina=".$i."'><b>".$i."</b> </a>";
}
};
echo $pagLink;
if($pagina<$total_paginas){
echo "<a href='index.php?pagina=".($pagina+1)."'><b> Volgende pagina </b></a>";
}
?>
</div>
Dit werkt tot zo ver echt goed, althans voor de homepagina, wanneer we naar de 2e pagina gaan begint de telling opnieuw en we zouden graag de tabellen willen verdelen.
Alvast bedankt voor het lezen en helpen!
Heb je deze code zelf geschreven?
Pagination bijvoorbeeld komt van Javatpoint af...
Terug naar je vraag. Ik ken jouw code dus niet, maar door 'm te lezen zie ik het volgende.
In je SQL-query staat een variabele $start_from. Omdat die nergens wordt geset zal die als 0 worden geïnterpreteerd. Dit betekent dat de LIMIT functie in je query altijd start bij 0. Echter, op pagina 2 moet die niet starten bij 0 maar bij 30. En op pagina 3 moet die niet starten bij 30 maar bij 60. Het enige wat je dus hoeft te doen is die $start_from instellen nadat je het paginanummer weet.
Had je deze code zelf geschreven, dan had je de vraag waarschijnlijk niet hoeven stellen ;-) Weet dus waar je mee bezig bent. Succes.
Gewijzigd op 19/08/2022 11:20:21 door Ozzie PHP
Deze was ik er nog bij vergeten te zetten, dit is de start_from
Voeg maar toe en kijk wat er gebeurt, ofwel debuggen:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$start_from = ($pagina-1) * $per_pagina_record;
echo '**** start = ' . $start_from . ' *****<br>';
?
$start_from = ($pagina-1) * $per_pagina_record;
echo '**** start = ' . $start_from . ' *****<br>';
?
Op de eerste pagina start je met 0 buiten je while-loop waarbij je $i++ doet in je whileloop om er eentje bij op te tellen.
Uiteindelijk op de volgende pagina begin je met 30, en op de volgende pagina met 60. Dit aantal kan je prima bepalen aan de hand van de $_GET['pagina'] die het paginanummer omschrijft.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<table class="tabel">
<tr>
<td class="tabelkop" style="width:5%;text-align: center;">Nummer</td>
<td class="tabelkop" style="width:85%;text-align: center;">Naam en content</td>
</tr>
<?php
$sql = "SELECT * from websites WHERE `status` = '2' ORDER BY aantalin DESC LIMIT $start_from, $per_pagina_record";
$return = $conn->query($sql );
while ($row = $return->fetch_object()){
if($i%2 == 0)
{
$color = "row1"; // Kleur 1
}
else
{
$color = "row2"; // Kleur 2
}
++$i;
echo '<tr class="'.$color.'"><td class="rank">'.$i.'</td><td class="col2"> <div style="text-align: center;"> <a href="index.php?uit='.$row->link_id.'" target="_blank"><img src="'.$row->banner.'" class="b468" alt="'.$row->site_naam.'"></a></div> <a href="index.php?uit='.$row->link_id.'" target="_blank"><strong>'.$row->site_naam.'</strong></a><br>
'.$row->beschrijving.' </td>
</tr>'; } ?>
</table>
<tr>
<td class="tabelkop" style="width:5%;text-align: center;">Nummer</td>
<td class="tabelkop" style="width:85%;text-align: center;">Naam en content</td>
</tr>
<?php
$sql = "SELECT * from websites WHERE `status` = '2' ORDER BY aantalin DESC LIMIT $start_from, $per_pagina_record";
$return = $conn->query($sql );
while ($row = $return->fetch_object()){
if($i%2 == 0)
{
$color = "row1"; // Kleur 1
}
else
{
$color = "row2"; // Kleur 2
}
++$i;
echo '<tr class="'.$color.'"><td class="rank">'.$i.'</td><td class="col2"> <div style="text-align: center;"> <a href="index.php?uit='.$row->link_id.'" target="_blank"><img src="'.$row->banner.'" class="b468" alt="'.$row->site_naam.'"></a></div> <a href="index.php?uit='.$row->link_id.'" target="_blank"><strong>'.$row->site_naam.'</strong></a><br>
'.$row->beschrijving.' </td>
</tr>'; } ?>
</table>
Hier werkte de telling al zonder pagination... toen was er enkel nog geen sprake van pagina 2, 3 enzovoort enzovoort... Ik weet dus dat de telling wel werkt echter wil ik het namelijk ook nog zo hebben dat het op de pagina's inderdaad verder zal gaan met 30, 60 enzovoort enzovoort.
Ook wil ik graag van 1 tabel per pagina die 3 laten zien van 10 per stuk... alleen valt dit net een beetje buiten mijn range geloof ik :)
Verder zie ik dat je ++$i gebruikt, terwijl het $i++ is.
Maar goed, je pagination werkt inmiddels? Dan kan je aan de hand van je $_GET['pagina'] bepalen waar je $i weer start.
Toevoeging op 19/08/2022 12:00:04:
Nog een goede tip:
Je hoeft echt niet met PHP te bepalen welke kleuren de rijen om en om zijn. Dan kan prima met CSS:
https://www.w3.org/Style/Examples/007/evenodd.en.html
Gewijzigd op 19/08/2022 12:00:18 door - Ariën -
De pagination heeft altijd wel gewerkt, hij gaat netjes naar pagina 1 en 2 als voorbeeld maar de teller begint telkens op 0 wat juist bij pagina 2 op 30 zou moeten beginnen
Dat scheelt weer een paar lijnen aan PHP-code.
Ik heb het verhaal net al uitgelegd. Je moet de startwaarde van $i bepalen aan de hand van je $_GET['pagina'] en het aantal rijen.
Zie mijn laatste post hierboven. Al geprobeerd?
Ozzie PHP op 19/08/2022 12:05:57:
Zie mijn laatste post hierboven. Al geprobeerd?
Hier had ik ook wat mee geprobeerd maar dan kreeg ik vanaf 0, 2, 4 te zien...
ik ben inmiddels een stap verder:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$per_pagina_record = 30;
if (isset($_GET["pagina"])) {
$pagina = $_GET["pagina"];
} else {
$pagina=1;
}
$start_from = ($pagina-1) * $per_pagina_record;
$i = $start_from;
if (isset($_GET["pagina"])) {
$pagina = $_GET["pagina"];
} else {
$pagina=1;
}
$start_from = ($pagina-1) * $per_pagina_record;
$i = $start_from;
Hiermee begint hij op pagina 1 op 1 te tellen en op pagina 2 krijg ik nu 30 te zien en op pagina 3 60 enzovoort, dit werkt nu ideaal lijkt me dan zo.
Nu zou ik graag nog willen dat ik dus 3 tabellen per pagina kan krijgen, hoe is dit te realiseren?
Dus als het ware zo:
1-10
ruimte over voor iets
11 - 20
ruimte
21 - 30
Gewijzigd op 19/08/2022 13:19:24 door Ray Mond
Met de modulo-operator.
En is het nog gelukt?
Helaas tot nu nog niet nee...
Waar loop je op vast?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
$get = (object) $_GET;
$pag_size = 30;
$group_size = 10;
if ( ! empty($get->pag)) {
$number_first = ($get->pag - 1) * $pag_size + 1;
$number_last = $number_first + $pag_size;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style>
body {font: 14px Verdana;}
</style>
</head>
<body>
<?php
if ( ! empty($number_first)) {
for ($i = $number_first; $i < $number_last; $i++) {
printf('<p>This is item nr %d</p>', $i);
if ($i % $group_size === 0 && ($pag_size * $get->pag) !== $i) {
printf('<hr>');
}
}
}
?>
</body>
</html>
$get = (object) $_GET;
$pag_size = 30;
$group_size = 10;
if ( ! empty($get->pag)) {
$number_first = ($get->pag - 1) * $pag_size + 1;
$number_last = $number_first + $pag_size;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
<style>
body {font: 14px Verdana;}
</style>
</head>
<body>
<?php
if ( ! empty($number_first)) {
for ($i = $number_first; $i < $number_last; $i++) {
printf('<p>This is item nr %d</p>', $i);
if ($i % $group_size === 0 && ($pag_size * $get->pag) !== $i) {
printf('<hr>');
}
}
}
?>
</body>
</html>
Alles werkt, pagination, aantallen per pagina maar ik wil echt zeg maar nu op elke pagina 3 tabellen van 10 per stuk en daar kom ik niet uit jammer genoeg.
Zie regel 29 van mijn voorbeeld :-)
Die werking is er al volledig..
Wat ik echt wil is dat de 30 items per pagina per tabel nu zijn zal veranderen naar 10 per tabel zeg maar
Gewijzigd op 23/08/2022 18:30:00 door Ray Mond