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.

Kontrola sesji w PHP

Zacznijmy od wyjaśnienia pojęcia sesji. Wyobraźmy sobie, że mamy serwis składający się z wielu stron. Niech to będzie sklep internetowy. Jeżeli odwiedzający "wejdzie do sklepu", to tak jak w zwykłym sklepie zaczyna odwiedzać różne działy, stoiska, poszczególne kategorie towarów czy konkretne towary, otwierając różne strony. Taka wizyta w sklepie internetowym (mówiąc ogólnie w jakimś serwisie) to jest właśnie sesja. Właściwie oprogramowana, powinna się zaczynać się z chwilą pierwszego otwarcia użytkownika którejkolwiek ze stron naszego serwisu i kończyć się wraz z zamknięciem przeglądarki lub wylogowaniem się użytkownika z naszego serwisu.

Aby stworzyć koszyk na zakupy dla klienta naszego sklepu internetowego, musimy śledzić poczynania tego klienta. Jeżeli coś wrzuci do koszyka, to takie dane jak np. nazwa towaru, cena oraz ilość, muszą być pamiętane oraz powiązane z tym a nie innym klientem, podczas całej sesji - wizyty w naszym sklepie. Zwróć uwagę na to, że nasz klient otwiera różne strony naszego serwisu. Niestety HTTP jest protokołem bezstanowym co oznacza, że kiedy użytkownik żąda jednej strony a potem następnej, HTTP nie jest w stanie określić czy oba żądania pochodzą od tego samego użytkownika.

PHP udostępnia proste mechanizmy kontroli sesji.

  1. Sesja jest "rozpoznawania" dzięki unikatowemu identyfikatorowi tworzonemu na początku sesji. Funkcja session_start(), sprawdza czy identyfikator już istnieje i jeżeli nie, to go tworzy. Dobrą metodą jest umieszczanie tej funkcji na początku każdego skryptu korzystajacego z sesji. Identyfikator sesji domyślnie jest zapisywany w tak zwanym cookie(ciasteczko). Cookie, to informacja małych rozmiarów przechowywana w komputerze użytkownika. Kiedy przeglądarka łączy się z URL-em, to najpierw sprawdza lokalne cookies i jeżeli któreś jest odpowiednie dla tego URL-a, to przekazuje je serwerowi.
  2. Dane są przechowywane po stronie serwera w tablicy $_SESSION.
  3. Zamykanie sesji powinno się połączyć z działaniem przycisku Wyloguj. Wszystkie dane sesji łatwo usunąć za pomocą instrukcji $SESSION=array(). Jak widzimy, definiujemy tym sposobem od nowa tablicę $_SESSION, nadając jej zerową długość. Działaniem najbardziej radykalnym, usuwającym identyfikator sesji jest wywołanie session_destroy().

Ćwiczenie 7_0_0_1. Wykonaj stronę sklep.php, na której można wkładać do koszyka towary i sprawdzać stan koszyka

W naszej prostej witrynie będą się znajdować trzy strony: sklep.php, ksiazki.php oraz akcesoria.php. W pliku php.php zdefiniujemy funkcje.

Plik php.php:

