Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Seuraava rivi

SysRq868 [24.08.2007 10:13:00]

#

Minulla on tällä hetkellä käyttäjistä tietokanta MySQL:ssä, joka on suunnilleen seuraavanlainen:

id     |uname    |pword    |regdate
-------+---------+---------+---------------
438832 |toope    |(krypti) |20070814120715
332091 |erkki    |(krypti) |20060327175034
112209 |ormo     |(krypti) |20060110211110

"regdate" on rekisteröitymisaikaleima, muodossa vvvvkkppttmmss. Käyttäjälistaan olen järjestänyt käyttäjän rekisteröitymisajankohdan mukaan niin, että uusin on ensimmäisenä. Käyttäjänimen linkkiä klikkaamalla pääsee profiiliin, jonka URL on muotoa index.php?p=profile&id=438832

Nyt olisi tarkoituksena (säilyttäen tämän päivämäärän järjestyksen "ORDER BY 'regdate' DESC") lisätä profiilisivulle Edellinen- ja Seuraava-linkit, perustuen tähän GETissä olevaan id:seen. Näistä linkeistä siis tietenkin pääsee päiväjärjestyksessä edelliseen tai seuraavaan profiiliin. Ensimmäisessä profiilissa ei näytettäisi "edellinen"-linkkiä, ja viimeisessä ei näytettäisi "seuraava"-linkkiä.

ID on aina 6-numeroinen, ja kehitetään satunnaisesti niin, että ei ole yhtään samanlaista. Siksi tämän ratkaisu ei ole ID+1. Kuten kuvasta varmaankin näkyy, en ole mikään MySQL-nero (vielä).

Voisin tämän itse varmaan jotain ontuvaa puolihullua keksintöä käyttäen toteuttaa noin kuukaudessa, mutta haluaisin tietää, miten te tämän toteuttaisitte, viisaasti, luettavasti ja nopeasti.

Kiitän jo etukäteen.

Merri [24.08.2007 10:26:04]

#

Käytännössä et kovin helpolla juuri tietyn ID-numeron mukaan saa, mutta sivutukset yleensä tehdäänkin antaen sivunumero tai määrä kohteita, jotka "ohitetaan". Tällöin pääsee helpolla "LIMIT aloitussijainti, kohteidenmaara" näpäkästi eteenpäin. Luonnollisesti sivuttamista varten sinun tarvitsee tietää rivien määrä, jotta linkit tulevat oikein.

SysRq868 [24.08.2007 10:36:39]

#

Ja MySQL:ssä ei varmaankaan tietenkään ole sisäistä rivin numerointia?

ajv [24.08.2007 10:42:21]

#

Yleensä tietokannassa käytetään "sisäistä rivinumerointia" ja MySQL:ssä se kulkee nimellä auto_increment primary key, joka on uniikki kenttä. Se kasvaa automaattisesti aina yhdellä, kun uusi tieto lisätään. Eli itse en generoisi käyttäjälle satunnaista id:tä, vaan käyttäisin juuri tuota "sisäistä numerointia". Tosin tuokaan ei suoranaisesti ratkaise ongelmaasi, sillä jos kannasta poistetaan profiili, häviää profiilin id ja näin ollen et voi aina luottaa että seuraavan profiilin id on nykyinen id +/- 1.

Merrin esittämä LIMIT on helppo ratkaisu, mutta siinä taas se ongelma, että jos kannasta poistetaan profiili, niin silloin esimerkiksi se vanha irkki-linkki siirtyykin osoittamaan poiston jälkeen seuraavaan profiiliin...

Itse olen ratkaissut tuon eräässä kuvagalleriassa (seuraava / edellinen kuva) yksinkertaisesti hakemalla kannasta seuraavan ja edellisen kuvan id:t.

Edit: äh, olisi pitänyt lukea ongelma kunnolla. Tässä siis kyse ihan normaalista sivutuksesta, jolloin tuo Merrin tapa on se helpoin ja oikea tapa. Luulin, että halutaan selata "seuraava / edellinen profiili".

SysRq868 [24.08.2007 10:58:42]

#

ajv: Luulit aivan oikein. Eli samanlainen kuin kuvagalleriassasi. En älyä, miten ihmiset saavat kuvan sivutuksesta... :-S

Eli ajoin juuri sitä takaa, että haettaisiin juuri seuraavan ja edellisen profiilin ID:t. En vain tiedä, miten sen tekisin.

Sori, jos sekaannutin.

ajv [24.08.2007 11:00:27]

#

Voin kaivaa koodin, jos se löytyy...

Edit: äh, se olikin aikamoista sillisalaattia toteutettuna yhdellä haulla über sekavasti, kun kantarakenne oli vähän erilainen. Mutta seuraavan ja edellisen saat kyllä selville ihan simppelisiti seuraavasti:

<?php
$current_id = 100;
$sql = "SELECT id FROM users WHERE id > ".$current_id." ORDER BY id ASC LIMIT 0,1"
list($next) = mysql_fetch_array(mysql_query($sql));

$sql = "SELECT id FROM users WHERE id < ".$current_id." ORDER BY id DESC LIMIT 0,1"
list($prev) = mysql_fetch_array(mysql_query($sql));
?>

Tosin sun pitää tarkistella, että sieltä kannasta oikeasti palautuu jotain. Esim. kun ollaan ekassa profiilissa, niin luonnollisesti "edellinen" ei palauta mitään jne...

SysRq868 [24.08.2007 17:02:10]

#

Kiitän!

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta