Meerdere pagina's op 1 pagina.
Maar nu is het zo dat de pagina super lang word.
Hoe kan ik nou op deze zelfde pagina iets maken waardoor je naar next page en previous page kan gaan?
Wat ik me zo kan bedenken:
Als er bijv 10 rijen zijn, wordt de 11e en de daaropvolgende niet meer laten zien, maar komt er een next page knopje.
Als het goed is kan ik dit doen met rowid. Bijv alleen rowid 1 tm 10 laten zien.
En stel je voor ik heb dan index.php?p=reports en daar wil ik index.php?p=reports&page=2 van maken.
dan zou ik bij page=2 bijvoorbeeld alleen 11 tm 20 laten zien.
Alleen wat ik hierboven heb beschreven lijkt me niet de beste manier om dit te doen, en mijn vraag is dan. Wat is wel de juiste manier om dit te doen?
Want met de manier die ik zojuist beschreven heb zou ik dus iedere pagina moeten aangeven. en als ik er maar 10 heb gemaakt en er zijn er dan 11 heb ik dus een probleem.
Heb je al eens gekeken op het trefwoord: 'pagina navigatie' of 'page navigation'
http://www.sitemasters.be/tutorials/1/1/198/PHP/Pagina_navigatie_in_PHP_en_MySQL
Ik zou het dan wel meteen herschrijven naar MySQLi.
Gewijzigd op 23/02/2018 22:54:10 door - Ariën -
- Ariën - op 23/02/2018 22:53:39:
En als je het zelf wilt bouwen/begrijpen:
http://www.sitemasters.be/tutorials/1/1/198/PHP/Pagina_navigatie_in_PHP_en_MySQL
Ik zou het dan wel meteen herschrijven naar MySQLi.
http://www.sitemasters.be/tutorials/1/1/198/PHP/Pagina_navigatie_in_PHP_en_MySQL
Ik zou het dan wel meteen herschrijven naar MySQLi.
Bedankt voor de link. In mijn geval dus sqlite.:P
Nu heb ik geprobeerd om dit te doen maar ik krijg de volgende errors:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Notice: Undefined index: Status in D:\AppServ\www\ucp\reports.php on line 68
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 78
Notice: Undefined index: PlayerName in D:\AppServ\www\ucp\reports.php on line 87
Notice: Undefined index: Reporter in D:\AppServ\www\ucp\reports.php on line 88
Notice: Undefined index: Report in D:\AppServ\www\ucp\reports.php on line 89
Notice: Undefined index: Date in D:\AppServ\www\ucp\reports.php on line 90
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 91
'.(0+1).'
# Status Name Reported By Report Date Action
Pending View report
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 92
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 78
Notice: Undefined index: PlayerName in D:\AppServ\www\ucp\reports.php on line 87
Notice: Undefined index: Reporter in D:\AppServ\www\ucp\reports.php on line 88
Notice: Undefined index: Report in D:\AppServ\www\ucp\reports.php on line 89
Notice: Undefined index: Date in D:\AppServ\www\ucp\reports.php on line 90
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 91
'.(0+1).'
# Status Name Reported By Report Date Action
Pending View report
Notice: Undefined index: ID in D:\AppServ\www\ucp\reports.php on line 92
Ik heb iets fout gedaan waarschijnlijk met dit:
maar geen idee wat ik fout heb gedaan.
Dit is mijn code:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
error_reporting(E_ALL);
$nrows = 0;
$res1q = "SELECT COUNT(ID) FROM REPORTS";
$res1 = $db->query($res1q);
while($res1->fetchArray(SQLITE3_ASSOC) )
{
$nrows++;
}
$items_totaal = $nrows;
$res1->finalize();
$items_per_pagina = 5;
$aantal_paginas = ceil($items_totaal / $items_per_pagina);
$huidige_pagina = 0; // default
if(isset($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] < $aantal_paginas) {
$huidige_pagina = $_GET['p'];
}
$offset = $huidige_pagina * $items_per_pagina;
$res2q = "SELECT * FROM REPORTS ORDER BY ID DESC LIMIT '$offset','$items_per_pagina'";
$res2 = $db->query($res1q);
while($row = $res2->fetchArray(SQLITE3_ASSOC) )
{
$status = $row['Status'];
if($status==1)
{
echo "<tr class='success'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Open</td>";
}
elseif($status==0)
{
echo "<tr class='warning'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Pending</td>";
}
elseif($status==2)
{
echo "<tr class='danger'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Closed</td>";
}
echo "<td>". $row['PlayerName'] . "</td>";
echo "<td>". $row['Reporter'] . "</td>";
echo "<td>". $row['Report'] . "</td>";
echo "<td>". $row['Date'] . "</td>";
echo "<td><a href='index.php?p=viewreport&id=". $row['ID'] . "'><button class='btn btn-info'>View report</button></a> ";
echo "<a href='index.php?p=deletereport&id=". $row['ID'] . "'><button class='btn btn-danger'>Delete</button></a></td>";
echo "</tr>";
}
$res2->finalize();
for($i = 0; $i < $aantal_paginas; $i++) {
if($huidige_pagina == $i) {
echo "<b>'.($i+1).'</b>";
} else {
echo "<a href='".$_SERVER['PHP_SELF']."?p=".$i."'>'.($i+1).'</a>";
}
if($i < $aantal_paginas - 1) {
echo " - ";
}
}
$db->close();
?>
error_reporting(E_ALL);
$nrows = 0;
$res1q = "SELECT COUNT(ID) FROM REPORTS";
$res1 = $db->query($res1q);
while($res1->fetchArray(SQLITE3_ASSOC) )
{
$nrows++;
}
$items_totaal = $nrows;
$res1->finalize();
$items_per_pagina = 5;
$aantal_paginas = ceil($items_totaal / $items_per_pagina);
$huidige_pagina = 0; // default
if(isset($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] > 0 && $_GET['p'] < $aantal_paginas) {
$huidige_pagina = $_GET['p'];
}
$offset = $huidige_pagina * $items_per_pagina;
$res2q = "SELECT * FROM REPORTS ORDER BY ID DESC LIMIT '$offset','$items_per_pagina'";
$res2 = $db->query($res1q);
while($row = $res2->fetchArray(SQLITE3_ASSOC) )
{
$status = $row['Status'];
if($status==1)
{
echo "<tr class='success'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Open</td>";
}
elseif($status==0)
{
echo "<tr class='warning'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Pending</td>";
}
elseif($status==2)
{
echo "<tr class='danger'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Closed</td>";
}
echo "<td>". $row['PlayerName'] . "</td>";
echo "<td>". $row['Reporter'] . "</td>";
echo "<td>". $row['Report'] . "</td>";
echo "<td>". $row['Date'] . "</td>";
echo "<td><a href='index.php?p=viewreport&id=". $row['ID'] . "'><button class='btn btn-info'>View report</button></a> ";
echo "<a href='index.php?p=deletereport&id=". $row['ID'] . "'><button class='btn btn-danger'>Delete</button></a></td>";
echo "</tr>";
}
$res2->finalize();
for($i = 0; $i < $aantal_paginas; $i++) {
if($huidige_pagina == $i) {
echo "<b>'.($i+1).'</b>";
} else {
echo "<a href='".$_SERVER['PHP_SELF']."?p=".$i."'>'.($i+1).'</a>";
}
if($i < $aantal_paginas - 1) {
echo " - ";
}
}
$db->close();
?>
Toevoeging op 24/02/2018 00:16:34:
dit werkt ook niet:
Ik raad ook aan om nooit * te gebruiken, maar altijd alle veldnamen te benoemen. En die single-qutoes in je query (lijn 21) kloppen ook niet met de double-quotes die je daar gebruikt.
- Ariën - op 24/02/2018 00:16:44:
Ik denk dat de veldnamen niet kloppen in je je $row-variabelen. Debug deze array anders eens met print_r().
Ik raad ook aan om nooit * te gebruiken, maar altijd alle veldnamen te benoemen. En die single-qutoes in je query (lijn 21) kloppen ook niet met de double-quotes die je daar gebruikt.
Ik raad ook aan om nooit * te gebruiken, maar altijd alle veldnamen te benoemen. En die single-qutoes in je query (lijn 21) kloppen ook niet met de double-quotes die je daar gebruikt.
De veldnamen kloppen wel eigenlijk. Geen idee wat de fout was. Denk dat het een baggere tutorial was want had hem zo uit de tutorial overgenomen.
Ik heb de volgende link als voorbeeld gebruikt, en dat werkt gelukkig prima.
https://stackoverflow.com/questions/41777993/php-pagination-next-previous-button
Gewijzigd op 24/02/2018 02:06:29 door Jasper Schellekens
Het is zeker ook leerzaam! Door naar een ander script te grijpen leer je natuurlijk niks.
Gewijzigd op 24/02/2018 02:17:40 door - Ariën -
- Ariën - op 24/02/2018 02:14:59:
Zoals ik al zei: Ga je script eens debuggen door de waardes achter de variabelen te tonen.
Het is zeker ook leerzaam! Door naar een ander script te grijpen leer je natuurlijk niks.
Het is zeker ook leerzaam! Door naar een ander script te grijpen leer je natuurlijk niks.
Dat ligt eraan wat je doet met het script. Maar je hebt gelijk inderdaad over niets leren.
Ik heb het nu voor mekaar maar echter nog een vraag.
Is er een manier om te kijken welke pagina de laatste pagina is?
Bijvoorbeeld op de eerste pagina wil ik niet dat de previous knop word laten gezien en dat doe ik zo:
Code (php)
1
2
3
4
2
3
4
if($page != 1)
{
echo "<li><a href='index.php?p=admin&option=reports&page=".($page-1)."' class='button'>Previous</a></li>";
}
{
echo "<li><a href='index.php?p=admin&option=reports&page=".($page-1)."' class='button'>Previous</a></li>";
}
hoe kan ik dit met de laatste pagina ook doen?
Dit is de volledige code die ik nu heb:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
<?php
error_reporting(E_ALL);
$limit = 20;
if (isset($_GET["page"] ))
{
$page = $_GET["page"];
}
else
{
$page=1;
};
$record_index= ($page-1) * $limit;
$sql = "SELECT * FROM REPORTS LIMIT $record_index, $limit";
$stmt = $db->query($sql);
while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
{
$status = $row['Status'];
if($status==1)
{
echo "<tr class='success'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Open</td>";
}
elseif($status==0)
{
echo "<tr class='warning'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Pending</td>";
}
elseif($status==2)
{
echo "<tr class='danger'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Closed</td>";
}
echo "<td>". $row['PlayerName'] . "</td>";
echo "<td>". $row['Reporter'] . "</td>";
echo "<td>". $row['Report'] . "</td>";
echo "<td>". $row['Date'] . "</td>";
echo "<td><a href='index.php?p=viewreport&id=". $row['ID'] . "'><button class='btn btn-info'>View report</button></a> ";
echo "<a href='index.php?p=deletereport&id=". $row['ID'] . "'><button class='btn btn-danger'>Delete</button></a></td>";
echo "</tr>";
}
$stmt->finalize();
$sql = "SELECT COUNT(*) FROM REPORTS";
$stmt = $db->query($sql);
$row = $stmt->fetchArray(SQLITE3_ASSOC);
// echo $total_records;
$total_pages = ceil($countrows / $limit);
//$pagLink = "<div class='pagination'>";
for ($i=1; $i<=$total_pages; $i++) {
echo "<p align='center'><ul class='pagination'>";
if($page != 1)
{
echo "<li><a href='index.php?p=admin&option=reports&page=".($page-1)."' class='button'>Previous</a></li>";
}
echo "<li><a href='index.php?p=admin&option=reports&page=".$page."'>Page ".$page."</a></li>";
echo "<li><a href='index.php?p=admin&option=reports&page=".($page+1)."' class='button'>Next</a></li></p>";
echo"</ul>";
};
$db->close();
?>
error_reporting(E_ALL);
$limit = 20;
if (isset($_GET["page"] ))
{
$page = $_GET["page"];
}
else
{
$page=1;
};
$record_index= ($page-1) * $limit;
$sql = "SELECT * FROM REPORTS LIMIT $record_index, $limit";
$stmt = $db->query($sql);
while($row = $stmt->fetchArray(SQLITE3_ASSOC) )
{
$status = $row['Status'];
if($status==1)
{
echo "<tr class='success'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Open</td>";
}
elseif($status==0)
{
echo "<tr class='warning'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Pending</td>";
}
elseif($status==2)
{
echo "<tr class='danger'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Closed</td>";
}
echo "<td>". $row['PlayerName'] . "</td>";
echo "<td>". $row['Reporter'] . "</td>";
echo "<td>". $row['Report'] . "</td>";
echo "<td>". $row['Date'] . "</td>";
echo "<td><a href='index.php?p=viewreport&id=". $row['ID'] . "'><button class='btn btn-info'>View report</button></a> ";
echo "<a href='index.php?p=deletereport&id=". $row['ID'] . "'><button class='btn btn-danger'>Delete</button></a></td>";
echo "</tr>";
}
$stmt->finalize();
$sql = "SELECT COUNT(*) FROM REPORTS";
$stmt = $db->query($sql);
$row = $stmt->fetchArray(SQLITE3_ASSOC);
// echo $total_records;
$total_pages = ceil($countrows / $limit);
//$pagLink = "<div class='pagination'>";
for ($i=1; $i<=$total_pages; $i++) {
echo "<p align='center'><ul class='pagination'>";
if($page != 1)
{
echo "<li><a href='index.php?p=admin&option=reports&page=".($page-1)."' class='button'>Previous</a></li>";
}
echo "<li><a href='index.php?p=admin&option=reports&page=".$page."'>Page ".$page."</a></li>";
echo "<li><a href='index.php?p=admin&option=reports&page=".($page+1)."' class='button'>Next</a></li></p>";
echo"</ul>";
};
$db->close();
?>
En ik denk dat het wenselijk is om de for-loop alleen maar van de oplopende nummers uit $total_pages te voorzien. De linkjes 'next' en 'previous' horen daar niet in. Alleen wel weer een statement om de huidige pagina in de rij getallen visueel duidelijk te maken met een vergelijking tussen $_GET['page'] en $total_page.
Gewijzigd op 24/02/2018 08:47:16 door - Ariën -
Jasper Schellekens op 24/02/2018 02:06:02:
De veldnamen kloppen wel eigenlijk. Geen idee wat de fout was. Denk dat het een baggere tutorial was want had hem zo uit de tutorial overgenomen.
Dus je knipt en plakt iets dat meer dan tien jaar oud is en wat tevens geschreven is voor een andere database, en het werkt niet direct? Dat moet wel aan de tutorial liggen dan :).
Jasper Schellekens op 24/02/2018 00:09:24:
geen idee
Mogelijk ligt hier de oorzaak. Als je iets niet begrijpt, maakt het dat niet noodzakelijkerwijs fout.
Ik vraag mij sterk af of je uberhaupt de moeite hebt genomen om de begeleidende tekst te lezen. Ook onderschat je waarschijnlijk de tijd en moeite die is gaan zitten in het schrijven van deze tutorial die probeert duidelijk uit te leggen wat het concept "pagina-navigatie" nu precies inhoudt. Iets met niet verder kijken dan je neus lang is.
Los van het feit dat de code gedateerd is (ik zou het e.e.a. anders aanpakken tegenwoordig) is het idee nog steeds hetzelfde.
Als je het idee begrijpt, dan lijkt het mij niet zo lastig om dit te vertalen naar hedendaagse code, met mogelijk specifieke aanpassingen voor een SQLITE-database.
EDIT: enne,
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$status = $row['Status'];
if($status==1)
{
echo "<tr class='success'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Open</td>";
}
elseif($status==0)
{
echo "<tr class='warning'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Pending</td>";
}
elseif($status==2)
{
echo "<tr class='danger'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Closed</td>";
}
if($status==1)
{
echo "<tr class='success'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Open</td>";
}
elseif($status==0)
{
echo "<tr class='warning'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Pending</td>";
}
elseif($status==2)
{
echo "<tr class='danger'>";
echo "<td>". $row['ID'] . "</td>";
echo "<td>Closed</td>";
}
dat kan
Ook doe je er verstandig aan om ampersands in hyperlinks te encoden als & ten einde misinterpretatie te voorkomen.
Daarnaast is het echt nergens voor nodig om al die lappen HTML te echo'en. Je kunt PHP-blokken op elk moment staken en weer voortzetten.
Schot voor de boeg: scheid applicatielogica en presentatielogica:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Gewijzigd op 24/02/2018 12:35:08 door Thomas van den Heuvel
Toevoeging op 24/02/2018 13:19:04:
Door te debuggen ben ik erachter gekomen dat $total_pages altijd 1 is omdat countrows ook 1 was.
Ik probeerde de rows te tellen doormiddel van countrows++; maar helaas werkt dat niet.
Nu probeer ik het volgende, van de volgende pagina maar krijg de volgende errors
http://www.nusphere.com/kb/phpmanual/function.sqlite-num-rows.htm
Zie ik nou iets over het hoofd of wat doe ik verkeerd?
$countrows = sqlite_num_rows($stmt);
Dit geeft error Fatal error: Call to undefined function sqlite_num_rows() in D:\AppServ\www\ucp\reports.php on
$countrows = $stmt->numRows();
Dit geeft error Fatal error: Call to undefined method SQLite3Result::numRows() in D:\AppServ\www\ucp\reports.php on line 62
Toevoeging op 24/02/2018 13:29:16:
Ik heb het opgelost. Mocht iemand interesse hebben in de oplossing:
Code (php)
Gewijzigd op 24/02/2018 13:26:13 door Jasper Schellekens
In een voorgaand codefragment staat $countrows ook nergens gedefinieerd, weet je zeker dat deze wel een goede waarde krijgt? Hoe wordt die bepaald?
En ja, het aantal resultaatrijen van een COUNT()-query is altijd één, het is de bedoeling dat je van zo'n query het COUNT()-resultaat pakt, en niet het aantal rijen telt.
Zoals je op PHP.net kunt zien is sqlite_num_rows() / SQLite::numRows() niet standaard meer inbegrepen in PHP vanaf versie 5.4.0:
Quote:
(PHP 5 < 5.4.0, PECL sqlite >= 1.0.0)
PDO heeft ook een SQLite driver, maar je zult moeten kijken of die voor jou ook beschikbaar is.
Gewijzigd op 24/02/2018 15:28:12 door Thomas van den Heuvel
Als je meer wilt weten over MySQL, SQL-lite en PostgreSQL, dan is dit leuk leesvoer:
https://www.digitalocean.com/community/tutorials/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems
Ik zie het niet vaak, maar misschien is het natuurlijk een bewust en zorgvuldig gekozen keuze.
Gewijzigd op 24/02/2018 15:42:32 door - Ariën -
twijfels bij als je SQLite voor een webgame wilt gebruiken:
Op dezelfde pagina staat ook een checklist waarmee je kunt bepalen in hoeverre SQLite geschikt is voor wat je probeert te doen.
Come to think of it: voor @Hans de Ridder zou SQLite mogelijk wel een geschikt(er) alternatief zijn dan al die IPTC mumbo-jumbo.
Daar heb ik zou mijn Quote:
Situations Where A Client/Server RDBMS May Work Better
...
High Concurrency
SQLite supports an unlimited number of simultaneous readers, but it will only allow one writer at any instant in time. For many situations, this is not a problem. Writer queue up. Each application does its database work quickly and moves on, and no lock lasts for more than a few dozen milliseconds. But there are some applications that require more concurrency, and those applications may need to seek a different solution.
...
High Concurrency
SQLite supports an unlimited number of simultaneous readers, but it will only allow one writer at any instant in time. For many situations, this is not a problem. Writer queue up. Each application does its database work quickly and moves on, and no lock lasts for more than a few dozen milliseconds. But there are some applications that require more concurrency, and those applications may need to seek a different solution.
Op dezelfde pagina staat ook een checklist waarmee je kunt bepalen in hoeverre SQLite geschikt is voor wat je probeert te doen.
Come to think of it: voor @Hans de Ridder zou SQLite mogelijk wel een geschikt(er) alternatief zijn dan al die IPTC mumbo-jumbo.
Gewijzigd op 24/02/2018 16:12:39 door Thomas van den Heuvel