Odczyt danych
Na wstępie należy zaznaczyć, że PHP dysponuje wieloma funckcjami służącymi do odczytu plików w różny sposób, my poznamy kilka z nich.
Podczas tych zajęć posłużymy się plikami utworzonymi podczas ostatnich zajęć w ćwiczeniach 4_1_0_1 (plik dane_osobowe.txt) oraz 4_1_0_2 (plik pass.txt).
Ćwiczenie 4_2_0_1. Odczytywanie całego pliku za pomocą funkcji fread()
Zadanie polega na odczytaniu pliku dane_osobowe.txt
. Plik należy umieścić w tym samym katalogu co plik ze skryptem PHP:
<body>
<?php
if (!file_exists('dane_osobowe.txt'))
{
echo 'Nie znaleziono pliku!';
exit;
}
@$plik=fopen('dane_osobowe.txt','r');
if (!$plik)
{
echo 'Błąd podczas otwierania pliku!';
exit;
}
if (!flock($plik, LOCK_SH))
{
fclose($plik);
echo 'Błąd podczas blokowania pliku!';
exit;
}
$tekst=fread($plik, filesize('dane_osobowe.txt'));
flock($plik, LOCK_UN);
fclose($plik);
echo $tekst;
?>
</body>
-
Funkcja
file_exists()
sprawdza, czy dany plik istnieje i zwraca odpowiedniotrue
lubfalse
. -
Otwarcie pliku do odczytu następuje z parametrem
r
. -
Blokowanie pliku do odczytu z parematrem
LOCK_SH
-
Odczytujemy plik za pomocą funkcji
fread()
, w której drugi parametr określa liczbę bajtów, która zostanie odczytania. W naszym przykładzie, zastosowaliśmy funkcjęfilesize()
sprawdzającą rozmiar pliku w bajtach, tak więc zastosowanie tej funkcji jako argument funkcjifread()
, powoduje odczyt całego pliku.
Ćwiczenie 4_2_0_2. Odczytywanie zadanej długości za pomocą funkcji fread()
Zadanie polega na odczytaniu 3 bajtów pliku dane_osobowe.txt
. Plik należy umieścić w tym samym katalogu co plik ze skryptem PHP. Nie pokazuję kodu, różni się on od kodu poprzedniego ćwiczenia, tylko liczbą 3
wpisaną w miejsce funkcji filesize()
.
Ponieważ jeden bajt odpowiada jednemu znakowi, więc zostały wyświetlone 3 pierwsze znaki tekstu.
Ćwiczenie 4_2_0_3. Odczyt całego pliku z wynikiem w postaci tablicy, za pomocą funkcji file()
Funkcja ta jest bardzo prosta w zastosowaniu i bardzo użyteczna. Sama otwiera plik, odczytuje jego zawartość i zamyka po zakończeniu odczytu. Również wynik który jest tablicą wierszy, jest bardzo wygodny do dalszego przetwarzania.
Zadanie polega na odczytaniu pliku dane_osobowe.txt
.
<?php
if (!file_exists('dane_osobowe.txt'))
{
echo 'Nie znaleziono pliku!';
exit;
}
$tablica_wierszy=file('dane_osobowe.txt');
if (count($tablica_wierszy)===0)
{
echo 'Plik jest pusty!';
exit;
}
foreach($tablica_wierszy as $wiersz)
echo $wiersz.'<br />';
?>
Nasz tekst składa się tylko z jednego wiersza, więc funkcja file()
zwróciła tablicę jednoelementową.
Ćwiczenie 4_2_0_4. Odczyt pliku znak po znaku, za pomocą funkcji fgetc()
Odczytamy nasz plik dane_osobowe.txt
. Aby przekonać się, że dczyt następował znak po znaku, kolejne znaki oddzielimy przecinkami.
<?php
if (!file_exists('dane_osobowe.txt'))
{
echo 'Nie znaleziono pliku!';
exit;
}
@$plik=fopen('dane_osobowe.txt','r');
if (!$plik)
{
echo 'Błąd podczas otwierania pliku!';
exit;
}
while (!feof($plik))
{
$znak=fgetc($plik);
echo $znak.',';
}
flock($plik, LOCK_UN);
fclose($plik);
?>
Zawsze odczyt pliku odbywa się sekwencyjnie - element po elemencie. Podczas tej operacji tzw. wskaźnik pliku przesuwa się od pierwszego elementu do ostatniego. Funkcja feof($plik)
sprawdza czy wskaźnik znajduje się na końcu pliku (end of file).
Ćwiczenie 4_2_0_5. Logowanie na stronie
Wykorzytamy plik pass.txt
, który musimy unieścić w katalogu tego ćwiczenia. W tym przykładzie login to admin, natomiast hasło to admin123. Użytkownik wypełnia formularz logowania, skrypt daje odpowiedź. Formularz znajduje się w pliku formularz.php
. Dla przejrzystości kodu, należy utworzyć plik funkcje.php
, w którym zdefiniujemy własne funkcje.
Plik funkcje.php
<?php
function haslo_czytaj(&$z_pliku)
{
@$plik=fopen('pass.txt','r');
if (!$plik) return false;
if (!flock($plik, LOCK_EX))
{
fclose($plik);
return false;
}
$z_pliku=fread($plik,filesize('pass.txt'));
flock($plik, LOCK_UN);
return fclose($plik);
}
function haslo_ok($tekst, $tekst_zakodowany)
{
return md5($tekst)===$tekst_zakodowany;
}
?>
Plik formularz.php
<body>
<form action="formularz.php" method="post">
Login<input type="text" name="login" />
Hasło<input type="password" name="haslo" />
<input type="submit" name="logowanie" value="Zaloguj" />
</form>
<br />
<?php
include('funkcje.php');
if (!isset($_POST['logowanie'])) exit;
$login=$_POST['login'];
$haslo=$_POST['haslo'];
if (!haslo_czytaj($z_pliku))
{
echo 'Powtórz operację!';
exit;
}
$z_pliku_tablica=explode(' ',$z_pliku);
if (count($z_pliku_tablica)!==2)
{
echo 'Błędnie zapisany login i hasło!';
exit;
}
$login_zakodowany=$z_pliku_tablica[0];
$haslo_zakodowane=$z_pliku_tablica[1];
if (!haslo_ok($login, $login_zakodowany) || !haslo_ok($haslo, $haslo_zakodowane))
echo 'Błędny login lub hasło!';
else echo 'Jesteś zalogowany';
?>
</body>
Chyba nie ma co komentować. Jeżeli zapomniałeś co robi np. funkcja include()
, to sobie przypomnij.
Pokazany formularz jest bardzo prosty. Ciekawszy wygląd można uzyskać po zastosowaniu CSS, pokazuje to ćwiczenie 3_2_15_1 w opracowaniu podstaw HTML5