Automatische Paginanummering
Dit script kan automatisch rows uit een database in verschillende pagina's zetten. Denk bijvoorbeeld aan een ledenlijst, een gastenboek of een fotoalbum.
Het geeft nu heel simpel wat informatie weer over het aantal rows, hoeveel rows per pagina en daarna hoeveel pagina's hij dan aanmaakt. Daarna 2varianten van paginaverdeling en als laatste een voorbeeld om alles echo'en. Ik heb nu wat gastenboek-entrys gebruikt maar je kan natuurlijk honderden toepassingen bedenken. In die laatste while kan je alles laten doen met wat hij uit de database haalt. Verder kan je het ook een beetje verbouwen zodat hij het niet ui een database haalt, maar bijvoorbeeld bestanden telt in een map of uit een txt de informatie haalt.
Je kan zelf met een dropdown-menutje instellen hoeveel rows per pagina je wil zien, dit vind je terug in de array in de code. Deze waardes kan je natuurlijk veranderen/aanvullen.
Succes ermee!
--edit op 14/08/06 om 12:18am--
Een paar kleine schoonheidsfoutjes eruit gehaald, update met functies volgt nog een keer!
--edit op 17/08/06 om 5:18pm--
Hele nieuwe versie geschreven, met functies en een betere opbouw/layout. Ook heb ik mijn MySQL table toegevoegd, wel zo handig om wat linken te kunnen leggen!
Voorbeeld: http://img67.imageshack.us/img67/9843/previewzi1.jpg
Gesponsorde koppelingen
PHP script bestanden
Er zijn 37 reacties op 'Automatische paginanummering'
Gesponsorde koppelingen
Edit: Ik weet niet of phphulp daar zelf ruimte voor heeft, maar ik wil best een testversie ergens online gooien hoor! Mijn eigen server is te klein voor continue bezoek vanaf zo'n site, dat trekt hij niet.. Iemand?
i.p.v.:
. Nog officieler kan zo:
Verder wel mooi script
Oh ja, je wewrkt met getallen, maar jij gebruikt ze alsof ze tekst zjn. Bij getallen mag je de aanhalingstekens weglaten (had ik ookal in het voorbeeld gedaan.)
zelfde als het volgende:
of
Het scheelt een hele hoop rompslomp en doet toch het zelfde.
@Ponzi: Klopt, het moet nog verder uitgewerkt worden, dit heb ik in een nachtje in elkaar gesleuteld maar ik ga het nog verder uitwerken.
2
3
4
5
6
7
8
9
10
11
12
//get the rows from the database
$first_result = $pag * $each - $each;
$query = mysql_query("select * from test limit ".$first_result.", ".$each);
while($r=mysql_fetch_array($query))
{
$id=$r["id"];
$name=$r["name"];
$text=$r["text"];
$date=$r["date"];
$time=$r["time"];
?>
Wellicht handig om ook je tabel "test" sql code hier neer te zetten zodat een ieder die dit wil leren een goed werkend voorbeeld heeft.
Anders zou bovenstaande code wel is niet kunnen werken wanneer je dit niet in je eigen tabel hebt staan.
Want wat ook wel handig is omdat je toch met getallen werkt
werken?
Mischien als nodig is ook met:
mysql_real_escape_string()
na GR.mebus!
2
3
4
5
//count the number of rows
$query = mysql_query("select * from test");
$counter = mysql_num_rows($query);
?>
kan je beter zo doen, is sneller
2
3
4
5
//count the number of rows
$query = mysql_query("SELECT COUNT(*) AS num FROM test");
$counter = mysql_result($query, 0, "num");
?>
@lissy: ik kan wel een kleine opbouw geven nog een keer, dat is wel een goede. Verder zijn het hele standaard gastenboek entry's dus niks spannend. Ik heb het er meer bijgezet om de paginanummering werkend te krijgen. Met deze table heb ik het werkend gekregen, maar je kan het ook anders toepassen uiteraard.
@mebus: het hele script draaid op cijfers dus er zal weinig misgaan, ik heb het voor de zekerheid er nu wel ingezet inderdaad.
@nano: klopt, deze manier was ik zelf ook mee aan het stoeien maar was de 'as num' vergeten :/ ik heb hem er nu in verwerkt.
Ok, versie 1.1.
-Een hoop dingen in functies verwerkt, ziet er strakker uit
-Mijn code een beetje opgeruimd, tabs erin gezet etc
-De 2 tips van nano en mebus (is_numeric en de mysql fetch manier) erin verwerkt
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
//connect
mysql_connect("***","***","***");
mysql_select_db("***");
//Retrieve and create the $each and $each_array vars
if(isset($_GET['each'])&&is_numeric($_GET['each'])) $each = $_GET['each'];
else $each = 10;
$each_options = array("5", "10", "15", "20");
//Create the $counter var
$query = mysql_query("select count(*) as num from test");
$counter = mysql_result($query, 0, "num");
//Create the $pages var
$pages = $counter / $each;
$pages = ceil($pages);
//Check on witch page you are now
if(isset($_GET['pag'])&&$_GET['pag'] <= $pages&&$_GET['pag']>0&&is_numeric($_GET['pag'])) $pag = $_GET['pag'];
else $pag = 1;
//Get the results from the database
$first_result = $pag * $each - $each;
$query = mysql_query("select * from test limit ".$first_result.", ".$each);
function render_each_dropdown($each_options,$each)
{
echo '<form action="index.php">';
echo '<select name="each" onchange="this.form.submit();">'."\n";
foreach($each_options as $item)
{
echo '<option value="'.$item.'"';
if($item==$each) echo ' selected';
echo '>'.$item.'</option>'."\n";
}
echo '</select></form>';
}
function render_arrow($kind,$pag,$pages,$each)
{
$pag_back = $pag-1;
$pag_next = $pag+1;
if($kind == "back")
{
echo '<a ';
if($pag > 1) echo 'href="index.php?pag='.$pag_back.'&each='.$each.'"';
echo '><<</a>';
}
if($kind == "forward")
{
echo '<a ';
if($pag < $pages) echo 'href="index.php?pag='.$pag_next.'&each='.$each.'"';
echo '>>></a>';
}
}
function render_pagenumbers($pag,$pages,$each)
{
$i = 1;
while($i<=$pages)
{
echo '<a ';
if($i!=$pag) echo 'href="index.php?pag='.$i.'&each='.$each.'"';
echo '>'.$i.'</a> ';
$i++;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Pages test</title>
<style type="text/css" media="all">
<!--
#Comment { float: left;
margin: 5px 50px 0px 0px;
padding: 2px 0px;
background-color: #C3C3C3;
width: 100%; }
#Comment .date { color: #CCFFCC;
font-size: 11px; }
-->
</style>
</head>
<body>
<?php
//Echo the information about the table and settings
echo 'aantal rows: '.$counter."<br />\n";
echo 'Aantal rows per pagina: '.$each."<br />\n";
echo 'Aantal pagina\'s: '.$pages."<br />\n";
echo "<br />\n";
render_each_dropdown($each_options,$each);
render_arrow(back,$pag,$pages,$each);
echo $pag;
render_arrow(forward,$pag,$pages,$each);
echo "<br />\n";
render_pagenumbers($pag,$pages,$each);
//echo the rows
while($r=mysql_fetch_array($query))
{
$id=$r["id"];
$name=$r["name"];
$text=$r["text"];
$date=$r["date"];
$time=$r["time"];
echo '<div id="Comment"><b>'.$name.'</b><br>'.$text.'<br><span class="date">'.$date.' | '.$time.' (<a href="index.php?edit='.$id.'">'.$id.'</a>)</span></div><br>';
}
?>
</body>
</html>
Mijn site heeft 1 lay-out index.php en hierin komen de content paginas d.m.v. ?id= en dan een nummer. Voor het gastenboek is dit ?id=27
Hoe verwerk ik dit hierin?
Ik heb het voor de 2e ? maak je een & en dan zou het moeten werken :)
@Steven: Ga je dit nog in een functie verwerken? Ik ben best wel benieuwd wat je er van gaat maken dan.
That would be all!
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function render_each_dropdown($each_options,$each)
{
echo '<form action="?id=27">';
echo '<select name="each" onchange="this.form.submit();">'."\n";
foreach($each_options as $item)
{
echo '<option value="'.$item.'"';
if($item == $each)
echo ' selected';
echo '>'.$item.'</option>'."\n";
}
echo '</select></form>';
}
?>
dit krijg ik niet goed en snap niet waarom niet.
hij laat standaard wel de 10 messages zien en dan kan je op pagina 1 en 2 maar wil ik ze per 5 groeperen dan no way dan gaat dit fout....
Wat ik zal doen is een demo maken en hierop de paginanummering (proberen) te maken zodat je dan kan zien wat er fout gaat. Ik kom erop terug ^_-
Edit: Hier de link: demo-gastenboek
probeer maar dan zie je dat het aantal berichten wat je ook aangeeft op 10 blijft. De eerdere fouten zijn al weg door idd dit aan te brengen: method="post" maar het is nog niet zoals het 'moet'... lijkt mij...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function render_each_dropdown($each_options,$each)
{
echo '<form action="index2.php" method="get">';
echo '<select name="each" onchange="this.form.submit();">'."\n";
foreach($each_options as $item)
{
echo '<option value="'.$item.'"';
if($item == $each)
echo ' selected';
echo '>'.$item.'</option>'."\n";
}
echo '</select>';
echo '<input type="hidden" name="id" value="'.$id.'"></form>';
}
?>
Zo werkt het wel! Je kan geen action invullen met variabelen. Die moet je in een hidden input steken, dan werken ze! :) En foutje van mij, je moet met method get werken, post is weer de andere O-)
http://www.bearded-collies.net/index2.php?each=5&id=
en dit zou moeten worden:
http://www.bearded-collies.net/index2.php?id=82&pag=2&each=5
Bij dit stukje code hierboven (mijn vorige post) op regel 14 $id te vervangen voor $_GET['id]
Ik denk dat hij het dan wel doet!
Succes, Steve
Maar goed leuk om te lezen dat jij ook graag helpt. Ik meld me zeker weer, ben nu effies aan het graphics maken en er is al weer wat ge-upload maar dat is m'n personal site en niet de doggies...
<<Eerste pagina <<Vorige Pagina 1 2 3 4 5 Volgende pagina>> Laatste pagina>>
of
<<Eerste pagina <<Vorige Pagina 1 2... 59 60 Volgende pagina>> Laatste pagina>>
Of iets wat erop lijkt. Hoe kan ik dit in dit script inbouwen? Ik hoop dat iemand hierbij kan helpen oid.
Is wel een hele lap tekst geworden, maar ik heb het maar meteen zo compleet mogelijk gedaan (inclusief test scriptjes voor diegene die het willen uitproberen zonder uren lang uit te vogelen hoe het script werkt).
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
Deze pagina maakt gebruik van een tabelletje waarmee je kunt testen
Gebruik daarvoor deze queries
CREATE TABLE test1 (`field` char( 3 ) NOT NULL default '');
CREATE TABLE test2 (`field` char( 3 ) NOT NULL default '');
maak een appart scriptje om er wat data in te gooien;
veel in de ene
for($i=10;$i<275;$i++){
$query="INSERT INTO test1 (field) VALUES ($i)";
mysql_query($query, $database_connection);
}
weinig in de andere
for($i=10;$i<7;$i++){
$query="INSERT INTO test2 (field) VALUES ($i)";
mysql_query($query, $database_connection);
}
Met behulp van de &db=$db kan je dan wisselen tussen de tabellen
Om te kijken hoe de paginanavigatie reageert
&db=test1 of &db=test2 (kan je dus in de url veranderen)
*/
# ================================== HIER BEGINT DE FUNCTIE =======================================================================
function createPageNavigation($p=1, $maxLinesPerPage=10, $totalRecords=0, $extraLink, &$showFromRecord, &$showToRecord)
# Deze functie maakt een pagina teller met voor en achteruitspoel knoppen en toont max 10 paginas daartussen
#
# $p - input : De huidige pagina (if leeg, then 1)
# $maxLinesPerPage - input : Het maximaal aantal records op een pagina (if leeg, then 10)
# $totalRecords - input : Het totaal aantal gevonden records uit de query (if leeg, then 0)
# $extraLink - input : Indien er nog meer gegevens mee moeten komen in de link die wordt gemaakt
# $showFromRecord - output : Moet worden gebruikt om te bepalen welke records er moeten worden getoond uit de result set van de query
# $showToRecord - output : Moet worden gebruikt om te bepalen welke records er moeten worden getoond uit de result set van de query
{
global $PHP_SElF;
global $navToStartOn, $navToStartOff, $navFastRewindOn, $navFastRewindOff, $navRewindOn, $navFastRewindOff;
global $currentPageLeft, $currentPageRight, $pageSeperator;
global $navForwardOn, $navForwardOff, $navFastForwardOn, $navFastForwardOff, $navToEndOn, $navToEndOff;
# in het geval de globals niet gezet zijn, hier alsnog even vullen
# wat navigatie zooi (kan je ook een plaatje in knikkeren)
# On/off kan je een ander plaatje geven of ander kleurtje maken
if(!$navToStartOn) $navToStartOn = "|< ";
if(!$navToStartOff) $navToStartOff = "|< ";
if(!$navFastRewindOn) $navFastRewindOn = "<< ";
if(!$navFastRewindOff) $navFastRewindOff = "<< ";
if(!$navRewindOn) $navRewindOn = "< ";
if(!$navRewindOff) $navRewindOff = "< ";
if(!$navToEndOn) $navToEndOn = " >|";
if(!$navToEndOff) $navToEndOff = " >|";
if(!$navFastForwardOn) $navFastForwardOn = " >>";
if(!$navFastForwardOff) $navFastForwardOff = " >>";
if(!$navForwardOn) $navForwardOn = " >";
if(!$navForwardOff) $navForwardOff = " >";
if(!$pageSeperator) $pageSeperator = " | ";
if(!$currentPageLeft) $currentPageLeft = " [ ";
if(!$currentPageRight) $currentPageRight = " ] ";
function getRange($p, $n, &$onder, &$boven)
{
if($p!=0){
$onder = floor(($p-1)/$n)*$n + 1;
$boven = ceil(($p)/$n)*$n;
if ($onder == $boven) { $boven += $n;}
}else {
$onder = 1;
$boven = $n;
}
}
# Totaal aantal paginas berekenen
$nrOfPages = ceil($totalRecords/$maxLinesPerPage);
$maxPagesPerPage = 10;
# wat moet ik op deze pagina laten zien
$showFromRecord = (($p-1)*$maxLinesPerPage);
$showToRecord = (($p-1)*$maxLinesPerPage)+$maxLinesPerPage;
$nrOfPreviousNav = $showFromRecord/$maxLinesPerPage;
$nrOfNextNav = ceil(($totalRecords-$showToRecord)/$maxLinesPerPage);
# berekenen welke pagina´s we moeten laten zien
getRange($p, $maxPagesPerPage, $rangeStart, $rangeEnd);
# De goto start en fastrewind knop maken
if($p-$maxPagesPerPage<1){
$output .= $navToStartOff;
$output .= $navFastRewindOff;
}else{
$output .= " <a href=\"$PHP_SElF?p=1$extraLink\">$navToStartOn</a> ";
$output .= " <a href=\"$PHP_SElF?p=".($p-$maxPagesPerPage)."$extraLink\">$navFastRewindOn</a> ";
}
# de rewind knop maken (een pagina)
if($p-1<1){
$output .= $navRewindOff;
}else{
$output .= " <a href=\"$PHP_SElF?p=".($p-1)."$extraLink\">$navRewindOn</a>$pageSeperator";
}
# Hier de paginas (binnen het huidige 10tal) gaan maken links van de huidige pagina
for($j=$rangeStart;$j<=$rangeEnd;$j++){
if($j<=$nrOfPages){
if($j==$p){
# De huidige pagina
$output .= $currentPageLeft.$p.$currentPageRight;
} else{
$output .= "<a href=\"$PHP_SElF?p=".$j.$extraLink."\">$j</a>$pageSeperator";
}
}
}
# de forward knop maken (een pagina)
if($p+1>$nrOfPages){
$output .= $navForwardOff;
}else{
$output .= "<a href=\"$PHP_SElF?p=".($p+1)."$extraLink\">$navForwardOn</a> ";
}
# de fast forward en de goto End knop maken
if($p+$maxPagesPerPage>$nrOfPages){
$output .= $navFastForwardOff;
$output .= $navToEndOff;
}else{
$output .= " <a href=\"$PHP_SElF?p=".($p+$maxPagesPerPage)."$extraLink\">$navFastForwardOn</a> ";
$output .= " <a href=\"$PHP_SElF?p=".$nrOfPages.$extraLink."\">$navToEndOn</a> ";
}
# de boel uitpoepen
return $output;
}
# ================================== HIER STOPT DE FUNCTIE EN BEGINT HET TEST SCRIPT ==========================================
$connection = mysql_connect(server, user, password);
mysql_selectdb(database, $connection);
#eerst even een functie die het uitlezen van de query wat makkelijker maakt (is niet nodig voor de pagina teller, maar een leuke bonus)
function executeQuery($query, $connection, &$number)
{
$mysqlArray = mysql_query($query,$connection) or die ("<p>De query \"$query\" kon niet worden uitgevoerd !</p>");
$i=0;
while ($myrow = mysql_fetch_array($mysqlArray)){
$aant = mysql_num_fields($mysqlArray);;
for ($j=0;$j<=$aant-1;$j+=1){
$veldnaam = mysql_field_name($mysqlArray, $j);
$nw_array[$i][$veldnaam] = $myrow[$j];
}
$i+=1;
}
$number = $i;
if ($i==0) {return 0;} else {return $nw_array;}
}
# De query met wat ik wil tonen (totale set)
$query = "SELECT field FROM $db WHERE 1";
$result = executeQuery($query, $connection, $totalRecords);
#hoeveel regels wil ik op m´n pagina?
$maxLinesPerPage=10;
# hier dus de functie voor de pagina teller initieren
# daaruit komen dus $showFrom en $showTo
$navigationbar = createPageNavigation($p, $maxLinesPerPage, $totalRecords, "&db=$db", &$showFromRecord, &$showToRecord);
# Nu de resultaten van de query uitlezen
$r=1;
for($i=0; $i<$totalRecords; $i++){
if($i>=$showFromRecord && $i<$showFromRecord+$maxLinesPerPage){
#hier dan de output van de tabel
echo "$r: {$result[$i][field]}<br>";
$r++;
}
}
echo "$navigationbar";
?>
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in c:\program files\easyphp1-8\www\pcfreaky.be.tc\forum\messages.php on line 55
1 >>
Edit: sorry dat ik dit topic schopte trouwens...
Het script werkt echter wel want er zijn 3 pagina's beschikbaar. Dit is ook juist. De pijlen '<<' en '>>' werken ook goed.
Ik had een klein vraagje over de bovenstaande script, is het hier ook mogelijk nog om een soort van filter in te maken dus bijv. met films dat je dat op genre kan sorteren en dat je alleen met genre die jij wilt te zien krijgt?
Al vast bedankt voor de reacties...
***UPDATE 2-1-2010***
Laat maar zitten mensen het is me al gelukt :D
Om te reageren heb je een account nodig en je moet ingelogd zijn.
Inhoudsopgave
Labels
- Geen tags toegevoegd.
PHP hulp
0 seconden vanaf nu