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.