[PHP] waarden rond Id opvragen

Pagina: 1
Acties:
  • 141 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,
Ik ben bezig met een fotoalbum maar ik heb een probleemje. Alles zit in een database en iedere foto heeft een id (ik heb de foto's er niet ingestoken via het BLOB datatype voor alle duidelijkheid). Nu wil ik als je op de thumbnail klikt dat er een foto wordt opgehaald.
2 ervoor, de foto, 2 erna zodat ik een mooie thumbnail reeks kan opbouwen.
Nu ben ik wat aan het prutsen tot het werkt, maar ik voel wel dat het niet juist is wat ik doe. (er zitten nog fouten in, maar je ziet al waar ik naartoe wil)
hieronder vind je mijn 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
<?php
require_once('../../verbind.php');
$id               = $_GET['id'];
$rij        = mysql_fetch_array(mysql_query("SELECT count(id) as atl FROM tblFotos"));
$atl        = $rij['atl'];
$begLim  = $_GET['id'] - 2;
$atlLim  = 5;
if($begLim < 0)
{
        $atlLim += $begLim;
        $begLim = 0;
}
$sql       = "SELECT naam, commentaar FROM tblFotos Limit " . $begLim . "," . $atlLim;
$result  = mysql_query($sql) or die(mysql_error());
$rij        = mysql_fetch_array($result);
header('Content-Type: text/xml');
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><fotoalbum>";
$i = -2;
while($rij            = mysql_fetch_array($result))
{
        echo "<foto>";
                echo "<id>" . ($id + $i) . "</id>";
                echo "<src>$rij[0]</src>";
                echo "<commentaar>$rij[1]</commentaar>";
        echo "</foto>";
        $i++;
}
echo "</fotoalbum>";
?>

Is er een manier om te zorgen dat je mooi de 2 records voor en na je Id kan ophalen of ben ik toch juist bezig en moet ik op deze oplossing verder bouwen

Acties:
  • 0 Henk 'm!

Verwijderd

Met een LIMIT en een SORT BY clause, kun je met twee queries alle gewenste rijen ophalen.

Acties:
  • 0 Henk 'm!

  • XiniX88
  • Registratie: December 2006
  • Laatst online: 17-09 19:30
Ik had even niets te doen, dus bij deze:

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
<?php

require_once('../../verbind.php');
$id = intval($_GET['id']);
$fotos = array();

// En nu maken we 2 loopjes:

// Eerst 2 voor de aangevraagde foto
$sql    = "SELECT id, naam, commentaar FROM tblFotos WHERE id < ".$id." ORDER by id DESC LIMIT 0,2";
$result = mysql_query($sql) or die(mysql_error());

while(list($id, $naam, $commentaar) = mysql_fetch_array($result))
{
    $fotos[$id] = array("naam" => $naam, "commentaar" => $commentaar);
}

// En nu de aangevraagde foto en 2 erna
$sql    = "SELECT id, naam, commentaar FROM tblFotos WHERE id >= ".$id." ORDER by id ASC LIMIT 0,3";
$result = mysql_query($sql) or die(mysql_error());

while(list($id, $naam, $commentaar) = mysql_fetch_array($result))
{
    $fotos[$id] = array("naam" => $naam, "commentaar" => $commentaar);
}

// En dan nu mooi parsen:
header('Content-Type: text/xml');
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><fotoalbum>";
echo "<fotoalbum>\r\n"; 
foreach($fotos as $id => $info)
{
    echo "\t<foto>\r\n";
    echo "\t\t<id>" . $id . "</id>\r\n";
    echo "\t\t<src>". $info['naam'] ."</src>\r\n";
    echo "\t\t<commentaar>". $info['commentaar'] ."</commentaar>\r\n";
    echo "\t</foto>\r\n\r\n";
}
echo "</fotoalbum>";

?>


Ik kon overigens niet testen, maar het idee erachter zou moeten werken ;)

Edit: mn //comment iets bewerkt

[ Voor 5% gewijzigd door XiniX88 op 03-11-2007 18:02 ]


Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Met een

WHERE ABS(id - $id) <= 2

kan je zelfs met één query de vijf foto's ophalen. Maargoed, dat is een vrij brakke methode, omdat het stuk gaat als je id-reeks niet meer klopt (als je bijvoorbeeld een foto hebt verwijderd) :)

Acties:
  • 0 Henk 'm!

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 15-09 21:32
eamelink schreef op zaterdag 03 november 2007 @ 18:09:
Met een

WHERE ABS(id - $id) <= 2

kan je zelfs met één query de vijf foto's ophalen. Maargoed, dat is een vrij brakke methode, omdat het stuk gaat als je id-reeks niet meer klopt (als je bijvoorbeeld een foto hebt verwijderd) :)
Dat zou je dan weer op kunnen lossen met:
code:
1
WHERE ABS(id - $id) <= 4 LIMIT 5

Acties:
  • 0 Henk 'm!

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Nee, want de reeks 1,2,8,9,10,11,12,13,14 waarbij je zoekt naar 8 geeft dan 8,9,10,11,12 ipv 1,2,8,9,10 :)

Maargoed, het was toch al een stomme oplossing :P

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Met een UNION kun je het in 1 keer doen denk ik, dat lijkt me het handigste..

[ Voor 87% gewijzigd door user109731 op 03-11-2007 20:02 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
SQL:
1
2
3
4
SELECT id, naam, commentaar, ABS(id - $id) as dif
FROM tblFotos 
ORDER BY dif ASC 
LIMIT 5;


Moet je alleen nog even ze orderen op id.

[edit]

Hmz nee, dat gaat ook niet lukken. Laat maar.

[ Voor 17% gewijzigd door Grijze Vos op 03-11-2007 21:15 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 17-09 16:35

djiwie

Wie?

JanDM schreef op zaterdag 03 november 2007 @ 19:41:
Met een UNION kun je het in 1 keer doen denk ik, dat lijkt me het handigste..
Let er dan wel op dat je de queries tussen haakjes zet en daarbinnen de ORDER BY, anders werkt het niet. Je krijgt dan iets als:
SQL:
1
2
3
4
(SELECT * FROM `tblFotos` WHERE id < $id ORDER BY id DESC LIMIT 2)
UNION
(SELECT * FROM `tblFotos` WHERE id > $id ORDER BY id ASC LIMIT 3)
ORDER BY id

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Super, ik was UNION Volledig vergeten, het was idd de bedoeling om het in 1 query te doen omdat ik het wat nutteloos vond om 2 keer mijn db te belasten voor zo'n klein dingetje.
Nu ff ter zijde, zou dit mogelijk zijn om mijn foto's in XML bij te houden, zoja, hoe zoek je daar dan in met PHP want ik heb er een beetje een dubbel gevoel bij om hiervoor en database te gebruiken.

[ Voor 0% gewijzigd door Verwijderd op 04-11-2007 07:13 . Reden: spelfout ]


Acties:
  • 0 Henk 'm!

  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

of gewoon met IN kan dat ook
stel je wil record 15 en de vorige en de volgende
code:
1
SELECT * FROM fotos WHERE (id IN(SELECT id FROM fotos WHERE id<=15 ORDER BY id DESC LIMIT 0,2) ) OR ( id IN (SELECT id FROM fotos WHERE id>15 ORDER BY id ASC LIMIT 0,1))

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
Zowel die union als die IN maken feitelijk gebruik van twee queries, dus qua databasebelasting is het amper de moeite waard boven 2 losse queries - helemaal gezien de connectie in PHP standaard gewoon opengehouden wordt ;) Daarnaast maak je het jezelf alleen maar moeilijker wanneer een foto aan het einde van de reeks staat - dan krijg je ineens nog maar 4 id's terug bijvoorbeeld, aan welke kant mist er dan een? Moet je weer gaan controleren op het id behorend bij de huidige foto etc, dan zit je al op meer code en mooier zal het er niet door worden.

As for XML: PHP heeft daar een prachtige klasse voor, simpleXML. Maar ik zou als ik jou was niet een XML bestand gaan verkiezen boven een database, zeker zodra je wat meer foto's erin gaat zetten gaat dat namelijk ontzettend fout (alsin, een bestand van een paar meg moeten inladen elke keer als je een bepaalde foto wilt - om nog maar te zwijgen over het niet kunnen zoeken op foto-naam zonder omslachtige loops etc).

Vuistregel: XML is er om data van 1 platform naar een ander te brengen, niet om data op te slaan.

[ Voor 27% gewijzigd door FragFrog op 04-11-2007 13:56 ]

[ Site ] [ twitch ] [ jijbuis ]

Pagina: 1