






 
Strona:
16
|
|
Kurs
PHP - cześć 4
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ę zawierają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ówi 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
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>.
Grzegorz 'Ygreg' Plebanski
ygreg@and.pl
http://ygreg.and.pl
|