30 dniowy kurs php – dzień 16 – cookies


Back-end (php, mysql)

W lekcji 11 przy pomocy formularza $_POST pobieraliśmy i wyświetlaliśmy imię użytkownika. Metoda ta ma jednak pewną wadę. Użytkownik za każdym razem musi wpisać swoje imię, aby ujrzeć spersonalizowane powitanie. Ciastka czyli cookies dają nam w tej kwestii większe pole do działania. Są to jakby zmienne, w których możemy przechowywać określoną ilość czasu dowolne wartości. Może to być imię użytkownika czy inne zazwyczaj stałe ustawienia jak np. język wyświetlania w wielojęzycznej stronie.

Rzecz jasna, jeśli mamy formularz rejestracji, możemy wszelkie preferencje użytkownika zapisywać w bazie danych. Ale dzięki ciastkom, nie potrzeba żadnej rejestracji. Wystarczy, że użytkownik raz coś wybierze, czy wpisze dane w formularzu. Dane zostaną zapisane w cookies i będą „wisiały” w pamięci przeglądarki, w której zostały ustanowione do momentu wygaśnięcia lub ich zmiany.

Przejdźmy do praktycznego rozwiązania.

<?php
// czy formularz został przesłany i czy wpisane zostało imię
if(isset($_POST['formularz']) && isset($_POST['imie']))
{
$imie = $_POST['imie'];
// ustawiamy ciastko o nazwie 'uzytkownik' z wartością $imie, ważne przez 60 sekund
setcookie('uzytkownik', $imie, time()+60);
}
?>
 
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>Cookies</title>
</head>
<body>
 
<?php
// jeśli ciastko 'uzytkownik' istnieje
if(isset($_COOKIE['uzytkownik']))
{
 // wyświetl imię z ciastka
 echo "Witaj " . $_COOKIE['uzytkownik'] . "!<br />";
}
else
{
?>
 
<!-- Formularz wykonywany na tym samym pliku -->
<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post">
Jak masz na imię? <input type="text" name="imie" />
<input type="hidden" name="formularz" value="1" />
<input type="submit" value="►" />
</form>
 
<?php
// koniec warunku jeśli ciastko istnieje
}
?>
 
</body>
</html>

setcookie()

Pojawiło się kilka nowych funkcji. Po pierwsze setcookie(). W nawiasie wpisujemy kolejno: nazwę ciastka, jego wartość, czas do kiedy ma być aktywne.

time()

Funkcja time() zwraca nam aktualny czas uniksowy podany w sekundach. Jeśli więc ciastko ma być aktywne przez minutę od jego ustanowienia musimy wpisać +60 dzięki czemu dodamy 60 sekund do aktualnego czasu. Jeśli chcielibyśmy aby ciastko było ważne przez 30 dni należałoby dodać 2592000 sekund. Zamiast obliczać za każdym razem ręcznie sekundy możemy oczywiście skorzystać z wbudowanych funkcji matematycznych php. Tym samym 30 dniową ważność ciastka możemy zapisać przy pomocy równania time()+60*60*24*30; czyli 60 sekund x 60 minut x 24 godziny x 30 dni daje nam liczbę sekund upływających w przeciągu 30 dni. Voila!

isset()

Sprawdza czy dana zmienna istnieje. Czyli czy konkretne wyrażenie ma jakąś wartość. Nas interesuje sprawdzenie, czy ciastko ‚uzytkownik’ zostało ustanowione.

$_COOKIE

Tablica podobna do $_POST i $_GET. Dane z tablicy wyciągamy zawsze w ten sam sposób podając nazwę tablicy czyli $_COOKIE i umieszczając w nawiasie kwadratowym nazwę konkretnego wpisu. U nas była to nazwa ‚uzytkownik’. Tym samym z uwagi na fakt, że są to tablice możemy wyświetlić wszystkie ich zawartości (jeśli ustawimy np. więcej plików cookie) za pomocą funkcji print_r().

$_SERVER

Kolejna nowa tablica. Przechowywane są w niej zmienne dotyczące aktualnie wykonywanego skryptu. Jak nazywa się aktualnie otwarty plik, czy jaka jest wersja przeglądarki, w której jest wykonywany. Nas w tym wypadku interesowała zmienna ‚PHP_SELF’, która zwraca nazwę pliku aktualnie wykonywanego skryptu.  Mogliśmy wpisać <form action=”index.php” method=”post”> ale później przy nazwie pliku musielibyśmy zmienić również jego nazwę w deklaracji action. Dzięki $_SERVER[‚PHP_SELF’] mamy to z głowy.

Więcej zmiennych tablicy $_SERVER znajdziesz w dokumentacji php.

WAŻNE: Pamiętaj, że php rozróżnia wielkość liter. $_COOKIE to nie to samo co $_cookie.

Usuwanie ciastek

Usuwanie odbywa się przy pomocy tej samej funkcji co ustanawianie ciastek. Różnica polega na ujemnej wartości czasowej. Zamiast dodawać do funkcji time() czas przez jaki ma być ważne po prostu go odejmujemy.

setcookie('uzytkownik', $imie, time()-3600);

Powyższy kod usunie ciastko użytkownik z ostatniej godziny.

Podsumowanie

W dzisiejszym skrypcie dane z formularza zapisaliśmy do ciastka ważnego przez 1 minutę. Ciastko jednak staje się aktywne dopiero po kolejnym załadowaniu strony od jego ustanowienia. Czyli wypełniając formularz i zatwierdzając imię ciągle widzimy formularz zamiast imiennego powitania. Trzeba odświeżyć stronę jeszcze raz aby zobaczyć efekt. Proponuję Ci zmienić długość ważności ciastka np. na godzinę (+3600 sekund). Wtedy po uruchomieniu skryptu np. za 30 min dalej zobaczysz spersonalizowane powitanie zamiast formularza.