/ 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
Første - forrige - næste - sidste
Fra : Harald


Dato : 06-04-06 20:53

Jeg har en side hvor man kan få nogle lange sider efter søgning i en
database og det skal derfor deles op i mindre sider, nogen der kan give mig
nogle tips til hvordan man med php kan får det lavet det således at man et
sted på siden har nogle forrige/næste links. Skal man gemme hvortil man er
nået i $_SESSION eller skal det gives videre med POST/GET eller hvordan gør
man normalt?

/HK



 
 
Søren G. (06-04-2006)
Kommentar
Fra : Søren G.


Dato : 06-04-06 21:10

Hej Harald,

Ting, som du gemmer i $_SESSION skal være variabler, som tilhører den session,
som brugeren har.

Så lad os sige, at brugeren kigge på den omtalte liste og og bladrer frem til
side 3. Derefter vælger han at gå ind på en helt anden side. Senere vender han
tilbage til siden. Hvis du da ønsker, at han skal komme ind på side 3 med det
samme, så vil det være relevant at bruge $_SESSION. Ellers mener jeg ikke at
det er den rigtige løsning.

Brug i stedet $_GET til at definere, hvor langt brugeren er i at bladre.

Eks.

if(!isset($_GET['limit'])
$_GET['limit'] = 0;

$rows_pr_page = 50; // Eller andet antal

$backwards_limit = $_GET['limit'] - $rows_pr_page;

$forward_limit = $_GET['limit'] + $rows_pr_page;

$sql = "SELECT ...................
FROM .....................
WHERE ....................
ORDER BY ................
LIMIT ".$_GET['limit'].",".$rows_pr_page;

Husk også at lave en "SELECT COUNT(*)... på tabellen for at se, om der skal
være et forward link, eller man er på sidste side.

$backwards_link = $_GET['limit'] ? "<a
href=\"?limit=".$backwards_limit."\">Previous</a>" : "";

$forward_link = $forward_limit < $total_count ? "<a
href=\"?limit=".$forward_limit."\">Forward</a>" : "";

Håber, at det kan hjælpe lidt


Harald wrote in dk.edb.internet.webdesign.serverside.php:
> Jeg har en side hvor man kan få nogle lange sider efter søgning i en
> database og det skal derfor deles op i mindre sider, nogen der kan give mig
> nogle tips til hvordan man med php kan får det lavet det således at man et
> sted på siden har nogle forrige/næste links. Skal man gemme hvortil man er
> nået i $_SESSION eller skal det gives videre med POST/GET eller hvordan gør
> man normalt?
>
> /HK
>
>


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Harald (06-04-2006)
Kommentar
Fra : Harald


Dato : 06-04-06 22:25

"Søren G." <not@avail.com> skrev i en meddelelse
news:443575a7$0$15794$14726298@news.sunsite.dk...
> Hej Harald,
>
> Ting, som du gemmer i $_SESSION skal være variabler, som tilhører den
> session,
> som brugeren har.
>
> Så lad os sige, at brugeren kigge på den omtalte liste og og bladrer frem
> til
> side 3. Derefter vælger han at gå ind på en helt anden side. Senere vender
> han
> tilbage til siden. Hvis du da ønsker, at han skal komme ind på side 3 med
> det
> samme, så vil det være relevant at bruge $_SESSION. Ellers mener jeg ikke
> at
> det er den rigtige løsning.
>
> Brug i stedet $_GET til at definere, hvor langt brugeren er i at bladre.
>
> Eks.
>
> if(!isset($_GET['limit'])
> $_GET['limit'] = 0;
>
> $rows_pr_page = 50; // Eller andet antal
>
> $backwards_limit = $_GET['limit'] - $rows_pr_page;
>
> $forward_limit = $_GET['limit'] + $rows_pr_page;
>
> $sql = "SELECT ...................
> FROM .....................
> WHERE ....................
> ORDER BY ................
> LIMIT ".$_GET['limit'].",".$rows_pr_page;
>
> Husk også at lave en "SELECT COUNT(*)... på tabellen for at se, om der
> skal
> være et forward link, eller man er på sidste side.
>
> $backwards_link = $_GET['limit'] ? "<a
> href=\"?limit=".$backwards_limit."\">Previous</a>" : "";

Jeg er ved at kikke på det men undre mig så lige over hvad $_GET['limit'] ?
og i slutningen : "" skal bruges til, jeg får samme resultat ved at skrive:
$backwards_link = "<a href=\"?limit=".$backwards_limit."\">Previous</a>";

/HK



Martin (06-04-2006)
Kommentar
Fra : Martin


Dato : 06-04-06 23:01

Harald wrote:
> "Søren G." <not@avail.com> skrev i en meddelelse
> news:443575a7$0$15794$14726298@news.sunsite.dk...
>> Hej Harald,
>>
>> Ting, som du gemmer i $_SESSION skal være variabler, som tilhører den
>> session,
>> som brugeren har.
>>
>> Så lad os sige, at brugeren kigge på den omtalte liste og og bladrer frem
>> til
>> side 3. Derefter vælger han at gå ind på en helt anden side. Senere vender
>> han
>> tilbage til siden. Hvis du da ønsker, at han skal komme ind på side 3 med
>> det
>> samme, så vil det være relevant at bruge $_SESSION. Ellers mener jeg ikke
>> at
>> det er den rigtige løsning.
>>
>> Brug i stedet $_GET til at definere, hvor langt brugeren er i at bladre.
>>
>> Eks.
>>
>> if(!isset($_GET['limit'])
>> $_GET['limit'] = 0;
>>
>> $rows_pr_page = 50; // Eller andet antal
>>
>> $backwards_limit = $_GET['limit'] - $rows_pr_page;
>>
>> $forward_limit = $_GET['limit'] + $rows_pr_page;
>>
>> $sql = "SELECT ...................
>> FROM .....................
>> WHERE ....................
>> ORDER BY ................
>> LIMIT ".$_GET['limit'].",".$rows_pr_page;
>>
>> Husk også at lave en "SELECT COUNT(*)... på tabellen for at se, om der
>> skal
>> være et forward link, eller man er på sidste side.
>>
>> $backwards_link = $_GET['limit'] ? "<a
>> href=\"?limit=".$backwards_limit."\">Previous</a>" : "";

For at skrive det lidt mere "brugervenligt"

if($_GET["limit"]) {
$backwards_link = "<a
>> href=\"?limit=".$backwards_limit."\">Previous</a>";
} else {
$backwards_link = "";
}


>
> Jeg er ved at kikke på det men undre mig så lige over hvad $_GET['limit'] ?
> og i slutningen : "" skal bruges til, jeg får samme resultat ved at skrive:
> $backwards_link = "<a href=\"?limit=".$backwards_limit."\">Previous</a>";
>
> /HK
>
>

Harald (06-04-2006)
Kommentar
Fra : Harald


Dato : 06-04-06 23:11

"Martin" <news@natten-i.dk> skrev i en meddelelse
news:44358f99$0$15785$14726298@news.sunsite.dk...
> Harald wrote:
>> "Søren G." <not@avail.com> skrev i en meddelelse
>> news:443575a7$0$15794$14726298@news.sunsite.dk...
>>> Hej Harald,

<klik klip>

>>
>> Jeg er ved at kikke på det men undre mig så lige over hvad $_GET['limit']
>> ? og i slutningen : "" skal bruges til, jeg får samme resultat ved at
>> skrive:
>> $backwards_link = "<a href=\"?limit=".$backwards_limit."\">Previous</a>";

> For at skrive det lidt mere "brugervenligt"
>
> if($_GET["limit"]) {
> $backwards_link = "<a
> >> href=\"?limit=".$backwards_limit."\">Previous</a>";
> } else {
> $backwards_link = "";
> }

Tak for det.

/HK



Geert Lund (06-04-2006)
Kommentar
Fra : Geert Lund


Dato : 06-04-06 22:17

Harald wrote:

> Jeg har en side hvor man kan få nogle lange sider efter søgning i en
> database og det skal derfor deles op i mindre sider, nogen der kan give mig
> nogle tips til hvordan man med php kan får det lavet det således at man et
> sted på siden har nogle forrige/næste links. Skal man gemme hvortil man er
> nået i $_SESSION eller skal det gives videre med POST/GET eller hvordan gør
> man normalt?

Der er vist ikke noget normalt - du skal gøre hvad der er mest
hensigtsmæssigt for din applikation. Er du fx afhængig af at Google med
varianter indekserer undersiderne på dine tabeller? Så kan det være en
god ide at lave det via GET/POST variabler - er det ikke et issue - kan
det være pænere at lave det via $_SESSION.

Men det korte af det lange - må være at det vigtigste er at du gemmer
informationen om hvor langt i dit result-set du er nået.

Nogle vælger at gøre det op i hvilken record af resultatet du er nået
til - andre vælger fx blot at sige du er på side 1 af 100 (og så have en
intern udregning af hvor mange results der vises pr. side).

Brug indlægget fra Søren G. til inspiration - men vær opmærksom på en
enkelt forskel... Brug ikke metoder som:

LIMIT ".$_GET['limit'].",".$rows_pr_page;

Altså - hent ikke resultatet direkte via $_GET og injekt det til din
database - sørg for at validere inputtet i stedet:

if ( !isset( $_GET['limit'] ) && ctype_digit( $_GET['limit'] ) )
$limit = (int) $_GET['limit'];
else
$limit = 0;

Og så:

LIMIT $limit, $rows_pr_page";

I ovenstående kontrolstruktur - checker du at der kommer noget forventet
ind i dit script inden du injecter det til din database. Sådan et check
bør du lave på alle værdierne der sendes med via GET/POST.

Ovenstående bør også udbygges yderligere hvis du ved at fx $limit kan
yderligere afgrænses - fx kun kan være tal mellem 0 og 10 eller max være
1000 etc.

Slå dog bl.a. ctype_digit() op på PHP.net for at få fuld forståelse for
hvad denne funktion og varianter præcis kan hjælpe med.

www.php.net/ctype_digit

--
Med venlig hilsen
Geert Lund,
www.GLD.dk

Harald (07-04-2006)
Kommentar
Fra : Harald


Dato : 07-04-06 12:56

"Geert Lund" <glund-news@post.tele.dk> skrev i en meddelelse
news:443584ba$0$2088$edfadb0f@dtext02.news.tele.dk...
> Harald wrote:
>
>> Jeg har en side hvor man kan få nogle lange sider efter søgning i en
>> database og det skal derfor deles op i mindre sider, nogen der kan give
>> mig nogle tips til hvordan man med php kan får det lavet det således at
>> man et sted på siden har nogle forrige/næste links. Skal man gemme
>> hvortil man er nået i $_SESSION eller skal det gives videre med POST/GET
>> eller hvordan gør man normalt?
>
> Der er vist ikke noget normalt - du skal gøre hvad der er mest
> hensigtsmæssigt for din applikation. Er du fx afhængig af at Google med
> varianter indekserer undersiderne på dine tabeller? Så kan det være en god
> ide at lave det via GET/POST variabler - er det ikke et issue - kan det
> være pænere at lave det via $_SESSION.
>
> Men det korte af det lange - må være at det vigtigste er at du gemmer
> informationen om hvor langt i dit result-set du er nået.
>
> Nogle vælger at gøre det op i hvilken record af resultatet du er nået
> til - andre vælger fx blot at sige du er på side 1 af 100 (og så have en
> intern udregning af hvor mange results der vises pr. side).
>
> Brug indlægget fra Søren G. til inspiration - men vær opmærksom på en
> enkelt forskel... Brug ikke metoder som:
>
> LIMIT ".$_GET['limit'].",".$rows_pr_page;
>
> Altså - hent ikke resultatet direkte via $_GET og injekt det til din
> database - sørg for at validere inputtet i stedet:
>
> if ( !isset( $_GET['limit'] ) && ctype_digit( $_GET['limit'] ) )
> $limit = (int) $_GET['limit'];
> else
> $limit = 0;
>
> Og så:
>
> LIMIT $limit, $rows_pr_page";

Burde det ikke være nok bare at skrive:

if ( isset( $_GET['limit'] ))
$limit = (int) $_GET['limit'];
else
$limit = 0;

/HK



Geert Lund (07-04-2006)
Kommentar
Fra : Geert Lund


Dato : 07-04-06 13:44

Harald wrote:

> Burde det ikke være nok bare at skrive:

> if ( isset( $_GET['limit'] ))
> $limit = (int) $_GET['limit'];
> else
> $limit = 0;

Næh, hvorfor det? Hvis $_GET indeholder noget andet end det forventede
vil du få mere eller mindre uforudsigelige resultater ud i din $limit =
- det er god skik _ALTID_ så vidt muligt at teste på indholdet af en
udefra kommende variabel og teste at den har det forventede indhold. Det
kunne jo også være at du havde andre begrænsninger du gerne ville teste
på den i samme forbindelse - og så vil ovenstående jo ikke være så smart.

I øvrigt mener jeg fx at hvis nu din form submittes og den blot har en
tom limit= i strengen - vil din metode returnere end $limit uden indhold
da du ikke vil fange den tomme variabel med ovenstående kode. (isset vil
stadig returnerer true da variablen er sat men blot uden indhold) - i så
fald ville du skulle benytte:

if ( !empty( $_GET['limit'] ) ) etc.... (den vil dog omvendt fejle hvis
limit = 0 osv...

Læs: at lave ovenstående er IMNSHO at springe over hvor gærredet er
lavest. Det efterlader dig med mange mulige fejlkilder der kan være
svære at fange og følge op på efterfølgende.

Og i ovenstående ønsker du at sikre - at uanset hvad man forsøger at
injecte til dit script via $_GET['limit'] at du ved du har kontrol over
indholdet - altså - modtager du et heltal fra 0 og opefter - er det et
validt svar - hvis nogen fx sender 1,01 1.01 etc. - vil du være sikker
på at dette ikke kan valideres som korrekt og du vil have kontrollen der
sætter $limit til 0 i alle tilfælde hvor det forventede indput ikke var
som forventet.

Jeg håber du kan se lidt af hvad jeg mener - for det er rigtig god skik
og god programmering at man bruger tid på at checke sit input og
validere at det har det forventede indhold inden man blot kaster det
ubetinget rundt i sin kode til SQL, osv.

--
Med venlig hilsen
Geert Lund,
www.GLD.dk

Harald (07-04-2006)
Kommentar
Fra : Harald


Dato : 07-04-06 18:12

"Geert Lund" <glund-news@post.tele.dk> skrev i en meddelelse
news:44365e31$0$2093$edfadb0f@dtext02.news.tele.dk...
> Harald wrote:
>
>> Burde det ikke være nok bare at skrive:
>
>> if ( isset( $_GET['limit'] ))
>> $limit = (int) $_GET['limit'];
>> else
>> $limit = 0;
>
> Næh, hvorfor det? Hvis $_GET indeholder noget andet end det forventede vil
> du få mere eller mindre uforudsigelige resultater ud i din $limit = - det
> er god skik _ALTID_ så vidt muligt at teste på indholdet af en udefra
> kommende variabel og teste at den har det forventede indhold. Det kunne jo
> også være at du havde andre begrænsninger du gerne ville teste på den i
> samme forbindelse - og så vil ovenstående jo ikke være så smart.
>
> I øvrigt mener jeg fx at hvis nu din form submittes og den blot har en tom
> limit= i strengen - vil din metode returnere end $limit uden indhold da du
> ikke vil fange den tomme variabel med ovenstående kode. (isset vil stadig
> returnerer true da variablen er sat men blot uden indhold) - i så fald
> ville du skulle benytte:
>
> if ( !empty( $_GET['limit'] ) ) etc.... (den vil dog omvendt fejle hvis
> limit = 0 osv...
>
> Læs: at lave ovenstående er IMNSHO at springe over hvor gærredet er
> lavest. Det efterlader dig med mange mulige fejlkilder der kan være svære
> at fange og følge op på efterfølgende.
>
> Og i ovenstående ønsker du at sikre - at uanset hvad man forsøger at
> injecte til dit script via $_GET['limit'] at du ved du har kontrol over
> indholdet - altså - modtager du et heltal fra 0 og opefter - er det et
> validt svar - hvis nogen fx sender 1,01 1.01 etc. - vil du være sikker på
> at dette ikke kan valideres som korrekt og du vil have kontrollen der
> sætter $limit til 0 i alle tilfælde hvor det forventede indput ikke var
> som forventet.
>
> Jeg håber du kan se lidt af hvad jeg mener - for det er rigtig god skik og
> god programmering at man bruger tid på at checke sit input og validere at
> det har det forventede indhold inden man blot kaster det ubetinget rundt i
> sin kode til SQL, osv.

Jeg kan se hvad du mener så jeg vil gennemgå mine php filer og få sikret
dem. Mange tak for det grundige svar.

/HK



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

Månedens bedste
Årets bedste
Sidste års bedste