Paginering
Ik heb gisteren even een proefopstellinkje gemaakt waarop ik graag wat kritiek ontvang.
Ik heb een tabel gemaakt met de naam items. Hierin heb ik 3 kolommen: id_item, item, order1
id_item is een int, AI, en primary key
item is een varchar en unieke key
order1 is een int
Ik heb de database gevuld met random woordjes op de volgende manier:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$alphabet = 'abcdefghijklmnopqrstuvwxyz';
for ($i = 0;$i < 4000; $i++){
$order1 = 4000-$i;
$aantal_letters = rand(4,5);
$woord = '';
for ($b = 0; $b < $aantal_letters; $b++){
$letter = rand(0,24);
$woord .= $alphabet[$letter];
}
$query = mysql_query("INSERT INTO items (item,order1) VALUES ('".$woord."','".$order1."')");
if ($query){
echo $woord.' is succesvol geplaatst<br>';
}else{
echo '<br><br><br>'.mysql_error().'<br><br><br><br>';
$i = 0;
}
}
?>
$alphabet = 'abcdefghijklmnopqrstuvwxyz';
for ($i = 0;$i < 4000; $i++){
$order1 = 4000-$i;
$aantal_letters = rand(4,5);
$woord = '';
for ($b = 0; $b < $aantal_letters; $b++){
$letter = rand(0,24);
$woord .= $alphabet[$letter];
}
$query = mysql_query("INSERT INTO items (item,order1) VALUES ('".$woord."','".$order1."')");
if ($query){
echo $woord.' is succesvol geplaatst<br>';
}else{
echo '<br><br><br>'.mysql_error().'<br><br><br><br>';
$i = 0;
}
}
?>
Nadat ik 3424 rijen totaal had heb ik het volgende als paginering gemaakt:
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
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
<?php
mysql_connect('localhost','root','');
mysql_select_db('test');
$per_pagina = 15;
if (isset($_GET['begin'])){
$begin = $_GET['begin'];
}else{
$begin = 1;
}
$eind = $begin+$per_pagina;
$query = mysql_query("SELECT * FROM items");
echo '<table>';
while ($row = mysql_fetch_row($query)){
if ($row[0] > $begin && $row[0] <= $eind){
echo '<tr><td>'.$row[0].'</td><td>'.$row[1].'</td><td>'.$row[2].'</td></tr>';
}
}
echo '</table>';
$totaal_rijen = mysql_num_rows($query);
$laatste_pagina = ceil($totaal_rijen/$per_pagina);
if (isset($_GET['begin'])){
$begin = $_GET['begin'];
}else{
$begin = 0;
}
$huidige_pagina = $begin/$per_pagina;
if ($huidige_pagina>2){
$min = $huidige_pagina-1;
$plus = $huidige_pagina+3;
}else{
$min = 1;
$plus = 5;
}
for ($i = $min; $i<= $plus; $i++){
// paginering
if ($i<=$laatste_pagina){
if ($i>0){
$pagina = $i-1;
}else{
$pagina = 0;
}
$begin = ($pagina*$per_pagina);
$eind = ($pagina*$per_pagina)+15;
echo '<a style="border:1px black solid;width:30px;display:block;float:left;"
href="index.php?begin='.$begin.'">'.$i.'</a> ';
}
}
?>
mysql_connect('localhost','root','');
mysql_select_db('test');
$per_pagina = 15;
if (isset($_GET['begin'])){
$begin = $_GET['begin'];
}else{
$begin = 1;
}
$eind = $begin+$per_pagina;
$query = mysql_query("SELECT * FROM items");
echo '<table>';
while ($row = mysql_fetch_row($query)){
if ($row[0] > $begin && $row[0] <= $eind){
echo '<tr><td>'.$row[0].'</td><td>'.$row[1].'</td><td>'.$row[2].'</td></tr>';
}
}
echo '</table>';
$totaal_rijen = mysql_num_rows($query);
$laatste_pagina = ceil($totaal_rijen/$per_pagina);
if (isset($_GET['begin'])){
$begin = $_GET['begin'];
}else{
$begin = 0;
}
$huidige_pagina = $begin/$per_pagina;
if ($huidige_pagina>2){
$min = $huidige_pagina-1;
$plus = $huidige_pagina+3;
}else{
$min = 1;
$plus = 5;
}
for ($i = $min; $i<= $plus; $i++){
// paginering
if ($i<=$laatste_pagina){
if ($i>0){
$pagina = $i-1;
}else{
$pagina = 0;
}
$begin = ($pagina*$per_pagina);
$eind = ($pagina*$per_pagina)+15;
echo '<a style="border:1px black solid;width:30px;display:block;float:left;"
href="index.php?begin='.$begin.'">'.$i.'</a> ';
}
}
?>
LET WEL: Dit is niet een officieel iets dat ik perfect moest hebben maar een improvisatie (gelieve dus geen rekening te houden met dingen als SQL injectie (niet mogelijk hier maar toch...))
Graag alle kritiek die dit zeker kan helpen verbeteren.
heb je mijn vraag gelezen en mijn code gezien? je antwoord heeft vrij weinig met mijn vraag te maken.
Ik zou eens kijken of je iets kan doen met de query. Nu haal je elke keer alle records op en dat is dan weer zonde.
als ik bijvoorbeeld ga filteren op 'item LIKE %d%' en een Limit erop zet, hoe bereken ik dan weer de huidige pagina etc
Dus dan krijg je iets als dit
Code (php)
1
2
3
2
3
<?php
$query = mysql_query("SELECT * FROM items where ID between '".$begin."' and '".$eind."'");
?>
$query = mysql_query("SELECT * FROM items where ID between '".$begin."' and '".$eind."'");
?>
In dit geval krijg je wel minder records op een pagina als je er 1 verwijderd uit de database. Daarom zou je ook met volgorde kunnen werken die kun je namelijk bijwerken als je een record verwijderd.
EDIT: wellicht kom je hier verder mee http://php.about.com/od/phpwithmysql/ss/php_pagination.htm
Gewijzigd op 25/10/2012 15:47:52 door Q S
onderaan mijn code waar de nummertjes worden aangemaakt staat ook dat hij het totaal aantal pagina's controleerd. hoe doe ik dat dan? gewoon nog een query met count(id_item) erin?
@Albert zie ook even mijn EDIT, wellicht dat dat je op een idee brengt
Zie dit dus als een boodschap aan iedereen (die zich geroepen voelt), en aan niemand in het bijzonder.
Ik zie altijd dat men veel te diep (ver/laag...) in de code nog queries uitvoert.
Nochtans ... Die paginanummering is afhankelijk van slechts twee getallen: het totale aantal items; het aantal items per pagina.
Om deze code generiek te houden (herbruikbaar), zou dit moeten gescheiden zijn.
Je zou moeten komen tot een constructie als:
function paginate($itemsPerPage, $totalItems) {
...
// return de pagination string
}
En die functie moet dus totaal onafhankelijk zijn van de naam van de tabel en velden die je toevallig op deze site nodig hebt.
De juiste formattering van de links zou ik dan via een callback regelen.
Gewijzigd op 25/10/2012 17:31:25 door Kris Peeters
[eerste pagina] [-2] [-1] [huidige pagina] [+1] [+2] [laatste pagina]
dus stel de huidige pagina is 18 en het totaal aantal pagina's is 29
[1] [16] [17] [18] [19] [20] [29]
index.php?page=18
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
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
<?php
function paginate ($total_items){
$current_page = $_GET['page'];
$items_per_page = 15;
$begin = $current_page*$items_per_page;
$query = mysql_query("SELECT * FROM items LIMIT ".$begin.",".$items_per_page);
if ($current_page>=4){
$minus_2 = $current_page-2;
}else{
$minus_2 = 1;
}
$plus_2 = $current_page+2;
$first = 1;
$last = ceil($total_items/$items_per_page);
$numbered_pages = '<a href="index.php?page=1">First</a>';
for ($i = $minus_2; $i <= $plus_2; $i++){
$numbered_pages .= '<a href="index.php?page='.$i.'">'.$i.'</a>';
}
$numbered_pages .= '<a href="index.php?page='.$last.'">Last</a>';
return $numbered_pages;
}
?>
function paginate ($total_items){
$current_page = $_GET['page'];
$items_per_page = 15;
$begin = $current_page*$items_per_page;
$query = mysql_query("SELECT * FROM items LIMIT ".$begin.",".$items_per_page);
if ($current_page>=4){
$minus_2 = $current_page-2;
}else{
$minus_2 = 1;
}
$plus_2 = $current_page+2;
$first = 1;
$last = ceil($total_items/$items_per_page);
$numbered_pages = '<a href="index.php?page=1">First</a>';
for ($i = $minus_2; $i <= $plus_2; $i++){
$numbered_pages .= '<a href="index.php?page='.$i.'">'.$i.'</a>';
}
$numbered_pages .= '<a href="index.php?page='.$last.'">Last</a>';
return $numbered_pages;
}
?>
Ik heb dit snel even geimproviseerd maar bedoelde je dit?
dus
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if($_GET['page']){
$page = $_GET['page'];
switch($page):
case ($page > 1): // vanaf pagina 2 doe je een berekening
$begin = ($page -1) * $items_per_page;
// -1 omdat 1 x 15 = 15, 2 x 15 = 30, 3 x 15 = 45 etc..
//en als pagina 2 zou zijn en je doet 2 x 15 zou je 15 items overslaan
break;
default: // op pagina 1 begin je bij 1
$begin = 1;
break;
endswitch;
}
$query = mysql_query("SELECT * FROM items LIMIT ".$begin.",".$items_per_page);
?>
if($_GET['page']){
$page = $_GET['page'];
switch($page):
case ($page > 1): // vanaf pagina 2 doe je een berekening
$begin = ($page -1) * $items_per_page;
// -1 omdat 1 x 15 = 15, 2 x 15 = 30, 3 x 15 = 45 etc..
//en als pagina 2 zou zijn en je doet 2 x 15 zou je 15 items overslaan
break;
default: // op pagina 1 begin je bij 1
$begin = 1;
break;
endswitch;
}
$query = mysql_query("SELECT * FROM items LIMIT ".$begin.",".$items_per_page);
?>
dit zou wel moeten werken voor je query
Toevoeging op 25/10/2012 19:16:16:
Andy V op 25/10/2012 19:14:38:
als je pagina 2 hebt kan je 1*15 doen om de tweede pagina te bekijken, als je de 3e pagina kijkt krijg je 2*15 = 30 (tweede pagina)
voor pagina 1 hoef je geen berekening te doen, dan begin je gewoon bij 1
dus
dit zou wel moeten werken voor je query
voor pagina 1 hoef je geen berekening te doen, dan begin je gewoon bij 1
dus
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
if($_GET['page']){
$page = $_GET['page'];
switch($page):
case ($page > 1): // vanaf pagina 2 doe je een berekening
$begin = ($page -1) * $items_per_page;
// -1 omdat 1 x 15 = 15, 2 x 15 = 30, 3 x 15 = 45 etc..
//en als pagina 2 zou zijn en je doet 2 x 15 zou je 15 items overslaan
break;
default: // op pagina 1 begin je bij 1
$begin = 1;
break;
endswitch;
}
$query = mysql_query("SELECT * FROM items LIMIT ".$begin.",".$items_per_page);
?>
if($_GET['page']){
$page = $_GET['page'];
switch($page):
case ($page > 1): // vanaf pagina 2 doe je een berekening
$begin = ($page -1) * $items_per_page;
// -1 omdat 1 x 15 = 15, 2 x 15 = 30, 3 x 15 = 45 etc..
//en als pagina 2 zou zijn en je doet 2 x 15 zou je 15 items overslaan
break;
default: // op pagina 1 begin je bij 1
$begin = 1;
break;
endswitch;
}
$query = mysql_query("SELECT * FROM items LIMIT ".$begin.",".$items_per_page);
?>
dit zou wel moeten werken voor je query
Let wel: dit is snel geimproviseerd
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
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
<?php
function paginate($items_per_page, $ammount_of_rows){
if ($ammount_of_rows!=0){
$ammount_of_pages = ceil($ammount_of_rows/$items_per_page);
}else{
return '';
}
// current page is $page
if (isset($_GET['page'])){
$page = $_GET['page'];
}else{
$page = 1;
}
// page is 7
// [<<] [5] [6] [[7]] [8] [9] [>>]
// page is 1
// [<<] [[1]] [2] [3] [4] [5] [>>]
if ($page>3){
$min_page = $page-2;
$max_page = $page+2;
}else{
$min_page = 1;
$max_page = $min_page+4;
}
if ($max_page >= $ammount_of_pages){
$max_page = $ammount_of_pages;
$min_page = $max_page-4;
}
$url = $_SERVER['REQUEST_URI'];
if (isset($_GET['page'])){
$first = str_replace('page='.$_GET['page'],'page=1',$url);
}
$numbers = '<div class="paginate"><a href="'.$first.'"><<</a>';
for ($i = $min_page; $i <= $max_page; $i++){
$new_url = str_replace('page='.$_GET['page'],'page='.$i,$url);
if ($i == $page){
$class = 'class="current_page"';
}else{
$class = 'class="other_page"';
}
$numbers .= '<a href="'.$new_url.'" '.$class.'>'.$i.'</a>';
}
if ($ammount_of_pages!=0){
$last = str_replace('page='.$_GET['page'],'page='.$ammount_of_pages.'',$url);
$numbers .= '<a href="'.$last.'">>></a></div>';
}
return $numbers;
}
?>
function paginate($items_per_page, $ammount_of_rows){
if ($ammount_of_rows!=0){
$ammount_of_pages = ceil($ammount_of_rows/$items_per_page);
}else{
return '';
}
// current page is $page
if (isset($_GET['page'])){
$page = $_GET['page'];
}else{
$page = 1;
}
// page is 7
// [<<] [5] [6] [[7]] [8] [9] [>>]
// page is 1
// [<<] [[1]] [2] [3] [4] [5] [>>]
if ($page>3){
$min_page = $page-2;
$max_page = $page+2;
}else{
$min_page = 1;
$max_page = $min_page+4;
}
if ($max_page >= $ammount_of_pages){
$max_page = $ammount_of_pages;
$min_page = $max_page-4;
}
$url = $_SERVER['REQUEST_URI'];
if (isset($_GET['page'])){
$first = str_replace('page='.$_GET['page'],'page=1',$url);
}
$numbers = '<div class="paginate"><a href="'.$first.'"><<</a>';
for ($i = $min_page; $i <= $max_page; $i++){
$new_url = str_replace('page='.$_GET['page'],'page='.$i,$url);
if ($i == $page){
$class = 'class="current_page"';
}else{
$class = 'class="other_page"';
}
$numbers .= '<a href="'.$new_url.'" '.$class.'>'.$i.'</a>';
}
if ($ammount_of_pages!=0){
$last = str_replace('page='.$_GET['page'],'page='.$ammount_of_pages.'',$url);
$numbers .= '<a href="'.$last.'">>></a></div>';
}
return $numbers;
}
?>