/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
<next> og <back> links til en database
Fra : Stig Sørensen


Dato : 18-03-04 16:19

Hejsa.

$x = "et eller andet"; // Så får vi bare det på det rene :)

Jeg kan simpelthen ikke greje ud hvordan man evt. kun får listet 5 $x fra en
database og der nedenunder de 5 $x er et link til de næste 5.

Man må skulle lave en function til denne navigering men jeg er meget lost i
hvor jeg skal starte.

Nogen der kan give et hint?

Mvh
Stig Sørensen



 
 
Ulrik Nielsen (18-03-2004)
Kommentar
Fra : Ulrik Nielsen


Dato : 18-03-04 16:35

Stig Sørensen wrote:
> Hejsa.
> Jeg kan simpelthen ikke greje ud hvordan man evt. kun får listet 5 $x fra en
> database og der nedenunder de 5 $x er et link til de næste 5.
>
> Nogen der kan give et hint?

læs om "limit" i mysql dokumentationen ;)

--
>> ulrik nielsen
excuse of the day : no "any" key on keyboard
from bofh : http://www.cs.wisc.edu/~ballard/bofh/

Troels Arvin (18-03-2004)
Kommentar
Fra : Troels Arvin


Dato : 18-03-04 16:51

On Thu, 18 Mar 2004 16:19:07 +0100, Stig Sørensen wrote:

> Jeg kan simpelthen ikke greje ud hvordan man evt. kun får listet 5 $x fra
> en database og der nedenunder de 5 $x er et link til de næste 5.

Lad linket bestå af

<a href="migselv.php?perpage=$perpage&offset=$offset">næste $perpage</a>

Du hiver da "perpage" og "offset" ind fra $_REQUEST og kører dem igennem
intval(). Hvis $_REQUEST ikke indeholder "perpage" eller "offset", så
sætter du dem til nogle default-værdier.

Når du kender perpage og offset, kan du bruge dem i noget passende SQL,
se fx. http://troels.arvin.dk/db/rdbms/#select-limit-offset

Man kunne forestille sig kode i stil med følgende (utestet):

<?php

// hiv værdier ind fra GET/POST, eller benyt default-værdier:
$default_offset=0;
$default_perpage=5;
$offset = isset($_REQUEST['offset']) ?
intval($_REQUEST['offset']) : $default_offset;
$perpage = isset($_REQUEST['perpage']) ?
intval($_REQUEST['perpage']) : $default_perpage;

// sammensæt SQL; justér til aktuelle DBMS eller benyt
// SQL-abstraktionslags faciliteter hertil:
$sql="
SELECT *
FROM tabel
ORDER BY unik_værdi(er)
LIMIT $perpage OFFSET $offset
";
// ovenstående er postgresql-style

// fyr sql af og konvertér resultatsæt til HTML

// afslut med link til næste del af resultatsæt:
$out=sprintf(
'<a href="%s?offset=%d&perpage=%d">næste %d</a>',
__FILE__,
($offset+$perpage),
$perpage,
$perpage
);

print $out;
?>

Bør udbygges med detektion af, om der overhovedet findes flere rækker,
før $out udskrives. Kan udvides med link til forrige resultater, også.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Stig Sørensen (18-03-2004)
Kommentar
Fra : Stig Sørensen


Dato : 18-03-04 19:09


"Troels Arvin" <troels@arvin.dk> wrote in message
news:pan.2004.03.18.15.50.40.442887@arvin.dk...

> Man kunne forestille sig kode i stil med følgende (utestet):
[snip - tak for kode]

Hej Troels.

Havde lidt problemer med at få din kode til at virke.
Efter et stykke tid opgav jeg da jeg fandt noget kode fra en gæstebog som
jeg er sikker på jeg kan bruge.

Indtil videre ser det således ud:





<?php
if(!isset($start)) $start = 0;

$bredde = "550px";
$baggrund = "#81A8D9";

