Lekcje >> Podstawy PHP
Polimax

Drukarnia w Warszawie realizująca druk wizytówek, plakatów jak również fotoksiążki, fotoobrazy i fotokalendarze - z wysyłką na terenie całego kraju.

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 odpowiednio true lub false.
  • 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 funkcji fread(), 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