<?php
  function poczatek_sesji()
  {
    @session_start();
    if (!isset($_SESSION['koszyk']))
    {
      $_SESSION['koszyk']=array('ksiazki'=>array(),'akcesoria'=>array());
    }
  }

  function do_koszyka($ksiazki)
  {
    if (!isset($_POST['do_koszyka'])) return;
    if (count($_POST['towary'])===0) return;
    $towary=$_POST['towary'];
    foreach($towary as $towar)
    {
      $id=(int)(substr($towar,0,6));
      $klucz_cena='cena'.$id;
      $klucz_ilosc='ile'.$id;
      if ($ksiazki)
      {
        $count=count($_SESSION['koszyk']['ksiazki']);
        $_SESSION['koszyk']['ksiazki'][$count]['opis']=substr($towar,6);
        $_SESSION['koszyk']['ksiazki'][$count]['cena']=$_POST[$klucz_cena];
        $_SESSION['koszyk']['ksiazki'][$count]['ilosc']=$_POST[$klucz_ilosc];
      }
      else
      {
        $count=count($_SESSION['koszyk']['akcesoria']);
        $_SESSION['koszyk']['akcesoria'][$count]['opis']=substr($towar,6);
        $_SESSION['koszyk']['akcesoria'][$count]['cena']=$_POST[$klucz_cena];
        $_SESSION['koszyk']['akcesoria'][$count]['ilosc']=$_POST[$klucz_ilosc];
      }
    }
  }  

  function pusty_koszyk()
  {
    if (!isset($_POST['pusty_koszyk'])) return;
    $_SESSION['koszyk']['ksiazki']=array();
    $_SESSION['koszyk']['akcesoria']=array();
    echo '<br />Koszyk jest pusty!';
  }
  
  function pokaz_koszyk()
  {
    if (!isset($_POST['pokaz_koszyk'])) return;
    $ksiazki=$_SESSION['koszyk']['ksiazki'];
    $akcesoria=$_SESSION['koszyk']['akcesoria'];
    
    echo '<br />';
    if (count($ksiazki)===0 && count($akcesoria)===0)
    {
      echo 'Koszyk jest pusty!';
      return;
    }
    
    $suma=0;
    if (count($ksiazki)>0)
    {
      echo 'Książki:<br />';
      for($k=0;$k<count($ksiazki);$k++)
      {
        $suma+=$ksiazki[$k]['cena']*$ksiazki[$k]['ilosc'];
        echo ($k+1).'. '.$ksiazki[$k]['opis'].', cena: '
            .$ksiazki[$k]['cena'].', ilość: '.$ksiazki[$k]['ilosc'].'<br />'."\n";
      }
    }
    
    if (count($akcesoria)>0)
    {
      echo '<br />Akcesoria:<br />';
      for($k=0;$k<count($akcesoria);$k++)
      {
        $suma+=$akcesoria[$k]['cena']*$akcesoria[$k]['ilosc'];
        echo ($k+1).'. '.$akcesoria[$k]['opis'].
            ', cena: '.$akcesoria[$k]['cena'].', ilość: '.$akcesoria[$k]['ilosc'].'<br />'."\n";
      }
    }
    echo '<br />Wartość towarów w koszyku: '.$suma;    
  }
?>

Plik sklep.php

<?php
  include('php.php');
  poczatek_sesji();
?>
<!doctype html>
<html>
  <head>
    <title>Testowanie skryptów PHP</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <h1>Sklep internetowy</h1>
    <p><a href="ksiazki.php">Książki</a></p>
    <p><a href="akcesoria.php">Akcesoria</a></p>
    <br />
    <form action="sklep.php" method="post">
      <input type="submit" name="pusty_koszyk"  value="Pusty koszyk" />
      <input type="submit" name="pokaz_koszyk"  value="Pokaż koszyk" />
    </form>
    <?php
      pusty_koszyk();
      pokaz_koszyk();
    ?> 
  </body>
</html>

Plik ksiazki.php

<?php
  include('php.php');
  poczatek_sesji();