$conn = mysql_connect("$server", "$bruger", "$kodeord") or die("Fejlen er: "
..mysql_error());
mysql_select_db("$database");

$query = mysql_query("select * from tinytagwall order by ID LIMIT " . $start
.. ", 5");

while ($row = mysql_fetch_array($query)) {
echo "EN MASSE HTML";
}

$querya = "SELECT count(*) as count FROM tinytagwall";
$resulta = mysql_query($querya);
$rowa = mysql_fetch_array($resulta);
$numrows = $rowa['count'];
if($start > 0)
echo "<a href=\"" . $PHP_SELF . "?start=" . ($start - 5) .
"\"><b>Previous Page</b></a> / \n";


if($numrows > ($start + 5))
echo "<a href=\"" . $PHP_SELF . "?start=" . ($start + 5) .
"\"><b>Next Page</b></a><br />\n";

echo "$numrows";

mysql_close($conn);
?>

Det virker jo næsten som det skal.
Det eneste problem er at når jeg trykker på linket der kommer frem, Next
Page som er: ?start=5 så vil den ikke hive det 5-tal ned i sætte i den
øverste linje (if(!isset($start)) $start = 0;).

Mangler der ikke en request eller noget?

Håber du kan hjælpe
mvh
Stig Sørensen



Troels Arvin (18-03-2004)
Kommentar
Fra : Troels Arvin


Dato : 18-03-04 20:45

On Thu, 18 Mar 2004 19:09:18 +0100, Stig Sørensen wrote:

> <?php
> if(!isset($start)) $start = 0;

Ovenstående er den "gammeldags" måde at hive variable ind i PHP. Nu om
dage bør man finde værdien som $_REQUEST['start'].

[...]

> $query = mysql_query("select * from tinytagwall order by ID LIMIT " .
> $start . ", 5");

Når du bruger en udefra kommende variabel til noget, såsom at skabe en
SQL-forespørgsel, så skal du sikre dig, at variablen har den form, du
forventer. Her forventer du, at $start er et heltal, men i PHP har du ikke
garanti herfor. Sådanne situationer bør ringe en alarmklokke: FARE FOR
"SQL INJECTION". Lige netop i dette tilfælde er det svært at forestille
sig en måde at misbruge det på, men generelt vil jeg anbefale en
kodestil, hvor man sørger for, at eksternt genererede data (såsom
GET/POST og cookies) bringes på en form, der ikke kan skade.

Hvis du ikke ved, hvad "SQL injection" er, så tag og brug en times tid
på at undersøge det.

Alternativ til din kode:

<?php
$start=0;
if (isset($_REQUEST['start'])) {
$start=intval($_REQUEST['start']);
}
....
?>

Her tvinger jeg start til at være et heltal, hvilket umuliggør
tilføjelse af tekst, der måtte kunne flå i din SQL.

[...]
> if($start > 0)
> echo "<a href=\"" . $PHP_SELF . "?start=" . ($start - 5) .
> "\"><b>Previous Page</b></a> / \n";
[...]

Igen: Pas på med bare at bruge $start råt. Når men ukritisk benytter
eksternt genererede data i HTML-sammenhæng, risikerer man at skabe
mulighed for cross-site scripting problemer (også kaldet "x-site
scripting"). Igen vil jeg anbefale at bruge den nødvendige tid på at
lære, hvad det handler om. Hvis man ikke får en kode-stil, der koder
rundt om den slags problemer, ender man med sites så fulde af større
eller mindre sikkerhedshuller, at det bliver en uoverskuelig opgave at
gøre sitet robust.

> Det eneste problem er at når jeg trykker på linket der kommer frem,
> Next Page som er: ?start=5 så vil den ikke hive det 5-tal ned i sætte
> i den øverste linje (if(!isset($start)) $start = 0;).

Se min første kommentar øverst ang. "gammeldags"/nymodens måde at hive
fat i eksternt genererede data.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408932
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste