Keskustelualueella joku tarvitsi PHP:llä tehtyä ennätyslistaa, minkä takia tässä tulee yksinkertainen esimerkki asian toteuttamisesta. Tiedostossa elista.php on funktiot listan avaamiseen, tallentamiseen, tyhjentämiseen sekä tietenkin ennätystuloksen lisäämiseen listalle. Lisäksi on kaksi erillistä esimerkkiä: elista_naytto.php, joka näyttää listan taulukkona, ja elista_lisays.php, jonka avulla listalle voi lisätä tuloksen lomakkeen kautta. Lista tallennetaan tavalliseen tekstitiedostoon, ja tiedostoon tai hakemistoon täytyy olla kirjoitusoikeus.
elista.php
<?php /* elista.php Ennätyslistan käsittelyyn tarvittavat funktiot. Tekijä: Antti Laaksonen 2004 */ // avaa listan tiedostosta tai aloittaa uuden, jos tiedostoa ei ole // $tiedosto = tiedoston nimi, $määrä = ennätysten määrä, $onimi = oletusnimi, $otulos = oletustulos // palauttaa ennätyslistan function avaa_lista($tiedosto, $määrä = 10, $onimi = "(nimetön)", $otulos = 0) { if (file_exists($tiedosto)) { $rivit = file($tiedosto); } else { for ($i = 0; $i < $määrä; $i++) { $rivit[] = "$otulos|$onimi\n"; } } return $rivit; } // tallentaa listan tiedostoon // $lista = ennätyslista, $tiedosto = tiedoston nimi function tallenna_lista($lista, $tiedosto) { $t = fopen($tiedosto, "w"); for ($i = 0; $i < count($lista); $i++) { fwrite($t, $lista[$i]); } fclose($t); } // apufunktio: hakee taulukon ensimmäisen alkion // $taulukko = taulukko, josta alkio haetaan // palauttaa ensimmäisen alkion function hae_eka($taulukko) { return $taulukko[0]; } // tarkistaa, oikeuttaako tulos listalle pääsyyn // $lista = ennätyslista, $tulos = tutkittava tulos // palauttaa 1 (pääsee) tai 0 (ei pääse) function pääseekö_listalle($lista, $tulos) { return intval(intval(hae_eka(explode("|", $lista[count($lista) - 1]))) < $tulos); } // lisää nimen ja tuloksen listalle // $lista = ennätyslista, $nimi = lisättävä nimi, $tulos = lisättävä tulos // palauttaa ennätyslistan function lisää_listalle($lista, $nimi, $tulos) { $tila = 0; for ($i = 0; $i < count($lista); $i++) { if ($tila == 0) { if (intval(hae_eka(explode("|", $lista[$i]))) < $tulos) { $vanha = $lista[$i]; $lista[$i] = "$tulos|$nimi\n"; $tila = 1; } } elseif ($tila == 1) { $toinen = $lista[$i]; $lista[$i] = $vanha; $vanha = $toinen; } } return $lista; } // tyhjentää listan // $lista = ennätyslista, $määrä on ennätysten määrä, $onimi = oletusnimi, $otulos = oletustulos // palauttaa ennätyslistan function tyhjennä_lista($lista, $määrä = 10, $onimi = "(nimetön)", $otulos = 0) { for ($i = 0; $i < $määrä; $i++) { $rivit[] = "$otulos|$onimi\n"; } return $rivit; } ?>
elista_naytto.php
<html><head><title>Ennätyslistan näyttö</title></head><body> <?php require("elista.php"); $lista = avaa_lista("elista.txt"); echo "<table border>"; echo "<tr><td><b>nimi</b></td><td><b>ennätys</b></td></tr>"; for ($i = 0; $i < count($lista); $i++) { $tiedot = explode("|", $lista[$i]); echo "<tr><td>{$tiedot[1]}</td><td>{$tiedot[0]}</td></tr>"; } echo "</table>"; ?> </body></html>
elista_lisays.php
<html><head><title>Ennätyksen lisäys</title></head><body> <?php $nimi = stripslashes($_GET['nimi']); $tulos = intval($_GET['tulos']); if ($nimi == "") { ?> <form action="elista_lisays.php" method="get"> <p><b>Nimi:</b><br><input type="text" name="nimi"></p> <p><b>Tulos:</b><br><input type="text" name="tulos"></p> <p><input type="submit" value="Lähetä"></p> </form> <?php } else { require("elista.php"); $lista = avaa_lista("elista.txt"); if (pääseekö_listalle($lista, $tulos)) { $lista = lisää_listalle($lista, $nimi, $tulos); echo "<p>Ennätyksesi on lisätty listalle.</p>"; } else { echo "<p>Ennätyksesi ei riittänyt listalle pääsyyn.</p>"; } tallenna_lista($lista, "elista.txt"); } ?> </body></html>
Saisko demoo? Muuten näytää aika hyvältä.
Jo vain, vaikka tässä ei paljon näyttämistä olekaan:
http://koti.mbnet.fi/pllk/muut/elista_naytto.php
http://koti.mbnet.fi/pllk/muut/elista_lisays.php
Aika nihkeetä kun nimeämiskäytäntö ei ole johdonmukainen. Osa nimistä käyttää ääkkösiä ja osa taas ei.
Nyt myös lisää_listalle-funktiossa on ääkköset niin kuin pitääkin. Enhän ole unohtanut niitä muualta? Välillä on vaikea muistaa, että PHP sallii ääkköset, kun niin monet muut ohjelmointikielet eivät niitä kelpuuta. :)
Tästä syystä olisikin ehkä parasta olla käyttämättä ääkkösiä funktioiden nimissä, kun muut kielet eivät niitä salli (hankaloittaa ohjelmien kääntämistä toiselle kielelle)
Haa, enpäs ole ennen älynnyt käyttää noita "<" ym. operaattoreita noissa palautusarvojen luonnissa. Kiitoksia vinkistä :)
No ääkkösten muuttaminen on aika pieni hankaluus moneen muuhun verrattuna. :)
Lomakkeen tyypin kannattaisi olla POST, ja lomake kannattaisi käsitellä eri PHP-tiedostossa. Lisäksi pitäisi varautua |-merkkeihin ja rivinvaihtoihin käyttäjän syötteessä ja tulostusvaiheessa käyttää htmlspecialchars-funktiota merkkien <, > ja & takia.
Muuten vinkki on kyllä hyvä esimerkki siitä, miten paljon siistimpää koodista tulee, kun käyttää funktioita.
Aihe on jo aika vanha, joten et voi enää vastata siihen.