Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Ennätyslista

Sivun loppuun

Antti Laaksonen [22.11.2004 14:04:58]

#

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>

Welf Noqburn [23.11.2004 17:36:17]

#

Saisko demoo? Muuten näytää aika hyvältä.

Antti Laaksonen [23.11.2004 18:42:54]

#

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

kala [28.11.2004 17:45:04]

#

Aika nihkeetä kun nimeämiskäytäntö ei ole johdonmukainen. Osa nimistä käyttää ääkkösiä ja osa taas ei.

Antti Laaksonen [28.11.2004 17:49:11]

#

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.M. [29.11.2004 18:29:23]

#

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ä :)

Antti Laaksonen [29.11.2004 19:01:24]

#

No ääkkösten muuttaminen on aika pieni hankaluus moneen muuhun verrattuna. :)

Metabolix [10.12.2011 02:51:59]

#

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.


Sivun alkuun

Vastaus

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

Tietoa sivustosta