PDA

Bekijk Volledige Versie : PHP/MySQL vraag



Eduard
18/07/05, 19:25
Hoi,

ik ben redelijk nieuw met dynamische websites, tot nu toe heb ik alleen HTML
sites gebouwd.
Ik maak gebruik van PHP en MySQL.

Ik moet nu een site maken waarop ongeveer 100 fotos staan en daarvoor wil ik
alle de data van de foto's in MySQL opslaan en dan tonen in de browser.
Dit lukt, ik maak een recordset, en laat de inhoud van de recordset zien met
5 foto's per pagina.
Indien er op een foto geklikt wordt is deze doorgelinkt, dit werkt perfect.

Nu wil ik op de detail pagina een vorige en volgende foto link maken en dit
werkt niet.
Indien ik de laatste foto van de recordset bereik moet de eerste weer
getoond worden.
Kan iemand me op weg helpen hoe dit te doen?

De paginas waar ik mee bezig ben staan onder:
http://www.edrox.nl/test/test.php

Bedankt voor jullie advies!!

Eduard

google@phaedro.com
18/07/05, 20:45
Eduard schreef:
> Hoi,
>
Hoi

> Nu wil ik op de detail pagina een vorige en volgende foto link maken en dit
> werkt niet.
> Indien ik de laatste foto van de recordset bereik moet de eerste weer
> getoond worden.
> Kan iemand me op weg helpen hoe dit te doen?
>
Je bent er bijna.

http://www.edrox.nl/test/detail.php?recordID=0003
De link naar 'Next' gaat naar dezelfde pagina met hetzelfde recordID zo
ook voor de link met Prev

Ik zou het als volgt doen: in detail.php :
- maak een array met records in de volgorde zoals je ze wilt zien
(ONGETEST)
$sql = "SELECT recordID FROM images ORDER BY x,y";
$res = mysql_query($sql);
$image_list = mysql_fetch_array($res);
// klopt dit? array(recordID001,recordID002,...)

$size = len($image_list); //pak lengte
//bepaal positie van recordID in lijst (kan handiger?)
foreach ($image_list as $key => $value){
if ($value == $recordID){
$pos = $key;
}
}


- nu kan je prev en next berekenen:
<?php if ($pos > 0){ //niet eerste ?>
<a href="detail.php?recordID=<?php echo $image_list[$pos-1]
?>">PREV</a>
<?php } else { ?>
<a href="detail.php?recordID=<?php echo $image_list($size-1)
?>">PREV</a>
<?php } ?>

NEXT kan je nu zelf wel.

Succes!

--
Thijs Cobben
PHAEDRO.com

Richard van den Berg
18/07/05, 22:05
On Mon, 18 Jul 2005 19:20:27 +0200 Eduard
(eduard.devries@gmail.com) wrote:
> Hoi,

> ik ben redelijk nieuw met dynamische websites, tot nu toe heb ik alleen HTML
> sites gebouwd.
> Ik maak gebruik van PHP en MySQL.

> Ik moet nu een site maken waarop ongeveer 100 fotos staan en daarvoor wil ik
> alle de data van de foto's in MySQL opslaan en dan tonen in de browser.
> Dit lukt, ik maak een recordset, en laat de inhoud van de recordset zien met
> 5 foto's per pagina.
> Indien er op een foto geklikt wordt is deze doorgelinkt, dit werkt perfect.

Mmm, je maakt van de foto uit de database eerst weer een bestand,
waarom, of bedoel je dat alleen de gegevens in de database staan?

> Nu wil ik op de detail pagina een vorige en volgende foto link maken en dit
> werkt niet.
> Indien ik de laatste foto van de recordset bereik moet de eerste weer
> getoond worden.
> Kan iemand me op weg helpen hoe dit te doen?

o Bepaal je volgorde
o Vorige record is het huidige - 1, check of het weergegeven record de
eerste is, wat wil je dan.
o Volgende record is het huidige + 1, check of het weergegeven record de
laatste is, dan is het eerste record

> De paginas waar ik mee bezig ben staan onder:
> http://www.edrox.nl/test/test.php

Het is prima mogelijk, zo staan onze ruim 5000 foto' en dia's beschreven
en een dikke 3000 gedigitaliseerd met zulke thumbnails:
http://82.217.198.100/cgi-bin/show die doorklikbaar zijn naar grotere
foto's - het voorbeeldje niet.
I.p.v. MySQL gebruik ik PostgreSQL, geen idee in hoeverre dat voor php
uitmaakt.

--
Richard

Eduard
18/07/05, 22:15
Thijs,

Allereerst, bedankt voor je hulp.

Ik heb len vervangen door count omdat len een fout geeft, misschien heb ik
een oude verzie of zo.

Hierdoor kom ik op de regel met

<a href="detail.php?recordID=<?php echo $image_list($size-1)

met een fatal error; Call to undefined function: array() in .....detail.php
on line 105

Regel 105 is de bovenstaande link.



Zie ik nog een fout over het hoofd?

De array image_list moet gevuld zijn omdat ik anders eerder een fout krijg.



Bedankt voor je hulp,



Eduard

google@phaedro.com
19/07/05, 00:15
Eduard schreef:
> Thijs,
> <a href="detail.php?recordID=<?php echo $image_list($size-1)
>
> met een fatal error; Call to undefined function: array() in .....detail.php
> on line 105
>
rechte haken, sorry:
<a href="detail.php?recordID=<?php echo $image_list[$size-1]

tevens voor len/count : ik zei nog ONGETEST :-0

google@phaedro.com
19/07/05, 00:15
je dient ook te checken dat recordID goed is ingevuld:

vooraan:
$sql="SELECT * FROM images WHERE recordID=".$recordID.";";
$res = mysql_query($sql);
$count = $mysql_num_rows($res); //??? aantal rijen
if ($count != 1){
//record not found e.g.recordID=aapnootmies
do_error_sthg();
exit();
}

Hans
19/07/05, 00:45
On 18 Jul 2005 15:11:29 -0700, google@phaedro.com <google@phaedro.com> wrote:
> je dient ook te checken dat recordID goed is ingevuld:
>
> vooraan:
> $sql="SELECT * FROM images WHERE recordID=".$recordID.";";

Als het niet gechecked is dan is typecasting slim.

Hans

--
http://blacklist.kernelnewbies.nl

google@phaedro.com
19/07/05, 22:45
Hans schreef:
> On 18 Jul 2005 15:11:29 -0700, google@phaedro.com <google@phaedro.com> wrote:
> > je dient ook te checken dat recordID goed is ingevuld:
> >
> > vooraan:
> > $sql="SELECT * FROM images WHERE recordID=".$recordID.";";
>
> Als het niet gechecked is dan is typecasting slim.

In PHP ?
Ik snap niet zo goed wat je bedoelt, ben wel geinteresseerd :-)

In archaische programmeertalen als Java die echt niet meer van deze
tijd zijn[1] want sterk getypeerd wat tot een bagger
programmeerproblemen leidt die je niet wilt weten, is typecasting iets
als:
Long wateenklotetaalLongVar = Long.parseLong("1");
eval(wateenklotetaalLongVar.longValue()==1L); //TRUE

In PHP heb je geen explicit typing, en google ik op typecasting krijg
je dingen als:
(1 + "2") . "a" //3a

Bedoel jij iets dergelijks met typecasting?
Hoe kan het helpen met het checken van recordID ?

Cheers,

T.

--
[1] klein stukje frustratie over huidige Java project[2]
[2] soon available online: "Java vs Python - a biased comparison"[3]
[3] op www.phaedro.com

Hans
19/07/05, 23:55
On 19 Jul 2005 13:44:08 -0700, google@phaedro.com <google@phaedro.com> wrote:
> Hans schreef:
>> On 18 Jul 2005 15:11:29 -0700, google@phaedro.com <google@phaedro.com> wrote:
>> > je dient ook te checken dat recordID goed is ingevuld:
>> >
>> > vooraan:
>> > $sql="SELECT * FROM images WHERE recordID=".$recordID.";";
>>
>> Als het niet gechecked is dan is typecasting slim.
>
> In PHP ?
> Ik snap niet zo goed wat je bedoelt, ben wel geinteresseerd :-)

Veel queries zijn makkelijk te voorzien van een sql injectie. Als je
weet dat je een id moet hebben die bestaat uit een int is het handig
om er gewoon een int van te maken. Voor de rest is goed quoten in je
query ook een manier om het tegen te gaan.

> In archaische programmeertalen als Java die echt niet meer van deze
> tijd zijn[1] want sterk getypeerd wat tot een bagger
> programmeerproblemen leidt die je niet wilt weten, is typecasting iets
> als:
> Long wateenklotetaalLongVar = Long.parseLong("1");
> eval(wateenklotetaalLongVar.longValue()==1L); //TRUE

> In PHP heb je geen explicit typing, en google ik op typecasting krijg
> je dingen als:
> (1 + "2") . "a" //3a

Dat wil niet zeggen dat je userinput zomaar moet vertrouwen :-)

>
> Bedoel jij iets dergelijks met typecasting?
> Hoe kan het helpen met het checken van recordID ?

(int)$foo, mits het om een int gaat uiteraard, ander kies je een ander
type. Er zijn ook nog andere oplossingen, daarbij run je de query niet
als de input niet klopt.

Cheers,

Hans
--
http://blacklist.kernelnewbies.nl

Daniel Tryba
20/07/05, 00:25
google@phaedro.com wrote:
> In archaische programmeertalen als Java die echt niet meer van deze
> tijd zijn[1] want sterk getypeerd wat tot een bagger
> programmeerproblemen leidt die je niet wilt weten, is typecasting iets
> als:
> Long wateenklotetaalLongVar = Long.parseLong("1");
> eval(wateenklotetaalLongVar.longValue()==1L); //TRUE

Als je niet weet hoe de objecten van een taal inelkaar zitten kom je
meestal met omslachtige oplossingen waar het helemaal niet nodig is:
"1".equals(String.valueOf(1L))

John Bokma
20/07/05, 00:35
Hans <replyelsewhere@hans.kernelnewbies.nl> wrote:

> On 19 Jul 2005 13:44:08 -0700, google@phaedro.com <google@phaedro.com>
> wrote:
>> Hans schreef:
>>> On 18 Jul 2005 15:11:29 -0700, google@phaedro.com
>>> <google@phaedro.com> wrote:
>>> > je dient ook te checken dat recordID goed is ingevuld:
>>> >
>>> > vooraan:
>>> > $sql="SELECT * FROM images WHERE recordID=".$recordID.";";
>>>
>>> Als het niet gechecked is dan is typecasting slim.
>>
>> In PHP ?
>> Ik snap niet zo goed wat je bedoelt, ben wel geinteresseerd :-)
>
> Veel queries zijn makkelijk te voorzien van een sql injectie. Als je
> weet dat je een id moet hebben die bestaat uit een int is het handig
> om er gewoon een int van te maken. Voor de rest is goed quoten in je
> query ook een manier om het tegen te gaan.

Beste is natuurlijk *vooraf* controleren. Is het een getal (regexp), en
voldoen min en max lengte (zelfde regexp). Vervolgens, ligt het getal
binnen de toegestane grenzen.

Wat ik ook ff niet snap, PHP heeft stringinterpolatie, schrijf het dus
lekker als: $sql="SELECT * FROM images WHERE recordID=$recordID";

(Die ; aan het end van je query (!) is vzviw ook niet nodig).


--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html

