Načrtovanje in razvoj spletnih aplikacij

Datoteke v PHP

V PHP lahko datoteke ustvarjamo, odpiramo, beremo, zapisujemo in zapiramo. Pri tem moramo paziti na pravilen način odpiranja datoteke, preverjanje napak in po potrebi tudi na zaklepanje datoteke.

Pomni: Pri delu z datotekami moramo datoteko najprej odpreti, nato jo prebrati ali vanjo zapisati, na koncu pa jo zapreti z fclose().

Odpiranje datoteke

Za odpiranje datoteke uporabimo funkcijo fopen().

fopen(ime_datoteke, način)

Najpogostejši načini dostopa do datoteke so:

Način Opis
r samo branje; kazalec je na začetku datoteke
r+ branje in pisanje; kazalec je na začetku datoteke; datoteka mora obstajati
w samo pisanje; obstoječo vsebino pobriše; če datoteka ne obstaja, jo ustvari
w+ branje in pisanje; obstoječo vsebino pobriše; če datoteka ne obstaja, jo ustvari
a pisanje na konec datoteke; če datoteka ne obstaja, jo ustvari
a+ branje in pisanje; zapisuje vedno na konec; če datoteka ne obstaja, jo ustvari
x ustvari novo datoteko za pisanje; če datoteka že obstaja, odpiranje ne uspe
x+ ustvari novo datoteko za branje in pisanje; če datoteka že obstaja, odpiranje ne uspe
c pisanje brez samodejnega brisanja vsebine; če datoteka ne obstaja, jo ustvari
c+ branje in pisanje brez samodejnega brisanja vsebine; če datoteka ne obstaja, jo ustvari

Pozor: Način r+ datoteke ne ustvari. Če datoteka ne obstaja, odpiranje ne uspe.

Zapisovanje v datoteko

Za pisanje v odprto datoteko uporabimo funkcijo fwrite().

fwrite(kazalec, besedilo);
<?php
$imeDatoteke = 'tekst.txt';
$vsebina = "Danes je pa en lep dan!\n";

$handle = fopen($imeDatoteke, 'w');

if ($handle === false) {
    echo "Datoteke ne morem odpreti.";
} else {
    if (fwrite($handle, $vsebina) === false) {
        echo "Ne morem zapisovati v datoteko $imeDatoteke!";
    } else {
        echo "Zapisovanje v datoteko je uspelo!";
    }
    fclose($handle);
}
?>
Zapisovanje v datoteko je uspelo!

Pomni: Funkcija fwrite() vrne število zapisanih bajtov ali false ob napaki, zato rezultat preverjamo z operatorjem ===.

Branje datoteke

Za branje datoteke lahko uporabimo fread().

fread(kazalec, dolžina);
<?php
$imeDatoteke = 'tekst.txt';
$handle = fopen($imeDatoteke, 'r');

if ($handle === false) {
    echo "Datoteke ne morem odpreti za branje.";
} else {
    $vsebina = '';
    while (!feof($handle)) {
        $vsebina .= fread($handle, 8192);
    }
    echo nl2br(htmlspecialchars($vsebina));
    fclose($handle);
}
?>
Danes je pa en lep dan!

Preprostejše funkcije za celo datoteko

Če želimo prebrati ali zapisati celotno datoteko naenkrat, sta pogosto bolj pregledni funkciji file_get_contents() in file_put_contents().

<?php
file_put_contents('tekst2.txt', "Prva vrstica\n", LOCK_EX);
echo file_get_contents('tekst2.txt');
?>

Pomni: Pri enostavnem delu s celo datoteko sta file_get_contents() in file_put_contents() pogosto krajša in preglednejša od uporabe fopen(), fwrite() in fread().

Zaklepanje datoteke

Če več delov programa zapisuje v isto datoteko, lahko uporabimo flock(), da se izognemo konfliktom pri pisanju.

<?php
$handle = fopen('dnevnik.txt', 'c+');

if ($handle !== false) {
    if (flock($handle, LOCK_EX)) {
        fwrite($handle, "Nov zapis\n");
        fflush($handle);
        flock($handle, LOCK_UN);
    }
    fclose($handle);
}
?>

Pozor: Način w lahko datoteko izbriše že ob odpiranju. Če želimo datoteko najprej zakleniti in šele nato spreminjati, je lahko primernejši način c ali c+.

Uporaba drugih PHP datotek

V PHP kodi lahko uporabimo tudi kodo iz drugih .php datotek, pri čemer uporabimo enega od naslednjih ukazov:

Pogoste napake

  • uporaba načina r+ ob napačnem pričakovanju, da bo datoteka ustvarjena samodejno,
  • izpuščanje zapiranja datoteke z fclose(),
  • nenamerno brisanje obstoječe vsebine pri pisanju z načinom w,
  • nepreverjanje, ali je fopen() vrnil false,
  • neupoštevanje zaklepanja datoteke pri večkratnem pisanju.