Kurs PHP - 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:
name - nazwa. Jeżeli jest jedynym parametrem, cookie o podanej nzwie zostanie usunięte
z komputera użytkownika.
value - wartość która otrzyma cookie.
expire - data do której cookie będzie przechowywane na komputerze użytkownika, wyrażona
w sekundach od 1 stycznia 1970 roku.
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ą:
dst_im - obrazek docelowy
src_im - obrazek źródłowy
dstX, dstY - współrzędne lewego górnego rogu obszarudo którego zostanie skopiowany
obrazek. Punkt (0, 0) to lewy górny róg obrazka (oś pionowa jest
numerowana z góry do dołu).
dstW, dstH - szerokość i wysokość obszaru docelowego
srcX, srcY, srcW, srcH - tak samo jak dstX, dstY, dstW i dstH dla
obszaru źródłowego.
Licznik graficzny
Dzięki tym funkcjom możliwe staje się stworzenie licznika graficznego.
Poniższy fragment kodu wymaga pliku cyfry.gif
| | if(file_exists("c"))
{
$file=fopen("c", "r");
$ile=fgets($file, 1000);
$ile++;
fclose($file);
}
else
{
$ile=1;
}
/* usunąłem blokowanie plików
i sprawdzanie przeładowań,
żeby uprościć kod */
$file=fopen("c", "w");
fwrite($file, $ile);
fclose($file);
header("Content-type:
image/gif");
/* informuje przeglądarkę, że zostanie
wysłany
obrazek w formacie GIF */
$image=ImageCreate(20*strlen($ile), 20);
/* tworzy pusty obrazek
*/
$cyfry=ImageCreateFromGif("cyfry.gif");
/* ładuje obrazek
z cyframi */
for($i=0;$i<strlen($ile);$i++)
{
ImageCopyResized($image, $cyfry, 20*$i, 0,
20*substr($ile, $i, 1),
0, 20, 20, 20, 20); /* rysuje kolejne cyfry */
}
ImageGif($image); /* wysyła przygotowany obrazek */ |
|
W skrypcie użyłem jeszcze dwóch nowych funkcji:
strlen($napis) - zwraca długość
napisu
substr($napis, $poczatek, $n) - wycina $n znaków z napisu,
zaczynając od pozycji $poczatek
Skrypt najpierw zlicza odwiedziny
tak jak liczniki tekstowe z poprzednich rozdziałów. Następnie
tworzy obrazek, na którym będą rysowane kolejne cyfry. Później ze zmiennej zawierającej
ilość odwiedzin wycina poszczególne cyfry, i kopiuje do nowego
obrazka odpowiednie fragmenty obrazka cyfry.gif. Tak otrzymany obrazek
wysyła do przeglądarki. Odwołanie do skryptu można wstawić na
stronie komendą <IMG SRC=licznik.php3>.
|