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);
}
?>
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);
}
?>
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()vrnilfalse, - neupoštevanje zaklepanja datoteke pri večkratnem pisanju.