Kirjautuminen

Haku

Tehtävät

Oppaat: PHP-ohjelmointi: Osa 9 - Tiedostot

  1. Osa 1 - Johdanto
  2. Osa 2 - Muuttujat
  3. Osa 3 - if-rakenne
  4. Osa 4 - for-silmukka
  5. Osa 5 - Taulukot
  6. Osa 6 - Lomakkeet
  7. Osa 7 - Nettisivusto
  8. Osa 8 - Lisää silmukoista
  9. Osa 9 - Tiedostot
  10. Osa 10 - Omat funktiot
  11. Osa 11 - Istunnot
  12. Osa 12 - Tietokannat
  13. Osa 13 - Tietoturva
  14. Osa 14 - Olio-ohjelmointi
  15. Osa 15 - Kuvien luonti
  16. Osa 16 - Säännölliset lausekkeet
  17. Osa 17 - Merkistöt
  18. Osa 18 - PHP:n ongelmat

Kirjoittaja: Antti Laaksonen. Vuosi: 2011.

Suoraviivainen tapa tallentaa tietoa on käyttää tiedostoja. Tavallisin tiedoston muoto on tekstitiedosto, joka muodostuu tekstiä sisältävistä riveistä. Tekstitiedostojen käsittely on helppoa ohjelmoinnissa ja tekstieditoreilla, ja keskitymme siihen myös tässä oppaassa.

Vaikka tiedostojen käsittely on yksinkertaista, tiedostot soveltuvat huonosti tilanteisiin, joissa tietoa on paljon ja sitä pitää muokata jatkuvasti. Nykyään tiedostojen sijasta käytetään yhä useammin tietokantaa, joka poistaa monet tiedostojen rajoitukset.

Tiedoston lukeminen

Funktio file_get_contents lukee tiedoston koko sisällön merkkijonoon. Funktiota voi käyttää seuraavasti:

<?php
$sisalto = file_get_contents("testi.txt");
echo $sisalto;
?>

Vastaavasti funktio file lukee tiedoston sisällön taulukkoon, jonka jokainen alkio on yksi tiedoston rivi:

<?php
$rivit = file("testi.txt");
echo "Kolmas rivi: " . $rivit[2];
?>

Esimerkki: Sivuston historia

Oletetaan, että tiedoston historia.txt muoto on seuraava:

5.2.2011|Sivusto on avattu
8.2.2011|Vieraskirja on käytössä
20.2.2011|Uusi ulkoasu
4.3.2011|1000 kävijän raja rikki

Seuraava koodi näyttää tiedoston sisällön sivulla:

<?php
$historia = file("historia.txt");
echo "<ul>";
foreach ($historia as $rivi) {
    $osat = explode("|", $rivi);
    $aika = $osat[0];
    $teksti = $osat[1];
    echo "<li>{$aika}: {$teksti}";
}
echo "</ul>";
?>

Koodin tulostus on seuraava:

  • 5.2.2011: Sivusto on avattu
  • 8.2.2011: Vieraskirja on käytössä
  • 20.2.2011: Uusi ulkoasu
  • 4.3.2011: 1000 kävijän raja rikki

Tiedostossa päivämäärä ja teksti on erotettu merkillä |, jolloin rivin voi jakaa PHP:ssä kaksialkioiseksi taulukoksi explode-funktiolla.

Nettisivun lukeminen

Tiedostofunktiot soveltuvat myös nettisivujen sisällön lukemiseen. Esimerkiksi seuraava koodi lukee Ohjelmointiputkan etusivun sisällön muuttujaan:

<?php
$putka = file_get_contents("http://www.ohjelmointiputka.net/");
?>

Tällä tavalla voi tehdä PHP-sivun, joka käyttää hyväkseen toisella palvelimella olevan sivun sisältöä. Huomaa kuitenkin, että jos julkaiset tällaisen PHP-sivun, sinulla on oltava toisen sivun ylläpitäjän lupa.

Tiedostoon kirjoittaminen

Seuraava koodi kirjoittaa tiedostoon kolme riviä tekstiä:

<?php
$rivit = "Tämä rivi on ensimmäinen.\n" .
         "Tässä tulee toinen rivi.\n" .
         "Kolmas rivi on jo viimeinen\n";
file_put_contents("rivit.txt", $rivit);
?>

Rivit voi antaa myös taulukossa:

<?php
$rivit = array("Tämä rivi on ensimmäinen.\n",
               "Tässä tulee toinen rivi.\n",
               "Kolmas rivi on jo viimeinen\n");
file_put_contents("rivit.txt", $rivit);
?>

Kummassakin tapauksessa tiedoston rivit.txt sisällöksi tulee:

Tämä rivi on ensimmäinen.
Tässä tulee toinen rivi.
Kolmas rivi on jo viimeinen.

