Perjantai, 24.11.2017    
Jorkki.com

Artikkelit
   » Etusivu
   » Palaute


logo
  Artikkelit » PHP-opas

1. Alkuun
2. Ehtolause
3. Lomakkeiden käsittely
4. Tiedoston sisällyttäminen
5. Silmukat
6. Taulukot
7. Tiedostojen käsittely
8. Superglobaalit muuttujat
9. Päätäntö ja FAQ




Tiedostojen käsittely

Edellisessä jaksossa käytimme esimerkissä tietokantana tekstitiedostoa. Tässä jaksossa opetetaan, kuinka voidaan tallentaa tietoa tekstitiedostoon. Esimerkissä tehdään täysin toimiva linkkilista.
Ensin kuitenkin perusasiat tiedostoon tallentamisesta.

Esimerkki 12

<?php
$tiedosto = "tiedosto.txt";
$data = "dataa";
$fp = fopen($tiedosto, 'w');
fwrite ($fp, $data);
fclose ($fp);
?>

  • Kaikki pitäisi olla selvää riville 4 asti. Muuttuja $fp "saa tehtävän" avata tiedoston. Tiedosto avataan funktiolla fopen(). Fopen() ottaa argumentikseen tiedoston nimen (joka tällä kertaa on tallennettu muuttujaan $tiedosto), joka avataan ja moodin. Käytimme tässä esimerkissä moodia 'w', joka tarkoittaa, että tiedostoon kirjoitetaan ja jos tiedostossa on aiempaa dataa, kirjoitetaan uusi data sen päälle. Jos taas tiedostoa ei ole olemassakaan, niin sellainen tehdään. Tiedoston luominen onnistuu parhaiten vain Windows-ympäristössä. Unix-ympäristössäkin se onnistuu, mutta vaatii, että tiedostolle asetetaan oikeudet. Jos palvelin on Unix-palvelin (johon kuuluu myös Linux), suosittelemme että lähetät vaikka tyhjän tiedoston palvelimelle ja annat sille oikeudet 666, 755 tai 777, eli chmoddaat sen (chmoddaus-opas). Windows-palvelimilla tiedostoa ei tarvitse välttämättä lähettää entuudestaan, jos käytetään moodia w. Muut moodit ovat a ja r. Moodilla a tiedosto avataan ja tiedostoon lisätään tietoa aiemman datan perään. Jos tiedostoa ei ole, sitä ei myöskään luoda. Moodia r käytetään, kun tiedosto halutaan avata vain lukemista varten.
  • Funktio fwrite() ottaa argumentikseen tiedosto-osoittimen, jolla tiedosto on avattu w- tai a-moodilla ja datan, joka tiedostoon kirjoitetaan. Nyt kirjoitamme siis tiedostoon tiedosto.txt muuttujassa $data olevat merkit, eli "dataa".
  • Lopuksi tiedosto pitää vielä sulkea fclose()-funktiolla. Funktio ottaa argumentikseen tiedosto-osoittimen, kuten funktio fwrite().
  • Nyt tiedosto.txt sisältää merkkijonon "dataa".

Esimerkki 13