google@phaedro.com
22/07/05, 01:45
Daniel Tryba schreef:
>
> Als je niet weet hoe de objecten van een taal inelkaar zitten kom je
> meestal met omslachtige oplossingen waar het helemaal niet nodig is:
> "1".equals(String.valueOf(1L))

Python 2.3.4 (#1, Nov 30 2004, 23:01:17)
[GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-113)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 1=="1"
False
>>> 1==int("1")
True
>>> 1==long("1")
True
>>>

google@phaedro.com
22/07/05, 01:45
Hans schreef:
> On 19 Jul 2005 13:44:08 -0700, google@phaedro.com <google@phaedro.com> wrote:
> > Hans schreef:
> >> On 18 Jul 2005 15:11:29 -0700, google@phaedro.com <google@phaedro.com> wrote:
> >> > je dient ook te checken dat recordID goed is ingevuld:
> >> >
> >> > vooraan:
> >> > $sql="SELECT * FROM images WHERE recordID=".$recordID.";";
> >>
<knip>

>
> Veel queries zijn makkelijk te voorzien van een sql injectie.
<knip>
was daar in php.ini niet iets voor, safe_quote of mode oid ?

Gr.


T.

Daniel Tryba
22/07/05, 22:25
google@phaedro.com wrote:
>>>> 1=="1"
> False
>>>> 1==int("1")
> True
>>>> 1==long("1")
> True
>>>>

Wellicht is PHP dan wat voor je, daar geldt zelfs dat:
1=="1"
waar is.

Begrijp ik het goed dat je op zoek bent naar de syntax:
1==Long.parseLong("1")

Zeer te prefereren boven wat je zelf aan oplossing verzonnen had.

google@phaedro.com
23/07/05, 14:55
Daniel Tryba schreef:
> google@phaedro.com wrote:

>
> Begrijp ik het goed dat je op zoek bent naar de syntax:
> 1==Long.parseLong("1")

Nee, ik bedoel een situatie waar je eerst een getal wil maken van een
String (b.v. form input).

Later wil je een bewerking of check doen. Ik blijf het omslachtig
vinden, ook bovenstaande oplossing (die beter is dan de mijne, ik
chargeerde ook wel).

Iets anders: wat is zinniger om runtime errors te voorkomen,
StrongTyping (Java) of signature-overloading (python)?

- Het is omslachtig in Java om meerdere methodes/constructoren te maken
voor verschillende signatures (type parameters). Daarom worden deze
vaak aangeroepen met null values:
class A { public A(Class1 v1, Class2 v2){...}}
A a = new A(null,null)

* je kan niet zien welke values nullable mogen zijn
* leidt tot overvloedige nullchecks of runtime errors (NullPointer exc
niet erg informatief)

class A:
def __init__(v1=new Class1(), v2=new Class2()):
...

a = new A()
a.v1.class1Method() --> works

* geen type probleem
* sterke 'hint' aan developer welke parameters verplicht zijn

Dus... python roeleert.


Groet,


Thijs

Michiel de Roo
01/08/05, 14:25
google@phaedro.com wrote:
>
> Hans schreef:
>
>>On 19 Jul 2005 13:44:08 -0700, google@phaedro.com <google@phaedro.com> wrote:
>>
>>>Hans schreef:
>>>
>>>>On 18 Jul 2005 15:11:29 -0700, google@phaedro.com <google@phaedro.com> wrote:
>>>>
>>>>>je dient ook te checken dat recordID goed is ingevuld:
>>>>>
>>>>>vooraan:
>>>>>$sql="SELECT * FROM images WHERE recordID=".$recordID.";";
>>>>
> <knip>
>
>>Veel queries zijn makkelijk te voorzien van een sql injectie.
>
> <knip>
> was daar in php.ini niet iets voor, safe_quote of mode oid ?

magic_quotes. Maar dat helpt niet in speciefieke gevallen. Expliciet
checken is daarom beter.