Jos tiedostoa ei ole olemassa, se syntyy automaattisesti. Jos tiedosto on olemassa, uusi sisältö korvaa vanhan sisällön. Funktiota voi käyttää myös seuraavasti, jolloin uusi sisältö menee vanhan sisällön perään:

file_put_contents("rivit.txt", $rivit, FILE_APPEND);

Huomautuksia

Linux-palvelimella tiedostoon kirjoittaminen vaatii, että tiedostoon on riittävät oikeudet (oikea chmod-arvo). Yleensä sopiva chmod-arvo tiedostolle on 600 tai 660. Jos tiedostoa ei ole olemassa, hakemiston chmod-arvon täytyy olla vastaavasti 700 tai 770. Oikeuksia voi muuttaa esimerkiksi Linux-komennolla chmod tai FTP-ohjelman kautta.

Rivinvaihto "\n" vastaa Linuxin (ja Unixin) käytäntöä, kun taas Windowsissa rivinvaihto on "\r\n". PHP tuntee molemmat rivinvaihdot, mutta käytännössä rivinvaihto "\n" voi tuottaa ongelmia joillakin Windowsin tekstieditoreilla (esimerkiksi Windowsin omalla Muistiolla).

Esimerkki: Lokitiedosto

Seuraavassa esimerkissä PHP-koodi lisää tiedostoon loki.txt rivin aina, kun joku käy sivulla. Riville tulee kävijän käyntiaika ja IP-osoite.

<?php
$aika = date("Y-m-d H:i:s");
$ip = $_SERVER["REMOTE_ADDR"];
file_put_contents("loki.txt", "{$aika} {$ip}\n", FILE_APPEND);
?>

Kolmen käynnin jälkeen tiedosto voi näyttää seuraavalta:

2011-07-16 12:40:05 16.240.208.219
2011-07-16 14:03:17 42.201.90.27
2011-07-16 14:39:55 205.37.81.49

Tiedoston tiedot

Seuraavat funktiot antavat lisätietoa tiedostosta:

Funktioita voi käyttää vaikkapa näin:

<?php
$nimi = "testi.txt";
if (file_exists($nimi)) {
    $koko = filesize($nimi);
    $aika = date("j.n.Y", filemtime($nimi));
    echo "tiedoston koko on {$koko} tavua ja ";
    echo "sitä on muutettu viimeksi {$aika}";
} else {
    echo "tiedostoa ei ole olemassa";
}
?>

Hakemiston läpikäynti

Seuraava koodi käy läpi kaikki hakemiston tiedostot ja alihakemistot:

<?php
echo "<ul>";
foreach (glob("*") as $tiedosto) {
    if (is_dir($tiedosto)) {
        echo "<li> alihakemisto {$tiedosto}";
    } else {
        echo "<li> tiedosto {$tiedosto}";
    }
}
echo "</ul>";
?>

Tässä glob("*") käy läpi hakemiston koko sisällön. Vastaavasti esimerkiksi glob("*.jpg") käy läpi kaikki jpg-tiedostot ja glob("*.jpg *.png") käy läpi kaikki jpg- ja png-tiedostot. Funktio is_dir kertoo, onko tiedosto alihakemisto.

Esimerkki: Tiedostolista

Seuraava koodi muodostaa listan kaikista hakemistossa olevista zip-tiedostoista.

<?php
echo "<ul>";
foreach (glob("*.zip") as $tiedosto) {
    $koko = round(filesize($tiedosto) / 1024);
    echo "<li> <a href=\"$tiedosto\">$tiedosto</a> ($koko kt)";
}
echo "</ul>";
?>

Koodin tulostus voi olla seuraava:

Tässä 1024:llä jakaminen muuttaa tiedoston koon tavuista kilotavuiksi. Funktio round pyöristää tiedoston koon lähimpään kokonaislukuun.


Kommentit

aksun [20.03.2013 21:41:03]

Lainaa #

Hyvä opas, kannattaa aloittaa näistä tiedostoista ensin datan säilömiseen ja sitten vasta siirtyä monimutkaisiin tietokantoihin.

python61 [26.09.2013 17:41:36]

Lainaa #

Hyvä opas, niin kuin aksun sanoi ainakin minä olen aloittanut tiedostoista ja sitten alan vasta ajattelemaan MySQLää (paitsi jos kaikki valmiit sovellukset ei lasketa mukaan)

Tiirikka [04.03.2014 17:27:27]

Lainaa #

chmod arvo 770 tai 700 ei toiminut mulla, joten käytin 666 >:)

Tästä linkki vielä mielestäni hyvälle sivulle jossa opastetaan tuon käyttö:
http://www.linux.org/threads/file-permissions-chmod.4094/

Kirjoita kommentti

Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.

Muista lukea keskustelun ohjeet.
Tietoa sivustosta