11. PHP – Operacje na plikach


Pełną listę funkcji znajdziecie w dokumentacji PHP – funkcje systemu plików,  poniżej najczęściej wykorzystywane.

Operacje na plikach w PHP mają podobną formę jak w C.

Zapisywanie danych w pliku następuje w 3 etapach:

  1. Otwieramy plik lub go tworzymy
  2. Zapisujemy dane w pliku
  3. Zamykamy plik

Odczytywanie danych z pliku również przebiega 3-etapowo:

  1. Otwieramy plik, a jeżeli takowy nie może zostać otwarty musi zostać oprogramowane zgłoszenie błędu
  2. Odczytujemy dane
  3. Zamykamy plik

SPRAWDZAMY CZY PLIK ISTNIEJE

file_exists()

Funkcja sprawdza czy plik lub katalog istnieje.

if (file_exists("plik.txt")) echo "plik istnieje";

 

OTWIERANIE PLIKU

fopen(nazwa_pliku, tryb otwierania);

Przykład:

//instrukcja otwierająca plik, dobrą praktyką jest od razu przypisywanie do zmiennej
$plik=fopen("plik.txt", "w") or die("Nie udało się utworzyć pliku");
  • nazwa pliku – musimy pamiętać o ścieżce dostępu do naszego pliku, jeżeli tryb otwierania jest ustawiony na ”r” czyli tylko do odczytu, to za nazwę pliku może służyć adres URL do pliku. Należy uważać, by nie stworzyć pliku o nazwie, która już istnieje – istniejący plik zostanie wtedy trwale usunięty w miejsce nowo stworzonego.
  • tryb otwierania:
”r”Otwiera tylko do odczytu; umieszcza wskaźnik pliku na jego początku.
”r+”Otwiera do odczytu i zapisu; umieszcza wskaźnik pliku na jego początku.
”w”Otwiera tylko do zapisu; umieszcza wskaźnik pliku na jego początku i obcina plik do zerowej długości. Jeśli plik nie istnieje to próbuje go utworzyć.
”w+”Otwiera do odczytu i zapisu; umieszcza wskaźnik pliku na jego początku i obcina plik do zerowej długości. Jeśli plik nie istnieje to próbuje go utworzyć.
”a”Otwiera tylko do zapisu; umieszcza wskaźnik pliku na jego końcu. Jeśli plik nie istnieje to próbuje go utworzyć.
”a+”Otwiera do odczytu i zapisu; umieszcza wskaźnik pliku na jego końcu. Jeśli plik nie istnieje to próbuje go utworzyć.
”x”Tworzy i otwiera plik tylko do zapisu; umieszcza wskaźnik pliku na jego początku. Jeśli plik juz istnieje, wywołanie fopen() nie powiedzie się, zwróci FALSE i wygeneruje błąd na poziomie E_WARNING. Jeśli plik nie istnieje, spróbuje go utworzyć. To jest równoważne z określeniem flag O_EXCL|O_CREAT stosowanym w wywołaniu systemowym open(2).
”x+”Tworzy i otwiera plik odczytu i zapisu; umieszcza wskaźnik pliku na jego początku. Jeśli plik juz istnieje, wywołanie fopen() nie powiedzie się, zwróci FALSE i wygeneruje błąd na poziomie E_WARNING. Jeśli plik nie istnieje, spróbuje go utworzyć. To jest równoważne z okresleniem flag O_EXCL|O_CREAT stosowanym w wywołaniu systemowym open(2).

ZAPISYWANIE DO PLIKU

fwrite($uchwyt, $tresc);

Powyższa funkcja zapisuje do pliku tekst, zawarty w zmiennej $tresc. Podczas wywołania funkcji można dodać trzeci, opcjonalny argument, $dlugosc. Jeżeli go zamieścimy, do pliku zostanie zapisanych maksymalnie $dlugosc znaków. Zależnie od trybu otwarcia, zawartość zostanie dopisana na końcu pliku, lub nadpisze istniejącą treść. Jest ona równoważna z instrukcją fputs().

// otwieramy plik w trybie umożliwiającym zapis na końcu pliku
$plik=fopen("plik.txt", "a") or die("Nie udało się utworzyć pliku");

// przypisanie zawartości do zmiennej 
$zawartosc = "Przykładowa treść, którą umieścimy w pliku."; 
fwrite($plik, $zawartosc) or die("Nie udało się zapisać danych w pliku"); 

Poniżej przykład z użyciem limitu znaków:

// otwieramy plik w trybie umożliwiającym zapis na końcu pliku
$plik=fopen("plik.txt", "a") or die("Nie udało się utworzyć pliku");

