Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Mysli ja "uusin ylimpänä" listaus

Sivun loppuun

HellCome [23.05.2006 20:44:52]

#

No ja moroskuikkaa taasen. Kalapäiväkirja on saanut olla rauhassa jonkin aikaa, mutta taas iski into ja vimma ruveta viilaamaan. Tässä syntyjä syviä pohdiskellessa tuli mieleen, että niitä kalassakäyntikertoja todennäköisesti vuosien saatossa kertyy, niin ei niitä kaikkia ilkeäisi listata yhdelle ja samalle sivulle ja vieläpä niin hullunkurisessa järjestyksessä, kuin vanhin ylimpänä.

Sampon sivuja käyttäneet tietävät, että tilitapahtumat tulevat "uusin ensin" periaatteella, mutta sielläkin on yksi varsin perustavaa laatua oleva häiritsevä vika. Kyseinen sivu suoltaa tiedot näin ikään:

pvm tapahtuma
--- ---------
7.7. pano - saldo 1 000 000 erkkiä
7.7. nosto - saldo 900 000 erkkiä
6.7. nosto - saldo 0 oravannahkaa


Minun silmääni tämä näyttää siltä, että 6. päivänä tili on tyhjennetty valuutasta. 7. päivänä on sitten yllättäen nostettu käteistä, vaikka tili onkin tyhjä ja tämän jälkeen on tapahtunut pano, josta on saatu namia millin verran.

Onko tällainen järjestely pakollinen paha, vai voisiko tuon tehdä loogisemmaksi ja jos voi, niin mitenkä? Ja millaisella manauksella kyseiset listaukset saadaan näkymään siten, että sivullansa näytetään vaikkapa se 20 tapahtumaa, jonka jälkeen.. no, Googlemaisesti?

Lebe80 [24.05.2006 00:39:36]

#

ORDER BY:llä saa laitettua noita ehtoja, missä järjestyksessä mysql tulostaa noita arvoja.

$query = "SELECT * FROM foo ORDER BY pvm DESC LIMIT 20"; //laskeva
$query = "SELECT * FROM foo ORDER BY pvm ASC LIMIT 20"; //nouseva

Muistathan ettei oikeasti "SELECT * ...":ä saa käyttää, koska se on muisti-/tehosyöppö ja muutenkin väärä tapa.

SELECT -syntaksi

MtJ [24.05.2006 18:12:06]

#

20 per sivu näkyviin menee rajoittamalla sql-lauseen tuloksia;

SELECT * FROM foo ORDER BY pvm DESC LIMIT 0, 20;

Kun lähdetään jatkamaan seuraavalla sivulla, esimerkiksi linkin kautta, tehdään sitten seuraavanlainen juttu;
SELECT * FROM foo ORDER BY pvm DESC LIMIT 20, 40;

ja siitä seuraava sql-lause;
SELECT * FROM foo ORDER BY pvm DESC LIMIT 40, 60;

jne. Linkit vaan sivun alalaitaan, jotta pelaa. Jokaiseen linkkiin liittää muuttujan, johon noi limitin arvot tallentaa ja linkistä $_GET:n avulla sitten tiedot takaisin koodiin.

HellCome [25.05.2006 16:26:15]

#

Leben vinkki kuulostaa tutulta, mutta jostain syystä manailen, että se saisi aikaan "Sampomaisen" listauksen. Kalakerrat nääs tulostetaan päivämäärän mukaan, jolloin 2006-25-05 päivämäärällä tallennetut kalavaleet tulostuvat nurinkurisesti, mutta äkkiä, kuin miljoona wurstia, mieleeni pläjähti sellainenkin mahdollisuus, että tulostaa kalakerrat id:n mukaan, jolloin uusin on aina ylimpänä - sitä kun on vähän rajoittunut..

MtJ:n maanmainio kertosäe näyttää varsin loogiselta, mutta miten käy sitten, kun kalakertoja on enemmän, kuin 20? Tuleeko kalakertojen määrä laittaa taulukkoon ja tarkistaa kalassakäyntikertojen id:n mukaan se, että tehdäänkö uusi linkki, jos kalakerrat ylittävät yli 20?

Jokatapauksessa kiitokset mainioista ohjeista.

Lebe80 [26.05.2006 10:27:44]

#

Ei tarvitse laittaa taulukkoon vaan mySql:ssä saat kyseisen haun(!) rivien määrän seuraavalla tavalla:

$query =" SELECT foo FROM bar";
$result = mysql_query($query);

// Tulosten määrä
$totalRows = mysql_num_rows($result);

// Tuloksia sivulla
$resultsInPage = 20;

// Sivujen lukumäärä
$totalPages = ceil($totalRows/$resultsInPage); // Pyöristetään ylöspäin, jotta esim. 21 tulosta näyttää kaksi sivua (1-20, 21-...)

phadej [26.05.2006 11:05:19]

#

kyllähän select * from on ihan hyvä varsinkin jos oikeesti halua kaikki sarakkeet. nih

ajv [26.05.2006 11:29:29]

#

Sivutuksesta on olemassa koodivinkki:
https://www.ohjelmointiputka.net/koodivinkit/24487-php-sivutus

Lebe80 kirjoitti:

Ei tarvitse laittaa taulukkoon vaan mySql:ssä saat kyseisen haun(!) rivien määrän seuraavalla tavalla:

$query =" SELECT foo FROM bar";

Parempi tapa on kysyä kannalta:

$query =" SELECT COUNT(foo) AS foo_yht FROM bar";
$result = mysql_query($query);
// Tulosten määrä
list($totalRows) = mysql_fetch_array($result);

Niin että jos/kun/ehkä siellä kannassa oli se miiiljoonabiiiljoona riviä, niin ei haeta niitä kaikkia rivejä, vaan se rivien lukumäärä :)

tsuriga [26.05.2006 12:19:05]

#

phadej kirjoitti:

kyllähän select * from on ihan hyvä varsinkin jos oikeesti halua kaikki sarakkeet. nih

Ja koodin seuraava käyttäjä / muokkaaja pyörittelee silmiään kun ei tiedä, mitä kannasta haetaan ja missä järjestyksessä. Jos kenttien nimiä muutetaan vaikkapa kannan selkistämisen vuoksi, kysely kantaan ei anna mitään virhettä jos haetaan vain kaikki kentät. Jos taas haetaan tietyn nimistä kenttää, kentän nimen muuttamisen jälkeen kysely kertoo heti, missä vika.

Lebe80 [26.05.2006 14:52:39]

#

phadej kirjoitti:

kyllähän select * from on ihan hyvä varsinkin jos oikeesti halua kaikki sarakkeet. nih

Kyllähän tuo "SELECT *" nopeuttaa koodinkin kirjoitusta muutamalla sekunnilla, mutta jos tulostukseen sattuu eksymään typo, voi se maksaa puolikin työpäivää. Se siitä muutamasta sekunnista, lisäksi kun haetaan tietoa useasta taulusta, "SELECT *" todellakin antaa _kaikki_ sarakkeet => syö (turhaan) muistia + hidastaa (turhaan) hakua + rasittaa (turhaan) palvelinta.

tsurigan jo mainitsemat virheet ovat liian yleisiä.
Haetaan "SELECT *":llä kaikki kentät, ja sitten ihmetellään miksei $row["user_id"]:llä olekaan mitään arvoa.

HellCome [27.05.2006 14:17:35]

#

Pannaan testiin heti, kunhan aika antaa myöten. Olette te mainiota väkeä, kun neuvotte miestä mäessä, joten kiitokset siitä.

Mutta onkos kellään mitään tietoa siitä, että miksi PHP5:ssa tietokannasta ei voi hakea tietoja kentän nimen mukaan, vaan täytyy käyttää suurissa tietokannoissa hankalahkoa tapaa

print $sqllause[173]

entisen sijaan?

print $sqllause[stasiagentti]

Olga [27.05.2006 16:18:10]

#

Voi toki. Laitas koodia näkyville niin nähdään että missä on häikkää :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta