Otetaanpa kuvitteellinen esimerkkitaulu (kuvat), joka sisältää kuvien kuvatekstejä:
tiedosto | kuvateksti
=====================================
kuva_1.jpg | Näkymä pohjoiseen
kuva_2.jpg | Näkymä etelään
kuva_3.jpg | Auringonlasku
kuva_4.jpg | Pysäköityjä autoja
kuva_5.jpg | Ruohonleikkuri
Ja haetaan kuvatekstit esim. gallerian pikkukuvasivulle vaikka tämmöisellä kyselyllä:
SELECT tiedosto, kuvateksti FROM kuvat ORDER BY kuvateksti
Seuraavaksi käyttäjä klikkaa kuva_4.jpg:tä isommaksi ja päätyy sivulle kuva.php, joka näyttää ison kuvan ja kuvatekstin, joka saadaan vaikka kyselyllä SELECT kuvateksti FROM kuvat WHERE tiedosto = 'kuva_4.jpg'
Jospa haluaisin tuolle kuvitteelliselle käyttäjälle nyt mahdollisuuden navigoida suoraan edelliseen tai seuraavaan kuvaan, palaamatta takaisin pikkukuvasivulle... Eli nyt seuraa varsinainen kysymykseni:
Minkälaisella kyselyllä tai kyselyillä saisin haettua (samoilla järjestelyehdoilla) edellisen ja seuraavan rivin?
No teet vaikka id sarakkeen joka kasvaa automaattisesti. Sit kun klikataa kuvan linkkiä se menee siihen idsee olevaa kuvaa. Eli vaikka WHERE id = '$_GET[id]' Sit edellinen on et miinustetaa yks tost idstä ja seuraava et plussataa siihen yks. Ei varmasti paras tapa, mutta luulisin toimivan. Toivottavasti tajusit kun aika epäselvästi selitin.
Jos tiedostonimet ovat aina samassa muodossa; kuva_1.jpg niin hommahan on aika helppo vaikkapa php:llä toteuttaa. Eli vaikkapa explodella stringi poikki ja luet tiedostonimen numeraalisen arvon ja sitten vain lisäät ja vähennät siitä yhden, jolloin saat edellisen ja seuraavan kuvan nimet - jotka sitten vaikkapa urlin mukana kuljetat seuraavalle sivulle.
Uskoisin kyllä, että tiedostonimet eivät ole aivan noin viisasti järjestettyjä, joten joudut kikkailemaan MySQL:llä hieman. Yksi vaihtoehto - paras sellainen - on käyttää Kapen ehdotusta, eli lisätä AUTO INCREMENT PRIMARY KEY kenttä tauluun, jonka mukaan suunnistetaan.
Lienee myös mahdollista jotenkin liimailla kasaan toisenlaista systeemiä, esimerkiksi tälläistä kyselyä voisi käyttää apuna:
SELECT tiedosto FROM kuvat ORDER BY kuvateksti LIMIT 1,1
Kysely palauttaisi 'seuraavan' kuvan tiedostonimen. Se onkin sitten toinen asia, että miten saat selville monesko kuva järjestyksessä on tällä hetkellä menossa (jotta voit soveltaa sitä LIMITin kanssa). :)
Niin, voisin vielä hieman täsmentää tarvettani. Mainitsemanne tavat toimisivat, jos id:t tai tiedostonimet olisivat järjestyksessä... Mutta kun pitäisi löytää jokin toimiva ratkaisu myös tilanteeeen, jossa käyttäjä on vaikka hakenut tiettyjä kuvia ja saanut kuvat 1, 4 ja 5...
Ja kuten Asdin mainitsi: "Se onkin sitten toinen asia, että miten saat selville monesko kuva järjestyksessä on tällä hetkellä menossa (jotta voit soveltaa sitä LIMITin kanssa). :)"... Tässä on juuri se ongelma... :)
Edit: Ei mutta hei!! Esim. PHP-oppaan luvussa 8 on tällaista koodia (pätkä):
//käydään tavarat läpi for ($i = 0; $i < mysql_num_rows($haku); $i++) {
Tuo $i alkaa mielestäni tuntua ongelman avaimelta.
Yksi tapa on (ehkä vähän purkka), että kun katsellaan kuvaa koko ruudulla, niin teet seuraavan kyselyn: SELECT tiedosto FROM kuvat ORDER BY kuvateksti. Menet tulokset läpi for-loopilla, ja loopin sisään laitat ehtolauseen:
if (mysql_result($TuoAiempiKysely, $i, "tiedosto") == $NykyinenIsoKuva) { break; $EdellinenKuva = mysql_result($TuoAiempiKysely, $i-1, "tiedosto"); $SeuraavaKuva = mysql_result($TuoAiempiKysely, $i+1, "tiedosto"); }
Tähän vielä tietysti tarkistukset, että onko noita myslirivejä edes olemassa. Kannattaa kai laittaa @ -merkit noiden mysql_resulttien eteen, jolloin virheilmoituksia ei tule. Muuttujien asettamisen jälkeen tarkistat, että onko jompikumpi muuttujista "".
Kiitoksia! Tuo $SeuraavaKuva toimi vasta breakin poistamisen jälkeen... Mutta muuten pätevä systeemi ja siitä oli paljon apua.
Hyvä jos oli apua tuosta. Kokeile vaikka laittaa se break; vasta muuttujien asettamisen jälkeen, veikkaisin että sitten voisi toimia.
Bagard kirjoitti:
Hyvä jos oli apua tuosta. Kokeile vaikka laittaa se break; vasta muuttujien asettamisen jälkeen, veikkaisin että sitten voisi toimia.
Jep, nyt toimii sekin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.