30 dniowy kurs php – dzień 15 – operacje na plikach


Back-end (php, mysql)

Dzięki php możesz wykonywać operacje na plikach. Załóżmy, że chcesz aby wszelkie błędy były automatycznie zapisywane do pliku tekstowego. W ten sposób, tworzysz sobie tzw. log, który później możesz przeanalizować i sprawdzić jakie błędy pojawiają się internautom odwiedzającym Twoją stronę.

Na początek poznasz dwie podstawowe funkcje – fopen() i fclose(). W nawiasach w cudzysłowu podajemy nazwę pliku, który chcemy otworzyć, a następnie zamknąć. W praktyce wygląda to tak:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Pliki</title>
</head>
<body>

<?php

// otwieramy plik
$plik = fopen('plik.txt', 'r');

// wykonujemy operacje na pliku

// zamykamy plik
fclose($plik);

?>

</body>
</html>

Tym samym w katalogu z powyższym skryptem musisz również umieścić plik.txt. W pliku wpisz kilka dowolnych linii tekstu np.

przykładowa
zawartość
pliku

Co do działania skryptu. Najpierw zdefiniowaliśmy zmienną odpowiedzialną za otwarcie pliku. W naszym wypadku $plik. W nawiasie funkcji fopen() po przecinku zdefiniowaliśmy tryb w jakim ma zostać otwarty plik. Litera „r” oznacza, że plik zostanie otwarty w trybie tylko do odczytu. Trybów używanych w funkcji fopen() jest więcej. Poniżej tabela.

Tryby otwarcia pliku w funkcji fopen()

Tryb Opis
r Tylko do odczytu. Otwiera plik od początku.
r+ Odczyt i zapis. Otwiera plik od początku.
w Tylko zapis. Otwiera i czyści zawartość pliku, lub tworzy nowy jeśli plik nie istnieje.
w+ Odczyt i zapis. Otwiera i czyści zawartość pliku lub tworzy nowy jeśli plik nie istnieje.
a Dopisanie. Otwiera i zapisuje na końcu istniejącego pliku lub tworzy nowy jeśli plik nie istnieje
a+ Odczyt/dopisanie. Zachowuje zawartość pliku zapisując dane na jego końcu.
x Tylko zapis. Tworzy nowy plik. Zwraca FALSE i błąd jeśli plik już istnieje.
x+ Odczyt i zapis. Tworzy nowy plik. Zwaraca FALSE i błąd jeśli plik już istnieje.

Mamy już plik.txt, mamy skrypt otwierający plik. Znamy już tryby, co należy więc zrobić aby wyświetlić zawartość pliku przy pomocy php? W tym miejscu przypomnij sobie pętlę while. Działa ona do momentu aż spełniony zostanie konkretny warunek. W naszym wypadku warunkiem końcowym będzie osiągnięcie końca pliku. Pętla musi więc działać na zasadzie negacji.  Zawartość pliku będziemy natomiast wyświetlać linia po linii.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Pliki</title>
</head>
<body>

<?php

// otwieramy plik
$plik = fopen('plik.txt', 'r');

// wykonujemy operacje na pliku

while(!feof($plik))
 {
 echo fgets($plik). "<br />";
 }

// zamykamy plik
fclose($plik);

?>

</body>
</html>

Po uruchomieniu skryptu powinieneś zobaczyć w przeglądarce:

przykładowa 
zawartość 
pliku

Funkcja feof() sprawdza czy osiągnięty został koniec pliku. Fgets() „czyta” po kolei linie z wybranego pliku. Ważne: fgets() sczytuje kolejne linie pliku natomiast fgetc() sczytuje znak po znaku. Łatwo o pomyłkę jednej litery.

Podmień w powyższym skrypcie fgets() na fgetc() a zobaczysz różnicę. Zamiast wyświetlonych 3 linii tekstu zobaczysz każdą literę w nowym wersie.

Zapisywanie do pliku

Skoro wiesz już jak otworzyć plik, przydałoby się coś w nim zapisać. Zmodyfikujmy lekko poprzednią funkcję.

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Pliki</title>
</head>
<body>

<?php

$dane = "\n" . 'nowy fragment tekstu';

// otwieramy plik
$plik = fopen('plik.txt', 'r+') or die ('Problem z otwarciem pliku');

// wykonujemy operacje na pliku

while(!feof($plik))
 {
 echo fgets($plik). "<br />";
 }

$zapis = fwrite($plik,$dane) or die('Błąd przy zapisie pliku'); 

// zamykamy plik
fclose($plik);

?>

</body>
</html>

Przy otwieraniu i zapisywaniu pliku dodałem komendę or die, która kończy wykonywanie dalszych działań jeśli wystąpi błąd. Doszła nam również nowa funkcja fwrite(). W nawiasie podajemy najpierw ciąg otwarcia pliku (u nas zmienna $plik), a następnie ciąg danych które mają zostać dopisane do otwartego pliku. U nas ciąg ten przyjął postać zmiennej $dane.

Uruchom skrypt i zauważ, że po każdym odświeżeniu dopisywana jest nowa linia do pliku plik.txt. W zmiennej $dane pojawił się też mały fragment kodu \n, który symbolizuję przejście do nowej linii. Bez tego dodatku nowe dane wpisywane by były ciągiem, bez przejścia do nowej linii. Najlepiej usuń ten fragment kodu i przetestuj.