?>
<!doctype html>
<html>
  <head>
    <title>Testowanie skryptów PHP</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <h1>Książki</h1>
    <p><a href="sklep.php">Sklep</a></p>
    <p><a href="akcesoria.php">Akcesoria</a></p>
    <br />
    <form action="ksiazki.php" method="post">
      <p>
        <label><input type="checkbox" name="towary[]"  
          value="000000Jak zdać egzamin, autor: Józef Nauczyciel" />
          Jak zdać egzamin, autor: Józef Nauczyciel
        </label>
        , cena<input type="text" name="cena0" value="20" style="width:30px;" />
        , ilość<input type="text" name="ile0" style="width:30px;" />
      </p>
      <p>
        <label><input type="checkbox" name="towary[]"  
          value="000001Podstawy PHP, autor: Jan Mądry" />
          Podstawy PHP, autor: Jan Mądry
        </label>
        , cena<input type="text" name="cena1" value="40" style="width:30px;" />
        , ilość<input type="text" name="ile1" style="width:30px;" />
      </p>
      <p>
        <label><input type="checkbox" name="towary[]"  
          value="000002HTML 5, autor: Piotr Programista" />
          HTML 5, autor: Piotr Programista
        </label>
        , cena<input type="text" name="cena2" value="60" style="width:30px;" />
        , lość<input type="text" name="ile2" style="width:30px;" />
      </p>
    
      <input type="submit" name="do_koszyka"  value="Do koszyka" />
      <input type="submit" name="pusty_koszyk"  value="Pusty koszyk" />
      <input type="submit" name="pokaz_koszyk"  value="Pokaż koszyk" />
    </form>
    <?php
      do_koszyka(true);
      pusty_koszyk();
      pokaz_koszyk();
    ?> 
  </body>
</html>

Plik akcesoria.php

<?php
  include('php.php');
  poczatek_sesji();
?>
<!doctype html>
<html>
  <head>
    <title>Testowanie skryptów PHP</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <h1>Akcesoria</h1>
    <p><a href="sklep.php">Sklep</a></p>
    <p><a href="ksiazki.php">Książki</a></p>
    <br />
    <form action="akcesoria.php" method="post">
      <p>
        <label><input type="checkbox" name="towary[]"  
          value="000000Płyta główna" />
          Płyta główna
        </label>
        , cena<input type="text" name="cena0" value="200" style="width:30px;" />
        , ilość<input type="text" name="ile0" style="width:30px;" />
      </p>
      <p>
        <label><input type="checkbox" name="towary[]"  
          value="000001Procesor" />
          Procesor
        </label>
        , cena<input type="text" name="cena1" value="300" style="width:30px;" />
        , ilość<input type="text" name="ile1" style="width:30px;" />
      </p>
      <p>
        <label><input type="checkbox" name="towary[]"  
          value="000002Karta graficzna" />
          Karta graficzna
        </label>
        , cena<input type="text" name="cena2" value="120" style="width:30px;" />
        , lość<input type="text" name="ile2" style="width:30px;" />
      </p>
    
      <input type="submit" name="do_koszyka"  value="Do koszyka" />
      <input type="submit" name="pusty_koszyk"  value="Pusty koszyk" />
      <input type="submit" name="pokaz_koszyk"  value="Pokaż koszyk" />
    </form>
    <?php
      do_koszyka(false);
      pusty_koszyk();
      pokaz_koszyk();
    ?> 
  </body>
</html>

Kilka uwag do pokazanego przykładu.

  • Przykład jest bardzo uproszczony, chodzi w nim o pokazanie kontrolowania sesji w PHP.
  • Przycisk Pusty koszyk usuwa z koszyka wszystkie towary.
  • Kod w plikach akcesoria.php oraz ksiażki.php jest prawie identyczny, ale mamy dwie strony z różnymi kategoriami towarów.
  • Wrzuć do koszyka kilka towarów, następnie otwórz inną stronę - ksiażki.php, akcesoria.php lub sklep.php za pomocą umieszczonych na stronach odsyłaczy. Sprawdź na każdej stronie zawartość koszyka za pomocą przycisku Pokaż koszyk. Zawartość koszyka jest zachowana, mimo zmiany strony.
  • Ponieważ nie mamy przycisku Wyloguj, to dane przechowywane w tablicy $_SESSION, znikną dopiero po ponownym otwarciu przeglądarki.
  • Jeżeli nie rozumiesz niektórych fragmentów skryptów, to poproś o wytłumaczenie prowadzącego zajęcia.