Podsumowanie szóstego rozdziału


Podsumowanie szóstego rozdziału

Wiesz już niemało na temat sesji, ciastek, uploadzie i wyjątkach. Podsumujmy to wszystko w jednym, dużym, praktycznym projekcie.

Napiszemy skrypt, który umożliwia zalogowanie użytkownikowi przy użyciu loginu i hasła. Po zalogowaniu będzie można wysłać plik na serwer z proponowanym hasłem reklamowym, w pliku .txt, którego rozmiar nie przekroczy 1024 bajtów. Po wysłaniu pliku, na komputerze zostanie zapisane ciastko z informacją, że jedno hasło już zostało zgłoszone. Wszystko, oczywiście, opatrzone odpowiednimi wyjątkami.

Najpierw stworzymy plik funkcje.php, w którym zdefiniujemy wszystkie potrzebne funkcje. Następnie, plik ten dołączymy do pozostałych plików, użytych w programie. Listing pliku funkcje.php przedstawia się następująco:

<?php

// funkcje.php

function zaloguj($login, $haslo)
{
  if ($login == 'admin' && $haslo == 'haslo123')
  {
    $_SESSION['zalogowany'] = strip_tags($login);
	echo 'Zalogowano poprawnie, przejdź na stronę wysyłania pliku';
	echo 'klikając <a href="wysylanie.php" >tutaj</a>.';
  }
  else
    throw new Exception('Podano błędne dane logowania');
}

function sprawdz_plik()
{
  if ($_FILES['plik']['error'] > 0)
    switch ($_FILES['plik']['error'])
    {
      case 1: {Throw new Exception('Plik jest zbyt duży');} 

      case 2: {Throw new Exception('Plik jest zbyt duży');} 

      case 3: {Throw new 
	    Exception('Plik wysłany jedynie częściowo');}

      case 4: {Throw new 
	    Exception('Wysyłanie pliku nie powiodło się.');}

      default: {Throw new 
	    Exception('Wystąpił problem podczas wysyłania.');}
    }

  if ($_FILES['plik']['type'] != 'text/plain')
    Throw new Exception('Nieprawidłowy typ pliku');

  return true;
}

function zapisz_plik($login)
{
  $lokalizacja = './hasla/haslo_'.$login.'.txt';

  if(is_uploaded_file($_FILES['plik']['tmp_name']))
    if(!move_uploaded_file($_FILES['plik']['tmp_name'], $lokalizacja))
      Throw new Exception('Nieprawidłowy typ pliku');
  else
    Throw new Exception('Nie udało się zapisać pliku.');
  return true;
}

function sprawdz_cookie()
{
  if (isset($_COOKIE['haslo_wyslane']))
    Throw new Exception('Nie można wysłać hasła więcej niż jeden raz.');
  return true;
}

function zapisz_cookie()
{
  if(!setcookie('haslo_wyslane'))
    Throw new Exception('Nie można zapisać ciasteczka.');
  return true;
}

?>

Zerknijmy po krótce na zestaw naszych funkcji. Pierwsza z nich sprawdza, czy login i hasło są prawidłowe. Zwraca wyjątek, jeżeli nie są. Następnie sprawdzamy, czy nie wystąpiły żadne błędy podczas wysyłania pliku. Struktura identyczna jak w poprzedniej lekcji, z jedną różnicą w typie pliku.

Kolejna funkcja zapisuje na dysku plik z nazwą zawierającą login wysyłającego. Ostatnie dwie tyczą się ciasteczek. Pierwsza sprawdza, czy ciastko zabezpieczające już istnieje na komputerze użytkownika. Jeśli tak, zwraca wyjątek. Druga próbuje zapisać ciasteczko. Jeśli się jej nie powiedzie, również zwraca wyjątek.

Taki zbiór używanych funkcji to solidna podstawa, na której buduje się aplikacje internetowe. Teraz trzeba wszystko zebrać do kupy. Najpierw należy umożliwić odwiedzającemu zalogowanie. Do tego potrzebny jest formularz HTML.

Plik logowanie.php prezentuje się następująco:

<?php

session_start();
require_once("funkcje.php");

?>
<html>
<head>
   <title>Logowanie</title>
</head>
<body>
<?php

  if (isset($_SESSION['zalogowany']))
  {
    echo 'Jesteś już zalogowany, przejdź na stronę wysyłania pliku';
	echo 'klikając <a href="wysylanie.php" >tutaj</a>.';
  }
  else
  {
?>
    <form action="zaloguj.php" method="post" >
    <input type="text" name="login" />
    <input type="password" name="haslo" />
    <input type="submit" value="wyślij" />
    </form>
<?php
  }
?>
</body>
</html>

Powyższy skrypt wyświetli formularz logowania jeżeli nie istnieje zmienna sesji $_SESSION[‚zalogowany’] (czyli użytkownik jeszcze się nie zalogował). Jeśli natomiast wchodzi na tę stronę już po zalogowaniu, wyświetlamy stosowny komunikat oraz link do strony wysyłania. Podane dane logowania wędrują następnie do pliku zaloguj.php, któwy wygląda następująco:

<?php

session_start();
require_once("funkcje.php");

?>
<html>
<head>
   <title>Logowanie</title>
</head>
<body>
<?php

  $login = htmlspecialchars($_POST['login']);
  $haslo = htmlspecialchars($_POST['haslo']);
  if (isset($_SESSION['zalogowany']))
  {
    echo 'Jesteś już zalogowany, przejdź na stronę wysyłania pliku';
	echo 'klikając <a href="wysylanie.php" >tutaj</a>.';
  }
  if (!empty($login) && !empty($haslo))
  {
	try
	{
	  zaloguj($_POST['login'], $_POST['haslo']);
	}
	catch (Exception $e)
    {
	  echo 'Błąd: '.$e->getMessage();
    }
  }
  else
  {
    echo 'Podano niekompletne dane do logowania.';
	echo '<a href="logowanie.php" >Powrót</a>.';
  }
?>
</body>
</html>

Na początku sprawdzamy, czy istnieje już zmienna zalogowania (podobnie jak w pliku powyżej). Jeśli tak – przekierowanie na stronę wysyłąjącą plik. Jeśli nie, sprawdzamy, czy zostały podane dane logowania oraz czy są prawidłowe. Jeśli tak, logujemy i podajemy link do wysyłania pliku. W pozostałych wypadkach wyświetlamy komunikat o niekompletnych danych.

Zostało nam jeszcze napisać wysyłanie pliku z hasłem reklamowym. Jego nazwa to wysylanie.php:

<?php

session_start();
require_once("funkcje.php");

?>
<html>
<head>
   <title>Wysyłanie hasła</title>
</head>
<body>
<?php

if (!isset($_SESSION['zalogowany']))
  {
    echo 'Jesteś niezalogowany, przejdź na stronę logowania';
	echo 'klikając <a href="logowanie.php" >tutaj</a>.';
  }
  else
  {
?>
    <form enctype="multipart/form-data" action="wyslij.php" 
		 method="post" >
<input type="hidden" name="MAX_FILE_SIZE" value="1024" />
<input type="file" name="reklama" />
<input type="submit" value="wyślij" />
</form>
<?php
  }
?>
</body>
</html>

Teraz pozostaje już tylko napisać skrypt zapisujący wysłany plik na dysku. Zajmie się tym plik wyslij.php:

<?php

session_start();
require_once("funkcje.php");

?>
<html>
<head>
   <title>Wysyłanie hasła</title>
</head>
<body>
<?php

  if (!isset($_SESSION['zalogowany']))
  {
    echo 'Jesteś niezalogowany, przejdź na stronę logowania';
	echo 'klikając <a href="logowanie.php" >tutaj</a>.';
  }
  elseif(!isset($_POST['reklama']))
  {
    echo 'Nie wybrano pliku, proszę spróbować ponownie,';
	echo 'klikając <a href="wysylanie.php" >tutaj</a>.';
  }
  else
  {
    try
    {
	  sprawdz_cookie();
      sprawdz_plik();
	  zapisz_plik();
	  zapisz_cookie();
	}
	catch (Exception $e)
	{
	  echo "Wystąpił błąd podczas wysyłania pliku,";
	  echo "jego komunikat to ".$e->getMessage();
    }
  }
?>
</body>
</html>

Powyższy skrypt działa, lecz jest bardzo łatwy w obejściu. Przedstawia jednak główny zamysł logowania i udostępniania pewnej zawartości strony jedynie zalogowanym użytkownikom. Pamiętaj, by nadać pełne prawa do katalogu hasla – w innym przypadku wysłanie pliku nie będzie możliwe.

Propozycje dalszych ćwiczeń

Właściwie, to ciężko mi coś wymyślić. Możesz pozmieniać rodzaj pliku, wielkość, dodać inne wyjątki itp. Zachęcam jednak do zerknięcia na kolejne lekcje, a z logowaniem zaczekać do zapoznania się z bazami danych.

To koniec tematów przewidzianych na rozdział szósty. W ostatnim rozdziale kursu podstawowego poznasz funkcje graficzne wbudowane w PHP. Innymi słowy – zabawa obrazkami. Zapraszam!

Spis lekcji w rozdziale szóstym

Poprzednia lekcja: Rysowanie na obrazku Propozycja dalszej lektury: Programowanie obiektowe

Kurs PHP i MySQL w formie wygodnego e-booka?

ZA DARMOPobieram kurs w formie e-booka