Część 5


HTTP Cookies

     Czasem przydatna jest możliwość zapisania jakiejś informacji na komputerze klienta. Do tego właśnie stworzony został mechanizm Cookies - skrypt może zapisać na komputerze użytkownika krótką informacje, a następnie po ponownym odwiedzeniu strony pobrać ją. W ten sposób skrypt może zidentyfikować użytkownika, który już wchodził na stronę. W tym rozdziale pokażę przykład zastosowania cookie do stworzenia licznika odwiedzin zliczającego każdą osobę tylko raz, niezależnie od tego, ile razy wyświetli stronę.

Do zapisywania cookie na komputerze klienta służy funkcja setcookie:

setcookie(name, value, expire, path, domain, secure)

     Wszystkie parametry oprócz name są opcjonalne. W tym kursie omówię tylko parametry name, value oraz expire:

     Kiedy użytkownik z zapisanym cookie otworzy stronę zawiwerającą skrypt, zostanie utworzona zmienna o nazwie takiej jak podana w parametrze name, zawierająca wartość cookie.
Przykład, tym razem zacytuję całą treść strony:

<?
$iloscWejsc++;
setcookie("iloscWejsc", $iloscWejsc);
?>
<HTML>
<BODY>
Odwiedzasz tą stronę już po raz
<?
echo($iloscWejsc);
?>
</BODY>
</HTML>

     Ten skrypt będzie zliczał kolejne wejścia danego użytkownika na stronę. Ponieważ informacja jest przechowywana na komputerze użytkownika, każdy odwiedzający stronę będzie miał oddzielny licznik. Bardzo ważne jest umieszczenie komendy setcookie przed tagiem <HTML>, ponieważ cookies są wysyłane do przeglądarki użytkownika wraz z nagłówkiem strony. Po tagu <HTML> nagłówek jest już wysłany, więc jest za późno na wysłanie cookie.


Licznik tekstowy odporny na odświeżanie

     Teraz pokażę, jak zmodyfikować licznik z poprzedniego rozdziału, aby nie naliczał kolejnych wejść tego samego użytkownika:

<?
setcookie("visited", "1", time()+3600*3);
/* wysyła cookie na komputer użytkownika */
?>

<HTML>
<BODY>
<?
if(file_exists("counter.n"))
{ /* sprawdza, czy plik istnieje */
$file=fopen("counter.n", "r"); /* otwiera plik */
flock($file, 1); /* blokuje plik */

$ile=fgets($file, 100); /* odczytuje wartość */

flock($file, 3); /* odblokowuje plik */
fclose($file); /* zamyka plik */

if($visited!="1") /* sprawdza, czy
użytkownik już odwiedzał stronę */
{
$ile++; /* zwiększa wartość
o 1 tylko po pierwszym wejściu */
}
}
else
{
$ile=1; /* jeśli plik nie istnieje, wyświetli się 1 */
}

$file=fopen("counter.n", "w"); /* otwiera plik do zapisu */
flock($file, 2); /* blokuje do zapisu */

fwrite($file, $ile); /* zapisuje wartość */

flock($file, 3); /* odblokowuje plik */
fclose($file); /* zamyka plik */

echo($ile); /* wyświetla wartość */
?>
</BODY>
</HTML>

     Skrypt wysyła do użytkownika cookie. Następnie zwiększa licznik tylko jeżeli wartość cookie nie jest równa "1".
Funkcja time() użyta w 3 parametrze funkcji setcookie zwraca aktualny czas, liczony w sekundach od 1 stycznie 1970 roku.


Obrazki w formacie GIF

     PHP zawiera funkcje służące do obsługi obrazków w formacie GIF. Do załadowania obrazka używa się funkcji ImageCreateFromGif("nazwa.pliku.gif"). Aby zapisać obrazek należy użyć funkcji ImageGif(obrazek, "nazwa.pliku.gif"). Parametr określający nazwę pliku może zostać pominięty - wtedy zawartość pliku zostanie bezpośrednio wysłana do przeglądarki. Dzieki temu mozna utworzyc skrypt 'udający' obrazek:

<?
header("Content-type: image/gif");
$image=ImageCreateFromGif("obrazek.gif");
ImageGif($image);
?>

     Użyta tutaj funkcja header służy do wysłania do przeglądarki pola nagłówka. W tym wypadku określa, że zostanie wysłany obrazek w formacie GIF. W pliku nie powinny znajdować się żadne komendy HTMLa.
     Kolejną funkcją związaną z obsługą obrazków jest ImageCreate(width, height) - tworzy ona obrazek o podanej szerokości i wysokości.

Do kopiowania fragmentów obrazków używa się funkcji magecopyresized(dst_im, src_im, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH). Jej parametry oznaczają: