Kirjoittaja: Antti Laaksonen (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.
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:
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:
Tiedostossa päivämäärä ja teksti on erotettu merkillä |
, jolloin rivin voi jakaa PHP:ssä kaksialkioiseksi taulukoksi explode
-funktiolla.
Tiedostofunktiot soveltuvat myös nettisivujen sisällön lukemiseen. Esimerkiksi seuraava koodi lukee Ohjelmointiputkan etusivun sisällön muuttujaan:
<?php $putka = file_get_contents("https://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.
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);
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).
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
Seuraavat funktiot antavat lisätietoa tiedostosta:
file_exists
kertoo, onko tiedostoa olemassafilesize
kertoo tiedoston koon tavuinafilemtime
kertoo, milloin tiedostoa on muutettu viimeksiFunktioita 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"; } ?>
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.
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.
Hyvä opas, kannattaa aloittaa näistä tiedostoista ensin datan säilömiseen ja sitten vasta siirtyä monimutkaisiin tietokantoihin.
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)
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/
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.