<html>
<head>
<title>Linkkilista</title>
</head>
<body>
<?php
print "<h1>Linkkilista</h1>";
$tulostus = file("linkit.txt");
$rivit = count($tulostus);
if ($rivit == 0 )
{
print "Linkkilistassa ei ole yhtään linkkiä.<br><br>";
}
elseif ($rivit == 1)
{
print "Linkkilistassa on 1 linkki.<br><br>";
}
else
{
print "Linkkilistassa on $rivit linkkiä.<br><br>";
}
if ($rivit != 0)
{
$rivit2 = $rivit - 1;
$i = 0;
while ($i <= $rivit2)
{
$tulosta = explode("|", $tulostus[$i]);
print "<b><a href=\"$tulosta[0]\">$tulosta[1]</a></b><br>$tulosta[2]<br><br>";
$i++;
}
}
print "<br><br>
<b>Lisää oma linkkisi:</b><br><br>
<form method=\"post\" action=\"$PHP_SELF\">
Sivun URL: <input type=\"text\" name=\"url\" size=\"20\" value=\"http://\"><br>
Sivun nimi: <input type=\"text\" name=\"nimi\" size=\"20\" value=\"\"><br>
Sivun kuvaus: <input type=\"text\" name=\"kuvaus\" size=\"20\" value=\"\"><br>
<input type=\"submit\" value=\"Lähetä\">
</form> ";
if (isset($url))
{
$tiedosto = "linkit.txt";
$fp = fopen($tiedosto, 'a');
$data = "$url|$nimi|$kuvaus\n";
fwrite ($fp, $data);
print "Linkki lisätty.";
}
?>
</body>
</html>

  • Nyt päästään ainakin toistaiseksi monimutkaisimman skriptin käsittelyyn. Melko varmasti suurimmalle osalle jää epäselviä kohtia, mutta ei kannata luovuttaa.
  • Lähdekoodi alkaa normaaleilla HTML-tageilla, koska tarkoitus on, että tämä on täysin toimiva sivu. PHP:tä aletaan käyttämään vasta rivillä 6. Rivillä 8 jaamme linkit.txt:n rivit taulukoiksi, jonka jälkeen taulukot alkiot (alkio on tässä tapauksessa yksi rivi) lasketaan count()-funktiolla. Rivillä 10 testataan, että jos alkioita on 0 (eli tiedosto on tyhjä), tulostetaan teksti "Linkkilistassa ei ole yhtään linkkiä". Rivillä 14 testataan kieliopillisista syistä, että jos alkioita on 1, kirjoitetaan "Linkkilistassa on yksi linkki". Jos tätä ei testattaisi ja linkkilistassa olisi yksi linkki, olisi lause "Linkkilistassa on 1 linkkiä", eli kieliopillisesti väärin. Muussa tapauksessa tulostetaan lause "Linkkilistassa on $rivit linkkiä", jossa muuttuja $rivit sisältää alkioiden määrän, ja tässä tapauksessa yksi alkio sisältää yhden linkin tiedot.
  • Rivillä 22 on lause if ($rivit != 0). != on erisuuri-operaattori, eli jos linkkien määrä on erisuuri, kuin 0, toteutetaan koodit, jotka pian käsitellään.
  • Ensin tallennamme muuttujaan $rivit2, luvun, joka on muuttuja $rivit - 1. Tämä tehdään, koska taulukon alkioiden indeksointi aloitetaan nollasta. Lisäksi esitellään uusi muuttuja, $i, johon tallennetaan arvo 0.
  • Nyt käytämme while-silmukkaa apuna, kun tulostamme alkioiden tiedot. Eli niin kauan, kuin $i on pienempi tai yhtä suuri, kuin $rivit2, tehdään lauseet:
    $tulosta = explode("|", $tulostus[$i]);
    print "<b><a href=\"$tulosta[0]\">$tulosta[1]</a></b><br>$tulosta[2]<br><br>";
    $i++;
    Ensin explode()-funktiolla jaetaan $tulostus[$i]-taulukko uudeksi taulukoksi. $tulostus[$i] jaetaan siis taulukoiksi |-merkin perusteella, koska linkkien tiedot ovat tietokannassa muodossa "linkin url|linkin nimi|linkin kuvaus". Muuttujan $i arvo vaihtelee siis joka kerta, koska lopussa $i:n arvoa lisätään yhdellä. Nyt $tulosta[0] sisältää linkin url:n, $tulosta[1] linkin nimen ja $tulosta[2] linkin kuvauksen. Tämän jälkeen linkin tiedot tulostetaan ja $i:n arvoa kasvatetaan ja silmukka testaa uudestaan, onko $i pienempi tai yhtäsuuri, kuin $rivit2 ja jos on, tehdään kaikki taas uudestaan.
  • Nyt ensimmäinen osa, jolla linkit tulostetaan, on valmis. Nyt on jäljellä vielä osa, jolla linkit lisätään tiedostoon.
  • Rivillä 35 aloitamme lomakkeen koodilla <form method=\"post\" action=\"$PHP_SELF\">. Lainausmerkkien eteen pitää laittaa kenoviiva, kun tulostamme PHP-tulkin kautta jotain. Muuten PHP-tulkki antaa parse error-ilmoituksen. Kohta action=\"$PHP_SELF\" tarkoittaa, että lomake käsitellään samassa skriptissä. Jos kohta olisi esim. action=\"lomakkeenkasittelija.php\", niin lomakkeen tiedot lähetettäisiin skriptiin lomakkeenkasittelija.php. Olisimme tässäkin esimerkissä voineet laittaa lomakkeenkäsittelyn kokonaan eri skriptiin, mutta koska skripti on vielä niin yksinkertainen, niin se on sama käsitellä samassa skriptissä. Jos skripti on monimutkainen, voi olla parempi vaihtoehto käsitellä lomake erillisessä skriptissä.
  • Lomakkeiden nimiksi tulee siis url, nimi ja kuvaus. Nyt merkit, jotka ovat kirjoitettu url-nimiseen kenttään tallentuvat muuttujaan $url jne.
  • Rivillä 41 if (isset($url)) on meille uusi funktio isset(). Se testaa, onko muuttujaa olemassa. Tässä tapauksessa testaamme siis, onko $url-nimistä muuttujaa olemassa. Jos se on olemassa, on se merkki siitä, että lomake on lähetetty. Tämä on yksi monista tavoista testata, onko lomaketta lähetetty ja itse teen sen yleensä tällä tavalla. Jos lomake on nyt siis lähetetty, toteutetaan seuraavat koodit:
    $tiedosto = "linkit.txt";
    $fp = fopen($tiedosto, 'a');
    $data = "$url|$nimi|$kuvaus\n";
    fwrite ($fp, $data);
    print "Linkki lisätty.";
    Tuossa avaamme tiedosto.txt:n moodilla 'a', eli lisäysmoodilla, jolla tietoa lisätään tiedoston perään. Muuttujaan $data tallennetaan lomakkeen tiedot. Linkin url, nimi ja kuvaus erotellaan |-merkillä, koska linkkien tulostuksessa explode()-funktio erottelee tiedot tuon merkin avulla. Lopussa vielä on \n, joka ei tallennu sellaisenaan. Se on PHP:n rivinvaihtomerkki, jolla jokaisen eri linkin tiedot saadaan eri riville. Lopuksi vielä tulostamme, että linkki on lisätty.
  • Jos olet onnistunut pysymään mukana ja ymmärrät tämän skriptin toiminnan, voit onnitella itseäsi. Tämän skriptin saa melko helposti muokattua eri tilanteisiin sopivaksi. Esimerkiksi vieraskirjan voisi toteuttaa lähes samalla tavalla.

    Seuraava luku




© JC Web Productions