Oczekiwana jest elementarna znajomość HTML i abstrakcyjnych pojęć podstaw programowania (zmienne, tablice, pętle, warunki itp.)
Do wypróbowywania skryptów niezbędne będzie stanowisko z zainstalowanym serwerem WWW i odpowiednią dla systemu dystrybucją PHP. Dla Win32 serwerem może być dołączany do instalacyjnego CD Win9x Personal Web Server (PWS); dla NT - Internet Information Server (IIS); dla systemów unixowych (w tym Linux) serwer APACHE, który również ma swoją wersję pod Win9x. Godny uwagi jest pakiet PHPDEV – kombajn w składzie Apache + PHP + MySQL + Perl + Dodatki (osiągalny pod adresem: http://www.firepages.com.au). Sam PHP osiągalny jest pod adresem http://www.php.net.
PHP (Hypertext Preprocessor) jest zagnieżdżonym w HTML językiem skryptowym działającym po stronie serwera.
Oznacza to, że:
Stanowiąc integralną część strony WWW, skrypty PHP są w użyciu wygodniejsze niż CGI, Perl, ...
Rozszerzenie w nazwach plików zawierających skrypty ustala administrator serwera WWW. Zwykle są to .PHP, czasem .PHTML.
Fragment dokumentu, który ma zastać rozpoznany przez serwer WWW jako skrypt PHP, zapisać można na 4 sposoby:
1. <?echo(„To jest postać najprostsza, na modłę SGML\n”);?> 2. <?php echo(„ta postać używana jest w połączeniu z XML\n”);?> 3. <script language="php"> echo(„czasem edytor toleruje tylko taką postać\n”); </script> 4. <%echo(„postać na modłę skryptów ASP\n”);%>
Postać trzecia zalecana jest w przypadku używania edytorów HTML nie tolerujących innej składni, (np. FrontPage).
<HTML> <HEAD> <TITLE>Piosenka o ...</TITLE> <HEAD> <BODY> <P>Jeśli wszystko pójdzie dobrze</P> <? echo("<P>Szła dzieweczka do laseczka</P>\n"); ?> <P>W oknie przeglądarki powinny być trzy akapity – jeden z „dzieweczką” :-)</P> </BODY> </HTML>
Procedura standardowa echo() powoduje wygenerowanie i umieszczenie w treści dokumentu łańcucha znaków równego co do wartości argumentowi umieszczonemu w nawiasach.
Poszczególne instrukcje skryptu oddziela się znakiem średnika. Zamknięcie sekcji skryptu: ?> jest jego ekwiwalentem.
Komentarz, czyli tekst ignorowany przez interpreter PHP oznaczany jest tak jak w języku C – parą sekwencji znaków /*, znakiem # lub // jeśli nie zajmuje wiecej niż jednej linii np:
# komentarz w jednej linii echo("Przykład pierwszy"); // to też komentarz jednoliniowy /* komentarz w dowolnej liczbie linii */
Zmienne w PHP nie wymagają deklaracji. Ich typ jest determinowany podczas pierwszego przypisania wartości. W razie potrzeby dokonywana jest konwersja typu.
Identyfikator zmiennej obowiązkowo zaczyna się znakiem $.
$a=17; $b="Liczba Avogadro"; $c=3.14; $d=0.0;
PHP obsługuje następujące typy zmiennych:
Łańcuchy znaków ujmuje się w cudzysłowy. W razie potrzeby umieszczenia w tekście niektórych znaków należy posłużyć się specjalną sekwencją:
sekwencja |
znaczenie |
\n |
koniec linii |
\r |
karetka |
\t |
tabulacja |
\\ |
backslash |
\$ |
dolar |
\" |
cudzysłów |
Wewnątrz tekstu można też użyć zdefiniowanych wcześniej zmiennych:
$a=1; $b=2; $c="plus"; $d="daje"; $e="$a $c $b $d ”.($a+$b); echo($e);
Efektem będzie napis: "1 plus 2 daje 3".
W powyższym przykładzie dokonała się konwersja typów numerycznych na łańcuchowe. Operatorem konkatenacji (dodawania łańcuchów) jest kropka
$x = 1 + "1.5"; // $x jest double (2.5) $x = 1 + "-2.2e3"; // $x jest double (-2199) $x = 1 + "ala-1.3e3"; // $x jest integer (1) $x = 1 + "ala3"; // $x jest integer (1) $x = 1 + "10 pączków"; // $x jest integer (11) $x = 1 + "10 pączków"; // $x jest integer (11) $x = "10.0 kotów" + 1; // $x jest integer (11) $x = "10.0 kotów" + 1.0; // $x jest double (11)
Utworzenie tablicy następuje po przypisaniu wartości któremuś z jej elementów:
$tablica[0]="wartość A"; $tablica[1]="wartość B"; $tablica[2]="wartość C";
Jako indeksu można użyć innej zmiennej, np.
$indeks=3; $tablica[$indeks]=27;
Dołączenie nowego elementu na końcu tablicy:
$tablica[]=200; // równoważne: $tablica[4]=200;
działanie |
operator |
dodawanie |
+ |
odejmowanie |
- |
mnożenie |
* |
dzielenie |
/ |
reszta z dzielenia |
% |
Operatorem służącym do łączenia łańcuchów jest znak kropki.
$lan1=”Cześć”; $lan2=”!!!”; $lan3=$lan1.$lan2; //$lan3=”Cześć!!!”
$a=5; # instrukcja podstawienia $b=$a+2; # $b ma wartość 7 $b=$b+3; # $b ma wartość 10 $b+=3; /* działanie równoważne z poprzednim ale zapisane w stylu języka C */ $c=$a+3*($b-$a); # bardziej złożone działanie $t=”Cześć”; # podstawienie łańcucha znaków $t=$t.”!!!”; #dołączenie łańcucha; efekt :”Cześć!!!” $t.=”!!!”; # j.w. ale w stylu języka C
$a=$b=5;
Kolejność przypisania w powyższym wyrażeniu: od prawej do lewej strony wyrażenia.
znaczenie |
operator |
równe |
== |
równe i o zgodnych
typach |
=== |
nierówne |
!= |
mniejsze |
< |
większe |
> |
większe lub równe
(nie mniejsze) |
>= |
mniejsze lub równe
(nie większe) |
<= |
Wyrażenia zawierające operatory logiczne mają wartość prawda lub fałsz.
$a==$b /*prawda gdy $a i $b są równe; odróżniać od podstawienia $a=$b (!)*/ $a>$b //prawda gdy $a jest większe od $b $a>=$b //prawda gdy $a jest większe lub równe $b $a<=$b //prawda gdy $a jest mniejsze lub równe $b $a!=$b //prawda gdy $a i $b są różne.
przykład |
znaczenie |
wynik |
++$a |
Preinkrementacja |
Zwiększa $a o 1, po czym zwraca $a. |
$a++ |
Postinkrementacja |
Zwraca $a, po czym zwiększa $a o 1. |
--$a |
Predekrementacja |
Zmniejsza $a o 1, po czym zwraca $a. |
$a-- |
Postdekrementacja |
Zwraca $a, po czym zmniejsza $a o 1. |
<? echo "<h3>Postinkrementacja</h3>"; $a = 5; echo "Powinno dać 5: ".$a++."<br>\n"; echo "Powinno dać 6: ".$a."<br>\n"; echo "<h3> Preinkrementacja </h3>"; $a = 5; echo "Powinno dać 6: ".++$a . "<br>\n"; echo "Powinno dać 6: ".$a."<br>\n"; echo "<h3> Postdekrementacja </h3>"; $a = 5; echo "Powinno dać 5: ".$a--."<br>\n"; echo "Powinno dać 4: ".$a."<br>\n"; echo "<h3> Predekrementacja </h3>"; $a = 5; echo "Powinno dać 4: ".--$a."<br>\n"; echo "Powinno dać 4: ".$a."<br>\n"; ?>
Przykład |
Znaczenie |
Wynik |
$a and $b |
logiczne “i” |
Prawda jeśli $a i $b są prawdziwe. |
$a or $b |
logiczne “lub” |
Prawda jeśli $a lub $b jest prawdziwe. |
$a xor $b |
róznica
symetryczna |
Prawda jeśli tylko $a lub tylko $b jest prawdziwe. |
! $a |
negacja |
Prawda jeśli $a jest nieprawdziwe. |
$a && $b |
jak AND |
Prawda jeśli $a i $b są prawdziwe. |
$a || $b |
jak OR |
Prawda jeśli $a lub $b jest prawdziwe. |
W sytuacji gdy istnieje potrzeba potraktowania ciagu kolejnych czynności wykonywanych przez skrypt jako jednego integralnego bloku (ekwiwawentu jednej dużej instrukcji złożonej) należy ten ciąg ująć w parę nawiasów klamrowych. Spełniają one tę sama rolę co w Pascalu słowa kluczowe Begin...End.
if (wyrażenie_logiczne) instrukcja;
if (wyrażenie_logiczne) { instrukcja1; instrukcja2; instrukcja3; }
Jeśli wyrażenie logiczne jest prawdziwe wykonywana jest instrukcja (składnia 1) lub zbiór instrukcji w nawiasach klamrowych (składnia 2) po wyrażeniu logicznym
if ($a > $b) echo("a jest większe od b"); if ($a > $b) { $lan1=”a jest”; $lan2=” większe”; $lan3=” od b!”; echo($lan1.$lan2.$lan3); }
if (wyrażenie_logiczne) { instrukcja1; } else { instrukcja2; }
Jeśli warunek nie jest spełniony (wyrażenie logiczne jest fałszywe) wykonywana jest instrukcja lub ciąg instrukcji (w klamrach) po słowie kluczowym else.
if ($a > $b) { echo(“a jest większe od b”); } else { echo(„a nie jest wieksze od b”); }
if (wyrażenie_logiczne1) { instrukcja1; instrukcja2; } elseif (wyrażenie_logiczne2) { instrukcja3; instrukcja4; } else { instrukcja5; instrukcja6 }
Jeśli wyrażenie logiczne po słowie if jest prawdziwe, wykonywane są kolejne instrukcje aż do słowa elseif; w przeciwnym wypadku sprawdzane jest wyrażenie logiczne po słowie kluczowym elseif. Jeśli jest ono prawdziwe wykonują się instrukcje zamieszczone po nim, zaś w przeciwnym wypadku wykonują się instrukcje po słowie kluczowym else.
Można wielokrotnie zagnieżdżać konstrukcję elseif.
if ($a > 10) { echo(“a jest większe od 10”); } elseif ($a>0) { echo(„a jest dodatnie i nie większe od 10”); } elseif ($a=0) { echo(„a jest zerowe”); } else { echo(„a jest ujemne”); }
while (wyrażenie_logiczne) { instrukcja1; instrukcja2; }
Jest to konstrukcja pętli z kontrolą wykonania przed cyklem. Dopóki wyrażenie logiczne po słowie while jest prawdziwe cykl instrukcji jest powtarzany. W skrajnym przypadku, jeśli warunek wykonania nie jest spełniony już na początku pętli, ani jeden cykl nie zostanie wykonany.
$i = 1; while ($i<=10) { echo($i.” wiersz<br>\n”); $i++; }
Skrypt zamieści w dokumencie 10 ponumerowanych wierszy.
do { instrukcja1; instrukcja2; } while (wyrażenie_logiczne);
Warunek powtórzenia cyklu pętli sprawdzany jest na końcu pętli. Nawet jeśli przed pętlą nie jest on spełniony to pierwszy cykl zostanie i tak wykonany.
$i = 1; do { echo($i.” wiersz<br>\n”); $i++; } while ($i<=10)
Skrypt zamieści w dokumencie 10 ponumerowanych wierszy.
for (wyr1;wyr2;wyr3) { instrukcja1; instrukcja2; }
Wyrażenie wyr1 obliczane jest bezwarunkowo i jednorazowo na początku działania instrukcji. Wyrażenie wyr2 obliczane jest na początku każdego cyklu. Cykl jest wykonywany jeśli wyr2 jest prawdziwe. W przeciwnym wypadku pętla kończy swe działanie. Wyrażenie wyr3 obliczane jest na końcu każdego cyklu.
for ($i=1;$i<=10;$i++) { echo($i.” wiersz<br>\n”); }
Skrypt zamieści w dokumencie 10 ponumerowanych wierszy.
break;
Przerywa wykonanie instrukcji if, for, while, swich.
for ($i=1;$i<=10;$i++) { echo($i.” wiersz<br>\n”); if (($x/$i)<1) break; }
switch (zmienna) { case wartość1: instrukcja1; instrukcja2; break; case wartość2: instrukcja3; instrukcja4; break; case wartość3: instrukcja5; instrukcja6; break; default: instrukcja7; instrukcja8; instrukcja9; }
Instrukcja wyboru zastępuje wielokrotne użycie instrukcji warunkowych w przypadku gdy program reagować ma indywidualnie na konkretne wartości zmiennej wyboru. Wykonywane są instrukcje po słowie kluczowym case z adekwatną wartością zmiennej. Jeśli żadna wartość nie pasuje do zmiennej, wykonywane są instrukcje po słowie kluczowym default. Zamieszczanie sekcji default nie jest obowiązkowe.
switch ($i) { case 0: echo("i równe 0"); break; case 1: echo("i równe 1"); break; case 2: echo("i równe 2"); break; default: echo(“i inne niż 0,1 i 2”); }
include(„nazwa_pliku”);
Procedura standardowa include powoduje wstawienie do dokumentu zawartości pliku o nazwie podanej jako argument procedury. Rozszerzenie w nazwie pliku nie jest istotne.
<?include(„plik.inc”);?>
Jeśli istnieje plik o nazwie „plik.inc” jego zawartość zostanie wpisana do wnętrza dokumentu w miejsce umieszczenia powyższego skryptu.
Skrypt można podzielić na części (moduły) i każdą zapisać w osobnym pliku dokonując tym samym modularyzacji kodu. W ciele dokumentu można wstawić potrzebny moduł w pożądane miejsce zamieszczając wywołanie procedury include z odpowiednią nazwą pliku jako argumentem. Pozwala to uniknąć wielokrotnego umieszczania tych samych skryptów w wielu dokumentach. W razie potrzeby, modyfikacja skryptu wykonywana jest w jednym miejscu, a nie w każdym dokumencie korzystającym z niego.
Inny sposób pożytecznego wykorzystania procedury include polega na jej użyciu do komponowania dokumentów składających się z pewnych stałych fragmentów. Jeśli wszystkie dokumenty w witrynie WWW składają się z identycznych nagłówków i stopek, a różnią się częścią środkową – wygodnie byłoby zapisać treść powtarzających się fragmentów w osobnych plikach, i składać całość dokumentu np. w następujący sposób:
<HTML> <HEAD> <TITLE>Kompozycja 12</TITLE> </HEAD> <BODY> <?include(„naglowek.inc”);?> <?include(„strona12.wew”)?> <?include(„stopka.inc”);?> </BODY> </HTML>
Przykład definicji i wywołania funkcji:
Function fun1($x, $y) //nagłówek funkcji fun1 { //ciało fukcji $x=$x/$y; echo($a);} fun1(7, 2); /*wywołanie funkcji; zmienne $a i $b wewnątrz funkcji otrzymają wartości 7 i 2 */
Nagłówek funkcji zaczyna się od słowa kluczowego Function. Po nim następuje identyfikator funkcji i w nawiasie lista parametrów formalnych oddzielonych przecinkami. Następnie w nawiasach klamrowych należy zamieścić ciąg czynności, jakie funkcja ma wykonać. W celu wywołania funkcji podaje się jej nazwę i w nawiasach listę parametrów aktualnych. Jeżeli nie przekazuje się żadnych parametrów, po identyfikatorze funkcji umieszcza się pusty nawias. Pisanie skryptów zgodnie z przesłankami programowania strukturalnego (na co składa się m.in. modularyzacja i stosowanie funkcji) zwiększa czytelność programu. Jeśli czynności realizowane przez funkcje są wielokrotnie powtarzane – użycie funkcji redukuje rozmiary skryptów.
W poniższym przykładzie wartość zmiennej $a wewnątrz funkcji (lokalnej) nie ma nic wspólnego z wartością zmiennej $a podstawioną przed funkcją.
$a=5; Function fun2() { echo($a); }
Wskutek wykonania funkcji fun2(), w dokumencie pojawi się napis zgodny z przypadkową wartością zmiennej lokalnej $a.
Jeśli zmienna $a ma być zmienną globalną, a więc jeśli ma być widoczna wewnątrz funkcji, należy użyć deklaracji global:
$a=15; Function fun3() { global $a; echo($a); } fun3();
W efekcie wykonania powyższego skryptu w dokumencie pojawi się liczba 15.
Jeżeli pierwsze przypisanie wartości do zmiennej następuje wewnątrz funkcji, to za każdym wywołaniem tej funkcji wartość zmiennej jest ustawiana od nowa:
Function fun4() { $a=12; echo($a); $a++; } fun4(); fun4();
Wykonanie skryptu wygeneruje podwójne pojawienie się identycznego zapisu. Jeżeli zmienna wewnątrz funkcji ma być inicjowana tylko raz i ma zachować swą wartość po zakończeniu działania funkcji użyć dyrektywy static:
Function fun5() { static $a=12; echo($a); $a++; } fun5(); fun5();
Tym razem w dokumencie pojawi się najpierw liczba 12, potem 13.
Funkcja może zwrócić wartość umieszczoną po słowie kluczowym return:
Function fun6($a) { return 10*$a; } $x=fun6(2); echo($x); // $x ma wartość 20
Użycie funkcji w powyższym skrypcie może mieć zwięźlejszą postać:
echo(fun(2));
Ewentualne instrukcje w funkcji zamieszczone po słowie return nie zostaną wykonane (!).
Jeśli skrypt ma obsłużyć formularz umieszczony w dokumencie HTML należy go odpowiednio przygotować.
<FORM ACTION="skrypt.php" METHOD=POST> <INPUT TYPE=TEXT NAME=pole1><BR> //pierwsze pole edycji <INPUT TYPE=TEXT NAME=pole2><BR> //drugie pole edycji <SELECT NAME=lista> //lista wyboru <OPTION VALUE=1>pozycja A</OPTION> //element listy <OPTION VALUE=2>pozycja B</OPTION> //element listy <OPTION VALUE=3>pozycja C</OPTION> //element listy </SELECT><BR> <INPUT TYPE=RADIO NAME=akcept VALUE="Tak">Tak<BR> //pierwsze pole opcyjne <INPUT TYPE=RADIO NAME=akcept VALUE="Nie">Nie<BR> //drugie pole opcyjne <INPUT TYPE=CHECKBOX NAME=zgoda >Zgoda?<BR> //pole wyboru <TEXTAREA NAME=tekst> Dłuższy tekst… </TEXTAREA><BR> <INPUT TYPE=submit VALUE="Wyślij"><BR> //przycisk “Wyślij” </FORM>
Parametr ACTION powinien identyfikować dokument ze skryptem obsługującym formularz. Parametr METHOD może mieć wartość POST lub GET. Formularze wysyłane przez GET mają ograniczoną długość, a wysyłane prametry formularza są jawnie widoczne w łańcuchu znaków stanowiącym URL generowanego przez formularz żądania. Metoda POST ukrywa wysyłane parametry i umożliwia wysyłanie praktycznie nieograniczonych ilości danych. Ważne jest zdefiowanie identyfikatorów wszystkich potrzebnych w dalszej obróbce pól formularza. Służy do tego parametr NAME. W skrypcie PHP wartości pól formularza będą dostępne jako zmienne o nazwach zgodnych z nazwami odpowiednich pól formularza. Np.:
echo($pole1."<BR>"); // wyświetlenie wartości // pierwszego pola formularza echo($pole2."<BR>"); // wyświetlenie wartości //drugiego pola formularza echo($lista."<BR>"); // wyświetlenie wartości VALUE //dla wybranego elementu z listy echo($akcept."<BR>"); if ($zgoda=="on") echo("zgoda<BR>"); else echo("niezgoda<BR>"); echo($tekst.”<BR>”);
Dla pól typu CHECKBOX wartością zmiennej będzie "on" jeżeli pole jest zaznaczone, lub zmienna będzie pusta jeżeli pole nie zostało zaznaczone. Dla pola SELECT zmienna będzie miała wartość parametru VALUE zdefiniowanego w znaczniku OPTION dla zaznaczonej pozycji w liście wyboru formularza. Dla pól typu RADIO wartość zmiennej odpowiada wartości parametru VALUE dla zaznaczonej na formularzu opcji.
Funkcja mail umożliwia wysłanie wiadomości pocztą elektroniczną. Posiada 4 parametry:
mail("jackrat@el.pcz.czest.pl", "Wiadmość testowa", "Tutaj można wpisać tresć wiadomości.");
Ten przykład wyśle wiadomość na mój adres.
Fragment strony WWW z możliwością wysyłania poczty e-mail:
<FORM ACTION=skrypt.php METHOD=POST> <INPUT TYPE=TEXT NAME=email><BR> <INPUT TYPE=TEXT NAME=temat><BR> <TEXTAREA NAME=wiadomosc> Tu wpisz wiadomość </TEXTAREA><BR> <INPUT TYPE=SUBMIT VALUE=”WYŚLIJ”> </FORM>
Skrypt, który wyśle dane pocztą:
mail($email,$temat,$tresc,"Reply-To: $email");
Funkcja mail() zwraca TRUE jeśli udało się wysłać e-mail, w przeciwnym wypadku zwraca FALSE.
Skrypt PHP odwołujący się do pliku, musi mieć odpowiednie uprawnienia. Żeby móc ze skryptu zmodyfikować jakiś plik, trzeba nadać prawo zapisu wszystkim użytkownikom. Szczególy zależne są od serwera.
Do otwarcia pliku słuzy funkcja fopen(). Posiada ona 2 parametry; są to: nazwa pliku i identyfikator trybu otwarcia. onastepujących możliwych postaciach:
Funkcja fopen() może otworzyć plik zdalny (na innym serwerze) poprzez użycie protokołu http (tylko do odczytu), lub ftp (odczyt lub zapis). fopen() zwraca zmienną identyfikującą otwarty pliku.
$file=fopen("plik.txt", "r"); //otwiera plik „plik.txt” do odczytu $file=fopen("plik.txt", "w"); /*otwiera plik do zapisu Jeżeli plik nie istnieje zostanie utworzony*/ $file=fopen("ftp://adres.serwera/plik", "r"); /*otwiera do odczytu plik przez protokół ftp*/ #przykład obsługi niepowodzenia otwarcia #pliku zdalnego przez ftp $file=fopen ("ftp://ftp.php.net/incoming/outputfile", "w"); if (!$file) { echo("<p>Nie można otworzyć zdalnego pliku do zapisu.\n"); exit; } /* przykład obsługi niepowodzenia otwarcia pliku zdalnego przez http */ $file=fopen ("http://www.php.net/", "r"); if (!$file) { echo("<p>Nie można otworzyć zdalnego pliku.\n"); exit; }
Po zakończeniu operacji na pliku, należy go zamknąć funkcją fclose():
fclose($file);
$znak=getc($file); //odczyt jednego znaku z pliku $linia=fgets($file, $dlug); //odczyt jednej linii (max $dlug znaków) $tekst=fread($file, $ile); //odczyt $ile znaków z pliku $tab=fgetcsv($f,100,","); /*odczyt do tablicy $tab (max 100) danych oddzielonych przcinkami*/
Jeśli funkcja napotka koniec pliku, zwróci wartość FALSE.
fwrite($file, $dane, $maxLen); fputs($file, $tekst);
Aby uniknąć niebezpieczeństwa jednoczesnego uruchomienia dwóch (lub więcej) skryptów modyfikujących ten sam plik należy użyć blokowania plików. Służy do tego funkcja flock() wywoływana tuż po otwarciu i przed zamknięciem pliku:
flock($file, tryb);
Parametr tryb określa typ dostępu, jaki chcemy uzyskać:
1 - dostęp do odczytu
2 - dostęp do zapisu
3 - zwolnienie blokady
Jeżeli określony rodzaj dostępu nie może być w danej chwili uzyskany, wykonanie skryptu zostanie wstrzymane do czasu, gdy będzie to możliwe. Plik powinien być blokowany na jak najkrótszy czas, aby nie wstrzymywać niepotrzebnie innych operacji.
fseek($file,n) //ustawia wskaźnik na n-tym bajcie pliku file_exists(nazwa); //sprawdza, czy istnieje plik o podanej nazwie filegroup(nazwa); //zwraca identyfikator grupy, do której należy plik fileowner(nazwa); //zwraca identyfikator właściciela pliku filesize(nazwa); //zwraca rozmiar pliku o podanej nazwie ftell($file); //zwraca pozycję w otwartym pliku is_readable(nazwa); //sprawdza, czy skrypt może odczytać plik is_writeable(nazwa); //sprawdza, czy skrypt może zapisać do pliku mkdir(nazwa); //tworzy katalog o podanej nazwie readfile(nazwa); //wyświetla zawartość pliku date(”d-m-Y”); //data w formacie dd-mm-rrrr isset($zmienna) //sprawdzenie zainicjowania zmiennej
Skrypt może wysłać na komputer użytkownika informacje (cookies) i pobierać je po ponownym odwiedzeniu strony. W ten sposób skrypt może zidentyfikować użytkownika, który już wchodził na stronę. Do zapisywania cookie na komputerze klienta służy funkcja setcookie:
setcookie(name, value, expire, path, domain, secure)
Funkcja musi być wywołana przed wysłaniem nagłówka dokumentu – czyli należy ją umieścić na samym początku dokumentu. Wszystkie parametry oprócz name są opcjonalne.
Name – nazwa ; jeżeli jest jedynym parametrem, cookie o podanej nzwie zostanie usunięte z komputera użytkownika.
Value – wartość cookie.
Expire – data, po której cookie traci ważność. Wartość zero powoduje przechowywanie cookie tylko do zakończenia działania programu przeglądarki.
Kiedy komputer z zapisanym cookie otworzy stronę zawierającą skrypt, zostanie utworzona zmienna o nazwie i wartości zgodnymi z nazwą i wartością cookie.
W poniższym przykładzie wykorzystywany jest zapis w pliku tekstowym czterech wartości. Są to oddzielone przecinkami: globalna ilość odwiedzin, data pierwszych odwiedzin, ilość odwiedzin w dniu dzisiejszym, data dzisiejsza. Funkcje licznik() i glicznik() pozwalają na wykorzystanie do wyświetlenia stanów licznika w postaci tekstowej i graficznej. Do postaci graficznej potrzebne są pliki w formacie .gif z obrazami dziesięciu cyfr, o nazwach zawierających odpowiednie cyfry, np.: A0.GIF, A1.GIF, ..., A9.GIF.
<? setcookie("visited","123",0); /*cookie wykorzystywane do zablokowania licznika przy odświeżaniu przeglądarki*/ $ip=$REMOTE_ADDR; //odczyt IP klienta $host=gethostbyaddr($ip); //odczyt nazwy hosta klienta if (file_exists("licznik.txt")) { //sprawdzenie istnienia pliku $f=fopen("licznik.txt","r"); flock($f,1); //zablokowanie pliku do odczytu $tab=fgetcsv($f,100,","); //odczyt dat i stanów licznika flock($f,3); //odblokowanie pliku fclose($f); //zamknięcie pliku if (!isset($visited)) { //sprawdzenie czy jest cookie… if ($host != “mojhost”) { //sprawdzenie czy to host autora $tab[0]++; //zwiększenie globalnego stanu licznika if ($tab[3]==date("d-m-Y")) $tab[2]++; //sprawdzenie czy ostatni zapis był dziś else { $tab[2]=1; //zainicjowanie licznika na dziś $tab[3]=date("d-m-Y"); //zapamiętanie bieżącej daty } } } } else { $tab[0]=1; //globalne zainicjowanie licznika $tab[1]=date("d-m-Y"); $tab[2]=1; $tab[3]=date("d-m-Y"); } $f=fopen("licznik.txt","w"); //otwarcie pliku do zapisu flock($f,2); fwrite($f,$tab[0].",".$tab[1].",".$tab[2].",".$tab[3]); //zapis statusu licznika flock($f,3); fclose($f); function licznik($nro) { //funkcja tekstowa global $tab; echo($tab[$nro]); } function glicznik($l,$nro) { //funkcja graficzna global $tab; $s=""; $s=$s.$tab[$nro]; for ($i=0;$i<strlen($s);$i++) echo("<img src=\"$l$s[$i].gif\">"); } ?>