// przypisanie zawartości do zmiennej 
$zawartosc = "Przykładowa treść, którą umieścimy w pliku. "; 
// zwróć uwagę jak łączymy zmienne z treścią do zapisania w pliku
$zawartosc .= "Utniemy ciąg po 30 znakach."; 
fwrite($plik, $zawartosc, 30) or die("Nie udało się zapisać danych w pliku"); 

ODCZYTYWANIE PLIKU

Istnieje kilka sposobów na odczytanie zawartości pliku.

fread($uchwyt, $długość)

Funkcja  czyta z pliku określoną długość znaków. Czytanie zakończy się, jeżeli osiągnięta zostanie $dlugość znaków, koniec pliku lub odczytanych zostanie 8192 bajtów.

Przykład:

// otwieramy plik w trybie umożliwiającym zapis na końcu pliku 
$plik=fopen("plik.txt", "r"); 
// przypisanie zawartości do zmiennej
$zawartosc = fread($plik, 8192); 
echo $zawartosc; 

fgets($uchwyt)

Innym sposobem na czytanie zawartości jest funkcja . Czyta ona jedną linię pliku, dopóki nie napotka znacznika przejścia do kolejnej linii. Żeby odczytać cały plik, wystarczy użyć pętli. W przypadku tej metody nie musimy się martwić, czy cały plik zostanie odczytany, czy przypadkiem nie przekroczyliśmy długości znaków. Funkcja feof() zwraca true, jeśli osiągnęliśmy koniec pliku. Przykład czytania pliku z użyciem fgets:

// utworzenie uchwytu do pliku 
$plik = fopen('index.html','r'); 
$zawartosc = ''; 
// przypisanie zawartości do zmiennej 
while(!feof($plik)) 
{ 
    $linia = fgets($plik); 
    $zawartosc .= $linia; 
} 
echo $zawartosc; 

fgetc($plik)

jest bardzo podobna w użyciu do fgets, z tą jednak różnicą, że czytamy po jednym znaku. Przykład niemal identyczny:

// utworzenie uchwytu do pliku 
$plik = fopen('index.html','r'); 
$zawartosc = ''; 
// przypisanie zawartości do zmiennej 
while(!feof($plik)) 
{ 
    $linia = fgetc($plik); 
    $zawartosc .= $linia; 
} 
echo $zawartosc; 

USUWANIE PLIKU

unlink(nazwa_pliku);

Przykład:

// instrukcja otwierająca plik 
$uchwyt = fopen("plik.txt", "w"); 
// usunięcie pliku 
unlink("plik.txt"); 

Nie każdy plik może zostać usunięty, wszystko zależy od odpowiednich praw dostępu.

Zadanie podsumowujące

Zapis, odczyt i usuwanie pliku zawierającego przesłane dane z formularza.

Poniższe pliki należy umieścić w jednym folderze.

index.php

<?php 

/********************************************* 
* plik zapisujący dane z formularza
*********************************************/


if(empty($_POST['pole1']) and empty($_POST['pole2'])) 
{
    // prosty formularz zawierający dwa pola 

    echo '<form action="" method="post"> <input type="text" name="pole1" style="width: 200px;" />
    <br /> <textarea name="pole2" style="width: 200px; height: 100px;"> </textarea><br /> 
    <input type="submit" value="Zapisz" /> </form>'; 

} 
else 
{ 
    $pole1 = trim($_POST['pole1']); 
    $pole2 = trim($_POST['pole2']);

    $dane = $pole1."`".$pole2."\n"; // dane pochodzące z formularza 

    $file = "baza.txt"; // przypisanie zmiennej $file nazwy pliku 

    $fp = fopen($file, "a");// uchwyt pliku, otwarcie do dopisania 

    flock($fp, 2); // blokada pliku do zapisu

    fwrite($fp, $dane); // zapisanie danych do pliku

    flock($fp, 3); // odblokowanie pliku 

    fclose($fp); // zamknięcie pliku

    echo "Dane zostały zapisane!<br />"; 
    echo "<a href=\"podglad.php\">Zobacz wpisane dane</a>"; 

}

?>

podglad.php

<?php
/*********************************************
* plik podglad.php
*********************************************/

$file = file("baza.txt"); // wczytanie zawartości pliku do tablicy

foreach($file as $value) // przechodzimy przez tablicę za pomocą pętli foreach
{
	$exp = explode("`",$value);// rozbijamy poszczególne linie na części
	echo $exp[0]."<br />".$exp[1]."<hr />";// wyświetlamy rozbity tekst
}
echo "<a href=\"index.php\">Dodaj kolejne dane </a>
<br>
<a href=\"del.php\"> Usuń plik</a>"; 

?>

del.php

<?php
// usunięcie pliku
unlink("baza.txt");

echo "<a href=\"index.php\">Dodaj dane</a><br><br>"; 
echo "Plik został usunięty";
?>