Yleistä kurssista |
HTML- perusteita |
PHP-kielen perusrakenteet |
HTML-lomakkeen käsittely |
Tiedoston käsittely |
Evästeiden käyttö |
Istunnon hallinta |
Oppimis- tehtävät |
Web-sovellusten yleisimmät tavat tallentaa tietoa ovat palvelimella sijaitsevat tiedostot ja relaatiotietokannat. Tällä kurssilla käsitellään vain tietojen tallentamista tekstitiedostoon.
Tekstitiedostoja voidaan käsitellä peräkkäiskäsittelyn tai hajakäsittelyn avulla. Peräkkäiskäsittelyssä tiedosto käydään läpi tietue kerrallaan alusta loppuun sakka. Hajakäsittelyssä siirrytään suoraan haluttuun kohtaan tiedostossa. Tarkastelemme tässä tiedoston peräkkäiskäsittelyä.
Tiedoston käsittelyn perustoiminnot ovat lisäys, muokkaus ja poisto. Toiminnot voidaan toteuttaa joko lukemalla muistiin koko tiedosto kerralla tai lukemalla tiedostoa osina, yleensä rivi kerrallaan.
Jotta tiedostoa voidaan käsitellä, se täytyy ensin avata. Avaaminen tehdään fopen()-funktiolla. Avaamisen yhteydessä asetetaan tiedosto-osoitin eli pointteri yleensä tiedoston alkuun. Tiedosto-osoitin osoittaa, mihin kohtaan tiedostoa seuraava luku- tai kirjoitustapahtuma kohdistuu.
Jotta php-scripti voisi käsitellä tiedostoa, täytyy tiedoston oikeudet olla oikein määritelty. Mikäli tiedostosta vain luetaan tietoja, sille pitää antaa luku- ja suoritusoikeudet. Jos tiedostoon halutaan myös kirjoittaa tulee antaa kirjoitusoikeudet. Oikeudet voi muuttaa Unixin chmod-komennolla tai graafisella ftp-ohjelmalla kuten SSh Secury file transfer client.
PHP:n avulla voidaan toteuttaa myös tiedoston lukitusmekanismi, mikä on tärkeää usean käyttäjän sovelluksissa. Tällä kurssilla käsitellään kuitenkin vain tiedoston käsittelyn pääperiaatteita ja mm. lukitukset jätetään käsittelemättä.
funktio | esimerkki | Kuvaus |
fopen(tiedostonimi, moodi) | $file=@fopen("testi.txt","w") | Avaa funktion kirjoitustilaan. Jos tiedostoa ei ole olemassa, se luodaan.
Jos tiedosto on jo olemassa, se tyhjennetään. Muut tilamoodit ovat lukutila "r" ja lisäystila "a".
Lisäystilassa vanhat tiedot eivät häviä, vaan uudet tiedot kirjoitetaan tiedoston loppuun.
r+ ja a+ moodeissa tiedosto avataan lukemista ja kirjoittamista varten. r+ moodissa tiedosto-osoitin asetetaan tiedoston alkuun ja a+ moodissa tiedoston loppuun. |
readfile(tiedostopolku) | @readfile($polku) | Kirjoittaa muistiin lukemansa tiedoston kokonaan esimerkiksi, kun tulostetaan tiedosto
kokonaisuudessaan www-sivulle. @-virheoperaattosi estää mahdollisten virheilmoituksen näkymisen selaimessa. |
include(tiedostopolku) | @include($polku) | Toimii vastaavasti kuin readfile. |
fread(tiedosto,tiedoston koko) | $teksti=@fread($file,filesize($polku)) | Lukee koko tiedoston muuttujaan $teksti. Filesize()-funktio tutkii tiedoston koon. |
die() | $file=fopen("testi.txt","w")or die("Tiedostoa ei voi avata") | Lopettaa scriptin, jos avaaminen ei onnistu. |
fgets() | $rivi=fgets($file,1024) | Lukee tiedoston seuraavan rivin muuttujaan $rivi. Parametri 1024 on rivin maksimipituus. |
feof() |
while(!feof($file))
{ $rivi = fgets($file, 1024); echo $rivi; } |
Tarkistetaan feof-funktiolla, ettei olla tiedoston lopussa. Luetaan rivi ja tulostetaan se kunnes tullaan tiedoston loppuun. |
fwrite() | fwrite($file,"teksti\n") | Kirjoittaa tiedoston loppuun uuden rivin ja rivinvaihtomerkin. Unixissa rivinvaihto on \n ja Windowsin \r\n.Tästä voi aiheutua ongelmia, jos tiedosto avataan Windowsin tekstieditorilla. PHP osaa kuitenkin käsitellä molempia. |
file() | $tiedosto=file("testi") | Lukee tiedoston kokonaisuudessaan taulukkomuuttujaan $tiedosto. Tiedoston 1. rivi luetaan taulukon ensimmäiseksi alkioksi $tiedosto[0], toinen rivi toiseksi jne. Tiedostoa ei tarvitse lainakaan avata fopen()-funktiolla, jos se vain halutaan kokonaisuudessan lukea taulukkoon. |
fclose() | fclose($file) | Sulkee tiedoston |
file_exists() | if(!file_exists("testi.txt")) print "Tiedostoa ei löydy" |
Testaa onko tiedosto olemassa. |
Peräkkäiskäsittelyssä lisäys-, poisto- ja päivitystoiminnot toteutetaan yleensä siten, että tiedosto luodaan kokonaan uudelleen. Tämä voidaan tehdä kahdella tavalla:
Jos halutaan vain kirjoittaa uusi tietue tiedoston loppuun, voidaan uusi tietue kirjoittaa suoraan tiedoston loppuun.
Esimerkki 1: Tehdään ohjelma, jonka avulla voidaan ylläpitää omaa linkkisivua. Luodaan ensin palvelimelle tyhjä tekstitiedosto linkit.txt ja annetaan siihen kaikille luku- ja kirjoitusoikeudet.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.1 Transitional//EN"> <html> <head> <title>Linkkisivu</title> </head> <body> <h2 style="background-color:silver">Yhteiset linkit</h2> <form action="<? echo $PHP_SELF?>" method="post"> Uusi linkki:<br> <input type="text" name="osoite" value="http://" size="60"> <br>Linkin kuvaus<br> <input type="text" name="kuvaus" size="70"> <br> <input type="submit" name="lisaa" value="Lisää"> <hr size="3" noshade> <?php //linkit.php $path="linkit.txt"; if(isset($_POST['lisaa'])) { if(!$file=@fopen($path,"a")) { echo "Tiedostoa ei voi avata"; } else {//lisätään linkki tiedoston loppuun fwrite($file,$_POST['kuvaus']."<br>"); fwrite($file,"<a href=\"" .$_POST['osoite'] ."\" >".$_POST['osoite']."</a><br>"); fwrite($file, "<hr>"); fclose($file); } } @include($path); ?> </body> </html>
Selityksiä ohjelmaan:
Mikäli tiedoston yksi tietue (yleensä rivi) muodostuu useammasta kuin yhdestä kentästä, täytyy kentät pystyä jotenkin erottamaan toisistaan. Yksi tapa on käyttää tiedoston muotona TSV-tiedostoa. TSV-tiedostossa eli Tab Separated Values-tiedostossa kentät erotetaan toisistaan tabulaattorilla. Kirjoitettaessa tietue tiedostoon, käytetään tabulaattorimerkintänä merkintää \t.
Toinen tapa on käyttää CSV- eli Comma Separated Values-tiedostoa. Tämä eroaa TSV-tiedostosta vain kenttien erotinmerkin osalta. Erotinmerkkinä voidaan käyttää esimerkiksi pilkkua tai puolipistettä.
Esimerkki 2. Täydennetään oppimistehtävässä 14 tehtyä tietokilpailusovellusta niin, että lisätään tekstikenttä vastaajan nimeä varten. Pisteiden laskemisen yhteydessä tallennetaan vastaajan nimi ja pisteet uudeksi riviksi TSV-muotoiseen tekstitiedostoon.
Pisteiden tallentamiskoodi:
//tallennetaan pisteet tiedostoon $file="pistetilasto.txt"; if(!$file=@fopen($file,"a")) { echo "Tiedostoa ei voi avata"; } else { fwrite($file,$_POST['nimi']."\t" .$pisteet."\n"); fclose($file); }
Tiedosto pistetilasto.txt näyttäää alla olevan kuvan mukaiselta. Nimi ja pisteet on erotettu toisistaan tabulaattorilla eli sarkaimella.