technologie internetowe server-side na przykładzie ...kolos.math.uni.lodz.pl/~archive/publikowanie...

55
Technologie internetowe server-side na przykladzie języka PHP

Upload: trinhbao

Post on 28-Feb-2019

216 views

Category:

Documents


0 download

TRANSCRIPT

Technologie internetowe server-side na przykładziejęzyka PHP

Spis treści

1 Czym jest PHP? 2

2 Co potrafi PHP? Niektóre z zalet języka. 3

3 Instalacja PHP i serwera WWW Apache 53.1 Instalacja na platformie MS Windows . . . . . . . . . . . . . . . . . . . . . . 53.2 Instalacja na platformie Linux . . . . . . . . . . . . . . . . . . . . . . . . . . 7

4 Podstawowy kurs języka PHP 84.1 Osadzanie skryptu PHP w kodzie HTML . . . . . . . . . . . . . . . . . . . . 84.2 Oddzielanie instrukcji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94.3 Komentarze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94.4 Typy danych PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104.5 Zmienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.6 Rzutowanie typów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134.7 Przypisanie wartości do zmiennych . . . . . . . . . . . . . . . . . . . . . . . 134.8 Zasięg zmiennych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.9 Zmienne zmienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.10 Testowanie i ustawianie typów zmiennych . . . . . . . . . . . . . . . . . . . . 164.11 Stałe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.12 Operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.13 Priorytety operatorów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.14 Struktury warunkowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224.15 Instrukcje iteracyjne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.16 Składnia alternatywna wyrażeń . . . . . . . . . . . . . . . . . . . . . . . . . 27

5 Tablice 285.1 Tworzenie za pomocą array() . . . . . . . . . . . . . . . . . . . . . . . . . . 285.2 Tworzenie i edytowanie składnią nawiasów kwadratowych . . . . . . . . . . . 285.3 Tablice wielowymiarowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

6 Funkcje 306.1 Argumenty funkcji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316.2 Zwracane wartości . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

7 Wielokrotne wykorzystywanie kodu 32

2

8 Zmienne spoza PHP 348.1 Predefiniowane tablice superglobalne . . . . . . . . . . . . . . . . . . . . . . 348.2 Formularze HTML (GET i POST) . . . . . . . . . . . . . . . . . . . . . . . 358.3 Ciasteczka HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388.4 Przesyłanie plików metodą POST . . . . . . . . . . . . . . . . . . . . . . . . 39

9 HTTP - obsługa protokołu 41

10 Formatowanie czasu i daty 43

11 Wysyłanie poczty elektronicznej za pomocą PHP 46

12 Obsługa zmiennych tablicowych 48

13 Funkcje do obsługi systemu plików 48

14 Łańcuchy znaków 48

15 Wyrażenia regularne 48

16 Dostęp do systemu MySQL z poziomu PHP 50

17 Obsługa sesji 50

18 Zasoby sieciowe związane z językiem PHP 53

1 Czym jest PHP?

1 Czym jest PHP?

PHP jest językiem skryptowym wykonywanym po stronie serwera. Został on zaprojektowanyspecjalnie w celu tworzenia aplikacji sieci Web. Kod PHP można umieszczać wewnątrz koduHTML i będzie on wykonywany przy każdorazowym otwarciu danej strony. Kod ten jestinterpretowany przez serwer WWW, w wyniku czego generowany jest kod HTML lub innedokumenty. Spójrzmy na następujący prosty przykład skryptu w PHP:

<html>

<head>

<title>Przykład</title>

</head>

<body>

<?php echo "Cześć! Jestem skryptem PHP!"; ?>

</body>

</html>

PHP różni się od skryptów wykonywanych po stronie klienta, takich jak np. JavaScripttym, że cały kod PHP wykonywany jest na serwerze. Jeśli mamy na serwerze skrypt podobnydo przedstawionego wyżej, klient dostanie tylko rezultat wykonania skryptu, bez możliwościstwierdzenia jak wygląda generujący go kod. W naszym przypadku będzie to:

<html>

<head>

<title>Przykład</title>

</head>

<body>

Cześć! Jestem skryptem PHP!

</body>

</html>

Można nawet skonfigurować serwer WWW, tak aby wszystkie pliki HTML były przetwarzaneprzez PHP.

Język PHP został wymyślony w roku 1995 przez Rasmusa Lerdorfa. Od tego czasu kodjęzyka był wielokrotne przepisywany i modyfikowany, w efekcie czego stał się produktemprofesjonalnym szeroko wykorzystywanym przez programistów tworzących aplikacje WWW.Według statystyk w styczniu 2001 roku język PHP był używany na blisko pięciu milionachdomen, liczba ta szybko rośnie. Strona http://www.php.net/usage.php zawiera aktualnedane na ten temat.

2

2 Co potrafi PHP? Niektóre z zalet języka.

PHP to produkt Open Source, każdy ma więc dostęp do kodu źródłowego, który możnadowolnie modyfikować i rozpowszechniać, bez ponoszenia jakichkolwiek opłat (pod warun-kiem, że również udostępnimy kod źródłowy).

Nazwa języka stanowi skrót od słów Personal Home Page, lecz zgodnie z konwencjąnazewniczą obowiązującą dla produktów GNU (GNU to skrót od słów Gnu’s Not Unix- Gnu to nie Unix - projekt bezpłatnego systemu operacyjnego, zgodnego funkcjonalnie zsystemem Unix) jest obecnie rozwijany jako PHP Hypertext Preprocessor.

2 Co potrafi PHP? Niektóre z zalet języka.

PHP jest rozwijane pod kątem pisania skryptów server-side, więc za jego pomocą możnazrobić wszystko co potrafią inne programy CGI, jak na przykład odbierać dane z formularzy,generować dynamicznie zawartość strony, lub odbierać i wysyłać ciasteczka. Ale PHP możeo wiele więcej. Do trzech głównych obszarów użytkowania skryptów PHP należą:

1. Tworzenie skryptów server-side. Jest to najbardziej tradycyjne i główne pole dzia-łania PHP. Potrzebujemy do tego trzech rzeczy: parsera PHP (plik wykonywalny CGIlub moduł serwera), serwera WWW i przeglądarki. Musimy uruchomić serwer WWWpołączony z PHP. Dane wyjściowe programów PHP możemy oglądać korzystając zprzeglądarki poprzez serwer.

2. Pisanie skryptów uruchamianych z linii poleceń. Możemy napisać skrypt PHPi uruchomić go bez serwera i przeglądarki. Potrzebujemy do tego tylko parsera PHP.Ten typ użytkowania jest idealny do uruchamiania skryptów regularnie poprzez crona(systemy Uniksowe) lub menedżer zadań (systemy Windows), lub do przetwarzaniatekstu.

3. Pisanie aplikacji client-side z interfejsem użytkownika. PHP jest prawdopodob-nie nienajlepszym językiem do pisania okienkowych aplikacji, ale jeśli bardzo dobrzeznamy PHP i chcemy skorzystać z zaawansowanych możliwości PHP w swojej apli-kacji client-side, możemy użyć pakietu PHP-GTK do pisania takich programów. ZPHP-GTK mamy także możliwość pisania aplikacji wieloplatformowych. PHP-GTKjest rozszerzeniem PHP i nie jest dostępne w głównej dystrybucji. Oficjalna witrynaPHP-GTK to http://gtk.php.net.

Najwięksi konkurenci języka PHP to Perl, Microsoft Active Server Pages (ASP),Java Server Pages (JSP) oraz Allaire Cold Fusion. W porównaniu do konkurencji, PHPposiada wiele zalet, a między innymi:

3

2 Co potrafi PHP? Niektóre z zalet języka.

• Jest wydajny. Korzystając z pojedynczego, niedrogiego serwera, można obsługiwaćmiliony "trafień" dziennie. Testy wydajności możemy znaleźć na stronie firmy ZendTechnologies (http://zend.com).

• Jest wieloplatformowy i przenośny. PHP może być użyty w większości najważ-niejszych systemów operacyjnych, takich jak Linux, wiele wariantów systemu Unix(włączając w to HP-UX, Solaris i OpenBSD), Microsoft Windows, Mac OS X, RISCOS i prawdopodobnie wiele innych. PHP w chwili obecnej obsługuje większość serwerówHTTP, włączając w to Apache, Microsoft Internet Information Server, Personal WebServer, serwery Netscape i iPlanet, Oreilly Website Pro, Caudium, Xitami, OmniHT-TPd i wiele innych. Dla większości z nich PHP dostępne jest jako moduły serwera,dla pozostałych jako program CGI. Kod przenoszony pomiędzy różnymi systemami,zazwyczaj działa prawidłowo bez jakichkolwiek modyfikacji.

• Obsługuje wiele baz danych. Jedną z najmocniejszych i najbardziej znaczącychmożliwości PHP jest obsługa wielu rodzajów baz danych. Pisane strony WWW wyko-rzystującej bazę danych jest niewiarygodnie proste. Obecnie obsługiwane są następują-ce bazy danych: Adabas D, Ingres, Oracle (OCI7 i OCI8), dBase, InterBase, Ovrimos,Empress, FrontBase, PostgreSQL, FilePro (tylko do odczytu), mSQL, Solid, Hyperwa-ve, Direct MS-SQL, Sybase, IBM DB2, MySQL, Velocis, Informix, ODBC, Unix dbm.Korzystając ze standardu ODBC (Open Database Conectivity), można się połączyć zdowolną bazą danych, do której istnieje sterownik ODBC.

• Wbudowane biblioteki. Możliwości PHP obejmują tworzenie obrazów, plików PDF,a nawet animacji Flash (używając libswf i Ming) generowanych "w locie". Możemytakże wyprowadzać na wyjście dowolne dane tekstowe, jak na przykład XHTML czydowolny inny plik XML-owy. PHP obsługuje również protokoły takie jak FTP, IMAP,SNMP, NNTP, POP3, HTTP. PHP ma niezwykle przydatne możliwości do obróbkitekstów m. in. POSIX’owe i PERL’owe wyrażenia regularne.

• Niskie koszty użytkowania i dostęp do kodu źródłowego. Jako produkt OpenSource PHP jest dostępny za darmo wraz z kodem źródłowym.

• Prosta składnia. Jest ona oparta na innych językach programowania, a w szczególno-ści na języku C i Perl. Jeśli programowaliśmy w językach wywodzących się z C, takichjak C++ czy Java, to nauka PHP nie sprawi nam kłopotu.

4

3 Instalacja PHP i serwera WWW Apache

3 Instalacja PHP i serwera WWW Apache

Po pierwsze ściągamy najnowsze pakiety dla odpowiedniej platformy z następujących witryn:

• http://httpd.apache.org/ - strona serwera Apache,

• http://www.php.net - oficjalna witryna języka PHP,

3.1 Instalacja na platformie MS Windows

Zaczynamy od instalacji serwera Apache. Instalacja nowszych wersji Apache’a ogranicza siędo kilku kliknięć myszą. Uruchamiamy instalatora i wybieramy składniki instalacji i wstępniekonfigurujemy serwer ustawiając:

• Network domain - domena sieci, jeżeli nie mamy własnej domeny ustawienia tenie mają wpływu na działanie naszego serwera i możemy wpisać dowolną nazwę np.domena.com (w naszym przypadku domena jest rozpoznana automatycznie);

• Server Name - nazwa serwera np. www.domena.com (jeśli nie ustawimy to domyślnanazwa to nazwa komputera);

• Administrators Email Address - tu możemy wpisać swój adres email, będzie onwyświetlany w podpisie serwera (server signature).

Później wybieramy sposób uruchamiania serwera, odpowiadamy czy Apache ma się urucha-miać automatycznie przy starcie systemu, czy też będziemy uruchamiać go ręcznie. Propo-nujemy start jako System Service, wtedy serwer będzie pracował w tle, bez czarnego okienkaDos. Dodatkowo będziemy mieli opcje sterowania Apache czyli start, stop i restart. Następ-nie dochodzimy do wyboru ścieżki, gdzie zainstaluje się Apache. Domyślnie Apache instalujesię C:\Program Files\Apache Group jednak możemy tę ścieżkę zmienić.

Teraz możemy sprawdzić, czy serwer został poprawnie zainstalowany. W tym celu uru-chamiamy przeglądarkę i wpisujemy w pasku adresu "localhost" lub "127.0.0.1", czylilokalny adres naszego komputera (adres pętli zwrotnej). Jeżeli instalacja przebiegła pomyśl-nie, powinniśmy zobaczyć ekran powitalny naszego serwera. Wszystkie strony, które będąobsługiwane przez nasz serwer muszą się znaleźć w katalogu

C:\Program Files\Apache Group\apache\htdocs\

bądź w folderze

C:\Program Files\Apache Group\apache\users\username

5

3 Instalacja PHP i serwera WWW Apache

(w tym drugim przypadku aby "odpalić" stronę musimy wpisać adreshttp://localhost/~username/podkatalog/nazwapliku).

Instalacja PHP. Rozpakowujemy binaria PHP do jakiegoś katalogu np. C:\php\. Porozpakowaniu musimy skopiować plik php.ini-dist do katalogu windows (C:\windows\ lubC:\winnt\) i zamienić jego nazwę na php.ini. Następnie musimy skopiować plik php4ts.dlldo katalogów C:\windows\system\ i C:\windows\system32\ to samo robimy z plikami z fol-deru C:\php\dlls\. Po skopiowaniu plików musimy zastanowić się jak chcemy zainstalowaćPHP. Mamy dwie możliwości:

• Instalację poprzez CGI.

• Instalację jako moduł serwera Apache.

Aby zainstalować PHP w serwerze Apache musimy otworzyć plik konfiguracyjny Apacha(httpd.conf) w dowolnym edytorze tekstowym i w odpowiednich sekcjach dopisać poniższelinie:

Dla instalacji jako CGI:

ScriptAlias /php/ "c:/php/"

AddType application/x-httpd-php .php .php3 .phtml

Action application/x-httpd-php "/php/php.exe"}

Dla instalacji jako modułu serwera:

LoadModule php4_module /php/sapi/php4apache.dll

ScriptAlias /php/ "c:/php/"

Action application/x-httpd-php "/php/php.exe"

AddType application/x-httpd-php .php .php3 .phtml}

To wystarczy do tego, aby serwer interpretował pliki z rozszerzeniem *.php, *.php3,*.phtml jako pliki PHP, a jeżeli chcemy, aby domyślnym plikiem katalogu był plik o nazwieindex.<nasze\_rozszerzenie> musimy dopisać jeszcze w odpowiedniej sekcji linijkę:

DirectoryIndex index.<nowe\_rozszerzenie>

Teraz pozostało nam zapisanie zmian w pliku httpd.conf i zrestartowanie serwera, abyzobaczyć, czy PHP prawidłowo interpretuje pliki i odpowiednio je parsuje. Najprostszymsposobem na sprawdzenie, czy PHP działa jest stworzenie pliku, np. test.php, w którymbędzie się znajdowała jedna linijka kodu:

<? phpinfo(); ?>

6

3 Instalacja PHP i serwera WWW Apache

Teraz otwieramy przeglądarkę i wpisujemy w pasku adresuhttp://localhost/test.php. Jeżeli wszystko jest w porządku oczom naszym ukaże sięstrona w wieloma tabelami, w których znajdować się będą informacje o zainstalowanychwersjach PHP i Apache.

3.2 Instalacja na platformie Linux

Do instalacji potrzebne są następujące narzędzia:

• gzip lub gnuzip;

• gcc i GNU make;

• źródła oprogramowania Apache i PHP;

• uprawnienia użytkownika root.

W typ przypadku zainstalujemy oprogramowanie w następujących katalogu/usr/local/apache. PHP wymaga, aby serwer Apache był już wstępnie skonfigurowany, wtym celu wykonujemy następujące polecenia:

#tar zxvf apache_x.x.x.tar.gz

#cd apache_x.x.x

#./configure --prefix=/usr/local/apache

Teraz możemy już przystąpić do instalacji PHP:

#tar zxvf php-x.x.x.tar.gz

#cd php-x.x.x

#./configure --with-mysql --with-apache=../apache_x.x.x

Następnie kompilujemy i instalujemy binaria:

#make

#make install

Ostatnim krokiem jest konfiguracja i instalacja serwera Apache:

#cd ../apache_1.3.x

#./configure --activate-module=src/modules/php4/libphp4.a

--enable-module=php4 --prefix=/usr/local/apache

#make

#make install

7

4 Podstawowy kurs języka PHP

Jeszcze musimy tylko wyedytować plik httpd.conf dopisując następujące wiersze:

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

4 Podstawowy kurs języka PHP

W tej części nauczymy się elementarnej składni języka.

4.1 Osadzanie skryptu PHP w kodzie HTML

Jeśli chcemy wstawić komendy PHP w jakimś miejscu w swoim dokumencie musimy tozasygnalizować, wchodząc w "tryb PHP" którymś ze sposobów podanych poniżej:

• Styl znaczników krótkich:

<? echo "To jest test"; ?>

• Styl XML:

<?php echo "Jeśli chcemy używać dokumentów XHTML i XML"; ?>

• Styl skryptowy(sposób przestarzały):

<script language="php">

echo ("Niektóre edytory (jak FrontPage)

nie lubią instrukcji wchodzących w ’tryb PHP’");

</script>

• Styl ASP:

<% echo ("Możemy także użyć znaczników w stylu ASP"); %>

8

4 Podstawowy kurs języka PHP

Pierwszy sposób jest dostępny tylko kiedy zostały włączone krótkie znaczniki. Można tozrobić wpisując short_open_tag on do pliku konfiguracyjnego PHP albo przy kompilacjiPHP dodając --enable-short-tags do configure.

Drugi sposób jest preferowany, zapewnia on następnej generacji XHTML-a łatwą imple-mentację w PHP.

Czwarty sposób jest dostępny tylko kiedy znaczniki ASP zostały włączone poprzez uak-tywnianie opcji konfiguracyjnej asp_tags.

4.2 Oddzielanie instrukcji

Instrukcje są oddzielane tak samo jak w C czy Perlu - należy kończyć każde wyrażenieśrednikiem. Znacznik zamykający (?>) także kończy instrukcję, więc poniższe przykłady sąrównoważne:

<?php

echo "To jest test";

?>

<?php echo "To jest test" ?>

4.3 Komentarze

PHP obsługuje komentarze w stylu C, C++ oraz komentarze używane w powłokach unikso-wych (#):

<?php

echo "To jest test"; // to jest kometarz jednoliniowy w stylu C++

/* to jest komentarz wieloliniowy

a tutaj inna komentowana linia */

echo "To jest jeszcze jeden test";

echo "Ostatni test"; # to jest kometarz w stylu shell’a

?>

Komentarze typu jednoliniowego mają zasięg do końca linii, w której się znajdują lub dokońca bloku kodu PHP, zależnie co wystąpi pierwsze.

Powinniśmy uważać by nie zagnieżdżać komentarzy w stylu C++ (szczególnie komentarzywieloliniowych), co może się stać kiedy komentujemy dłuższy blok kodu.

9

4 Podstawowy kurs języka PHP

4.4 Typy danych PHP

PHP obsługuje osiem typów:Cztery skalarne:

• boolowski (boolean),

• liczba całkowita (integer),

• liczba zmiennoprzecinkowa (float),

• łańcuch znaków (string);

Dwa typy złożone:

• tablica (array),

• obiekt (object);

Oraz dwa typy specjalne:

• identyfikator zasobów (resource),

• NULL (null).

Typ boolean wyraża logiczną prawdę lub fałsz. Może mieć wartości true lub false.Ten typ najczęściej używany jest przy operatorach, które zwracają wartość typu boolean,którą następnie przekazuje się do struktur kontrolnych.

Typ integer to liczba całkowita, należąca do pewnego zbioru

Z = {-n..., -2, -1, 0, 1, 2, ...,n}.

Liczby całkowite mogą być zapisane w notacji dziesiętnej (opartej na 10), szesnastkowej(opartej na 16) lub ósemkowej (opartej na 8), opcjonalnie poprzedzone znakiem (- lub +).Aby zapisać liczbę w notacji ósemkowej, należy poprzedzić właściwą liczbę symbolem 0(zero). W notacji szesnastkowej liczbę należy poprzedzić symbolem 0x.

Liczby zmiennoprzecinkowe (typ float, double ) mogą być zapisane przy użyciudowolnej z poniższych składni:

$a = 1.234;

$a = 1.2e3;

$a = 7E-10;

10

4 Podstawowy kurs języka PHP

Maksymalna wielkość liczby zmiennoprzecinkowej jest zależna od platformy operacyjnej,zwykle jest to ±1.8e308, przy precyzji 14 liczb dziesiętnych po przecinku.

Typ string oznacza łańcuch znaków. W PHP znak jest tym sam co bajt, co oznacza, żejest możliwych 256 różnych znaków.

Uwaga! Nie ma technicznych problemów, które utrudniałyby tworzenie bardzo długich cią-gów znaków. Nie ma też ustalonej maksymalnej długości łańcuchów znaków obsługiwanychw PHP, więc nie ma powodu do obaw, że dany łańcuch jest zbyt długi.

Łańcuch znaków można utworzyć na trzy sposoby:

• przez pojedyncze cudzysłowy: ’,

• przez podwójne cudzysłowy ",

• za pomocą składni heredoc.

Najprostszym sposobem na zdefiniowanie prostego łańcucha znaków, jest umieszczenie gow pojedynczych cudzysłowach (znak ’). Aby w takim łańcuchu umieścić symbol pojedyn-czego cudzysłowu, należy go poprzedzić ukośnikiem wstecznym (\), tak jak w wielu innychjęzykach programowania. Jeśli ukośnik wsteczny ma wystąpić przed symbolem pojedynczegocudzysłowu lub na końcu łańcucha, wtedy należy napisać go dwukrotnie. W przypadku uży-cia ukośnika wstecznego z innym znakiem, ukośnik też zostanie wyświetlony! Nie ma zatempotrzeby pisania ukośnika dwukrotnie w innych sytuacjach.

Uwaga! W przeciwieństwie do dwóch pozostałych składni, zmienne nie będą zamienionena swoje wartości, kiedy pojawią się pomiędzy pojedynczymi cudzysłowami.

Kiedy łańcuch znaków jest umieszczony pomiędzy podwójnymi cudzysłowami, PHP in-terpretuje więcej sekwencji cytowania dla znaków specjalnych:

Sekwencja Znaczenie\n nowa linia (LF lub 0x0A (10) w ASCII)\r powrót karetki (CR lub 0x0D (13) w ASCII)\t tabulacja pozioma (HT lub 0x09 (9) w ASCII)\\ odwrotny ukośnik\$ znak dolara\" cudzysłów podwójny

Tak jak w poprzedniej składni, zapisanie ukośnika wstecznego przed każdym innymiznakiem spowoduje wyświetlenie zarówno ukośnika, jak i znaku.

Ale najważniejszą właściwością podwójnych cudzysłowów jest to, że zapisane w nichzmienne zostaną zamienione na ich wartości.

11

4 Podstawowy kurs języka PHP

Jeszcze jednym sposobem na zapisanie łańcucha znaków jest użycie składni heredoc

(<<<). Po operatorze <<< powinno się umieścić identyfikator i takim samym identyfikatoremtrzeba zakończyć łańcuch znaków.

Ważne by pamiętać, że linia zawierająca identyfikator zamykający nie może zawieraćżadnych innych znaków, z wyjątkiem średnika. Znaczy to przede wszystkim, że identyfikatorzamykający nie może być wcinany, i nie może być żadnych spacji ani tabulacji przed lub zaśrednikiem.

Uwaga! Najbardziej dokuczliwym ograniczeniem jest to, że wewnątrz tego łańcucha znakównie może być znaku powrotu karetki (\r) na końcu linii, jedynie znak nowej linii (\n).Ponieważ Microsoft Windows używa jako znaku końca linii sekwencji \r\n, łańcuchy znakówzapisane w składni heredoc mogą nie działać, jeśli skrypt zostanie napisany w edytorzewindowsowym. Na szczęście większość edytorów tekstowych udostępnia możliwość zapisaniapliku w uniksowym formacie końca linii.

Składnia heredoc zachowuje się podobnie jak tekst w cudzysłowach podwójnych. W tejskładni nazwa zmiennej zamieniana jest na jej wartość, ale należy zachować ostrożność przyzapisie złożonych zmiennych razem z tekstem.

<?php

$str = <<<EOD

Przykład łańcucha znaków,

zajmującego kilka linii,

zapisanego w składni heredoc.

EOD;

Typy złożone: tablice (array) i obiekty (object) omówimy oddzielnie.Identyfikator zasobów jest specjalną zmienną, przechowywującą odnośnik do zewnętrz-

nego źródła zasobów. Identyfikatory zasobów są tworzone i wykorzystywane przez specjalnefunkcje.

Specjalna wartość NULL oznacza, że zmienna nie przechowuje żadnej wartości. NULLjest jedyną możliwą wartością typu NULL.

Uwaga! Typ NULL został wprowadzony w PHP 4. Wielkość liter słowa NULL nie gra roli.

4.5 Zmienne

Każdą zmienną w PHP zapisuje się, poprzedzając jej nazwę znakiem dolara: $. Wielkośćliter w nazwie zmiennej jest rozróżniana. Nazw zmiennych dotyczą te same reguły, co innych

12

4 Podstawowy kurs języka PHP

rodzajów nazw w PHP. Poprawna nazwa zmiennej zaczyna się od litery lub znaku podkreśle-nia: "_", po których może wystąpić dowolna ilość liter, cyfr lub znaków podkreślenia. PHP,podobnie jak jeżyk JavaScript, nie wymaga (a nawet nie obsługuje) jawnej deklaracji typówzmiennych. Typ zmiennej jest określany na podstawie kontekstu, w jakim ta zmienna jestużywana. Oznacza to m.in., że po przypisaniu łańcucha znaków do zmiennej $var, zmiennata zmienia swój typ na string. Jeśli potem zostanie jej przypisana wartość całkowita, $varzmienia swój typ na integer. Innymi słowy PHP charakteryzuje się słabą kontrola typów(weakly typed).

4.6 Rzutowanie typów

Rzutowanie typów w PHP działa mniej więcej tak jak w języku C: nazwa docelowego typuumieszczana jest w nawiasach przed nazwą zmiennej, która ma być zrzutowana.

$foo = 10; // $foo jest liczbą całkowitą

$bar = (float) $foo; // $bar jest typu float (zmiennoprzecinkowego)

W PHP mamy następujące operatory rzutowania:

• (int), (integer) - rzutowanie do liczb całkowitych,

• (bool), (boolean) - rzutowanie do typu boolowskiego,

• (float), (double), (real) - rzutowanie do liczb zmiennoprzecinkowych,

• (string) - rzutowanie do łańcucha znaków,

• (array) - rzutowanie do tablicy,

• (object) - rzutowanie do obiektu,

Uwaga! Zamiast rzutować zmienną do łańcucha znaków operatorem, można też umieścićzmienną w cudzysłowie podwójnym.

4.7 Przypisanie wartości do zmiennych

W PHP 3, przypisanie wartości zmiennych było możliwe tylko przez nadanie im wartości.Innymi słowy, jeśli przypiszemy do zmiennej jakieś wyrażenie, wartość tego wyrażenia zo-stanie skopiowana do zmiennej. Oznacza to, że po przypisaniu wartości jednej zmiennej dodrugiej, późniejsza zmiana wartości jednej z nich nie spowoduje zmiany wartości drugiej.

PHP 4 oferuje jeszcze jeden sposób przypisywania wartości do zmiennych: przypisanieprzez referencję. Oznacza to, że nowa zmienna tylko odnosi się (innymi słowy, "staje się

13

4 Podstawowy kurs języka PHP

aliasem" lub "wskazuje na") do pierwotnej zmiennej. Zmiany wykonane na nowej zmien-nej oddziałują także na pierwotną zmienną i vice versa. Ma to też takie znaczenie, że nienastępuje żadna operacja skopiowania, czyli przypisanie następuje szybciej.

Aby przypisać przez referencję, stawiamy znak ampersand (&) przed nazwą zmiennejprzypisywanej (zmiennej, od której pobieramy wartość).

$foo = "PHP"; // Przypisz wartość "PHP" do $foo.

$bar = &$foo; // Przypisz referencyjnie $foo do $bar.

Uwaga! Należy pamiętać, że tylko wyrażenia posiadające nazwę mogą być przypisane przezreferencję.

4.8 Zasięg zmiennych

Zasięg zmiennej jest zależny od miejsca, w jakim została zdefiniowana. W języku PHP wy-różnia się trzy podstawowe rodzaje zasięgu:

• Deklarowane w skrypcie zmienne globalne widziane są w całym skrypcie, lecz niewewnątrz funkcji.

• Zmienne używane wewnątrz funkcji widziane są jedynie przez tę funkcję (zmiennelokalne).

• Zmienne używane wewnątrz funkcji, lecz deklarowane jako globalne, odnoszą się dozmiennych globalnych o tych samych nazwach.

$a = 1; /* zasięg globalny */

function Test()

{

echo $a; /* odwołanie do zmiennej o zasięgu lokalnym */

}

Test();

Ten skrypt nie wyświetli niczego, ponieważ instrukcja echo odwołuje się do zmiennej lokalnej$a, której jak dotąd nie została przypisana żadna wartość.

$a = 1;

$b = 2;

function Sum(){

global $a, $b;

14

4 Podstawowy kurs języka PHP

$b = $a + $b;

}

Sum();

echo $b;

Powyższy skrypt wyświetli wynik "3". Przez zadeklarowanie wewnątrz funkcji globalnościzmiennych $a i $b, wszystkie odwołania do tych zmiennych będą odnosiły się do ich global-nych wersji. Drugim sposobem uzyskania dostępu do zmiennych globalnych wewnątrz funkcjijest użycie specjalnej, zdefiniowanej przez PHP tablicy $GLOBALS. Powyższy przykład możnazatem przepisać tak:

$a = 1;

$b = 2;

function Sum()

{

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];

}

Sum();

echo $b;

$GLOBALS jest tablicą asocjacyjną, gdzie nazwa zmiennej jest kluczem, a zawartość zmiennejwartością komórki tablicy.

Jeszcze jedną ważną rzeczą, związaną z zasięgiem zmiennych jest zmienna statyczna(static variable). Zmienna statyczna może mieć wyłącznie zasięg lokalny, ale nie traci swojejwartości, kiedy program opuści ten zasięg lokalny, w którym dana zmienna statyczna sięznajduje.

function Test(){

static $a = 0;

echo $a;

$a++;

}

Za każdym wywołaniem funkcji test, zostanie wyświetlona wartość zmiennej $a, po czymta zmienna zostanie inkrementowana. Funkcja jest bezużyteczna, gdy $a nie jest zmiennastatyczną, gdyż przy każdym jej wywołaniu zmienna $a otrzymuje wartość 0, w związku zczym funkcja stale wyświetla "0". Występująca potem inkrementacja $a++ nie ma żadnegoznaczenia, gdyż funkcja się kończy i zmienna $a znika.

15

4 Podstawowy kurs języka PHP

4.9 Zmienne zmienne

W niektórych przypadkach jest wygodne, by móc użyć zmiennej o zmiennej nazwie. To znaczyzmiennej, której nazwa może być zmieniana dynamicznie. Zwykła zmienna jest ustawianawyrażeniem jak poniżej:

$a = "witaj";

Zmienna zmienna pobiera wartość jednej zmiennej i traktuje ją jako nazwę zmiennej. Wpowyższym przykładzie, witaj może stać się nazwą zmiennej, przy użyciu dwóch znakówdolara, tzn.

$$a = "świecie";

W tym momencie dwie zmienne zostały zdefiniowane i umieszczone w drzewie symbolicznymPHP: $a zawierająca witaj i $witaj zawierająca świecie. Zatem poniższy zapis:

echo "$a ${$a}";

znaczy to samo, co:

echo "$a $witaj";

tzn. obydwa wyświetlą: witaj świecie.

Uwaga! Aby używać zmiennych zmiennych jako tablic, trzeba rozwiązać pewną niejasność.Mianowicie, jeśli napiszemy $$a[1], parser musi wiedzieć, czy chcemy użyć $a[1] jako nazwyzmiennej, czy $$a jako nazwy tablicy, której rekord [1] nas interesuje. W tym przypadkunależy zastosować odrębną składnię: ${$a[1]} dla pierwszego przypadku a ${$a}[1] dladrugiego.

4.10 Testowanie i ustawianie typów zmiennych

Dwie najważniejsze funkcje testujące typy zmiennych, to gettype() oraz settype(). Skład-nia tych funkcji jest następująca:

string gettype(mixed var)

int settype(string var, string type)

Jako argument funkcji gettype() przekazujemy zmienną. Funkcja ta określa typ owej zmien-nej, po czym zawraca łańcuch znaków, reprezentujący nazwę tego typu, lub łańcuch unknown type

(nieznany typ), w przypadku gdy zastosowano zmienną typu niestandardowego, tj. innegoniż integer, double, string, array lub object.

16

4 Podstawowy kurs języka PHP

Funkcja settype() pozwala na zmianę typu. Przekazujemy zmienną, której chcemynadać inny typ oraz łańcuch znaków reprezentujący nowy typ. Łańcuch ten musi zawie-rać jedną z przedstawionych powyżej wartości, opisujących standardowe typy PHP. Otoprzykład użycia tych funkcji:

$a = 56;

echo gettype($a)."<br>";

settype($a, "double");

echo gettype($a) ."<br>";

Przy pierwszym wywołaniu funkcji gettype(), zmienna $a jest typu integer. Po wywołaniufunkcji settype(), typ tej zmiennej zostaje zmieniony na double.

PHP oferuje również szereg funkcji pozwalających na testowanie, czy dana zmienna jestokreślonego typu. Każda z tych funkcji wymaga jako argumentu sprawdzanej zmiennej, azwraca wartość true lub false. Oto lista tych funkcji:

• is_array(),

• is_double(), is_float(), is_real() (te funkcje mogą być stosowane zamiennie),

• is_long(), is_int(), is_integer() (te funkcje mogą być stosowane zamiennie),

• is_string(),

• is_object().

W języku PHP dostępnych jest kilka funkcji, umożliwiających testowanie stanu zmiennej.Pierwszą z nich jest isset(); jej składnia jest następująca:

int isset(mixed var)

Funkcja ta pobiera jako argument nazwę zmiennej, a zwaraca wrtość true w przypadku gdyzmienna ta istnieje, lub wartość false w przeciwnym razie.

Korzystając z funkcji unset() można usunąć określoną zmienną z pamięci. Funkcja tama następującą składnię:

int unset(mixed var)

Funkcja ta "pozbywa się" zmiennej przekazanej jako argument, po czym zawraca wartośćtrue.

Kolejna funkcja testująca stan zmiennej to empty(). Sprawdza ona czy przekazana jejw argumencie zmienna istnieje i czy nie ma ona wartości pustej (null) lub zerowej. Wzależności od wyniku tego testu jest zwracana wartość true lub false. A oto składnia tejfunkcji:

17

4 Podstawowy kurs języka PHP

int empty(mixed var)

Jeśli chodzi o skrypty obsługujące formularze, to funkcja isset() zawsze powinna zwrócićwartość true - niezależnie od tego, jaką wartość wpisaliśmy do odpowiadającego tej zmiennejpola formularza (a nawet wówczas, gdy pozostawimy to pole puste). Wartość zwrócona przezfunkcję empty() będzie natomiast zależała od tego, czy do pola formularza coś wpisaliśmy(wartość false), czy też pozostało ono puste (wartość true).

Funkcje te są bardzo przydatne podczas sprawdzania, czy użytkownik wypełnił odpo-wiednie pola.

Efekt jaki uzyskujemy w wyniku rzutowania zmiennych, możemy osiągnąć również po-przez wywołanie funkcji. W języku PHP dostępne są trzy funkcje, przeznaczone do tegocelu:

int intval(mixed var)

double doubleval(mixed val)

string strval(mixed val)

Każda z tych funkcji wymaga podania jako argumentu zmiennej, którą następnie zwraca,przekonwertowaną do odpowiedniego typu.

4.11 Stałe

Stała jest identyfikatorem (nazwą) dla prostej wartości. Jak sama nazwa wskazuje, wartośćta nie może się zmieniać podczas działania skryptu. Domyślnie, przy stałych uwzględnianajest wielkość liter. Przyjęto, że stałe są pisane dużymi literami. Nazwa stałej podlega takimsamym zasadom jak każda inna w PHP. Prawidłowa nazwa stałej rozpoczyna się literą,znakiem podkreślenia (_), następnie mogą występować litery, cyfry lub znaki podkreślenia.

Możemy definiować stałe używając funkcji define():

define("STALA", "Hello world!");

define("CENA",100);

Różnice pomiędzy stałymi, a zmiennymi:

• Stałe nie mają znaku dolara $ przed nazwą;

• Stałe mogą być definiowane oraz używane wszędzie bez zważania na zasady dotyczącezakresu ich dostępności;

• Stałe nie mogą być redefiniowane i kasowane po tym jak raz zostały zdefiniowane;

• Stałe mogą zawierać tylko wartości skalarne (boolean, integer, double i string).

18

4 Podstawowy kurs języka PHP

4.12 Operatory

Podstawowym operatorem przypisania w PHP jest znak =. Oto przykład:

$ilosc = 15;

Operatorem scalania łańcuchów (konkatenacji)jest kropka .:

$a = "Witaj ";

$b = "Świecie!";

$wynik = $a . $b;

Po wykonaniu powyższego kodu w zmiennej $wynik umieszczony będzie łańcuch znakówWitaj Świecie!.

Operatory arytmetyczne:

Przykład Nazwa Opis$a + $b Dodawanie Suma $a i $b$a - $b Odejmowanie Różnica $a i $b$a * $b Mnożenie Iloczyn $a i $b$a / $b Dzielenie Iloraz $a przez $b

$a % $b Dzielenie Modulo Reszta z dzielenia $a przez $b

Złożone operatory przypisania:

Operator Składnia Operacja równoważna+= $a +=$b $a =$a + $b

-= $a -=$b $a =$a - $b

*= $a *=$b $a =$a * $b

/= $a /=$b $a =$a / $b

.= $a .=$b $a =$a . $b

%= $a %=$b $a =$a % $b

Operatory inkrementacji i dekrementacji

Przykład Nazwa Opis++$a Pre-inkrementacja Najpierw zwiększa wartość $a o jeden, potem zwraca $a

$a++ Post-inkrementacja Najpierw zwraca $a, potem zwiększa $a o jeden--$a Pre-dekrementacja Najpierw zmniejsza wartość $a o jeden, potem zwraca $a

$a-- Post-dekrementacja Najpierw zwraca $a, potem zmniejsza $a o jeden

Operatory porównania:

19

4 Podstawowy kurs języka PHP

Przykład Nazwa Opis$a == $b Równy TRUE jeśli $a jest równe $b

$a === $b Identyczny TRUE jeśli $a jest równe $b i obydwa operandysą tego samego typu (tylko w PHP 4)

$a != $b Różny TRUE jeśli $a nie jest równy $b

$a <> $b Różny TRUE jeśli $a nie jest równy $b

$a !== $b Nie identyczny TRUE jeśli $a nie jest równy $b,lub nie są tego samego typu (tylko w PHP 4)

$a < $b Mniejszy niż TRUE jeśli $a jest mniejszy od $b

$a > $b Większy niż TRUE jeśli $a jest większy od $b

$a <= $b Mniejszy lub równy TRUE jeśli $a jest mniejszy lub równy $b

$a >= $b Większy lub równy TRUE jeśli $a jest większy lub równy $b

Jeszcze jednym operatorem warunkowym jest operator "?:" (tzw. operator trójskładni-kowy, ternariusz), działający tak jak w C i wielu innych językach.

(expr1) ? (expr2) : (expr3);

Wartością wyrażenia jest expr2, jeśli expr1 jest równe true, lub expr3, jeśli expr1 jest równefalse.

Operatory logiczne:

Przykład Nazwa Opis$a and $b I TRUE jeśli zarówno $a jak i $b są TRUE$a or $b Lub TRUE jeśli $a lub $b jest TRUE$a xor $b Wyłacznie-Lub TRUE jeśli $a lub $b jest TRUE, ale nie jednocześnie

! $a Nie TRUE jeśli $a nie jest TRUE$a && $b I TRUE jeśli zarówno $a jak i $b są TRUE$a || $b Lub TRUE jeśli $a lub $b jest TRUE

Operatory or i and mają inny (niższy) priorytet niż || i && i właśnie z tego powodu wPHP są dwa różne operatory dla "lub" i "i".

Operatory bitowe:

20

4 Podstawowy kurs języka PHP

Przykład Nazwa Opis$a & $b Mnożenie bitowe Dany bit wynikowy jest równy 1 tylko jeśli

obydwa bity składowe są równe 1.$a | $b Sumowanie bitowe Dany bit wynikowy jest równy 1 jeśli co

najmniej jeden bit składowy jest równy 1.$a ^ $b Sumowanie bitowe modulo 2 Dany bit wynikowy jest równy 1 tylko jeśli

jeden z bitów składowych jest równy 1a drugi jest równy 0

~ $a Negacja bitowa Bity w zmiennej $a mające wartość 1otrzymują wartość 0 i na odwrót.

$a << $b Przesunięcie w lewo Przesuwa bity w zmiennej $a o $b krokóww lewo (każdy krok znaczy "pomnożonerazy dwa").

$a >> $b Przesunięcie w prawo Przesuwa bity w zmiennej $a o $b krokóww prawo (każdy krok znaczy "podzieloneprzez dwa").

Operator kontroli błędów. PHP obsługuje obecnie jeden operator kontroli błędów:znak małpki (at @). Jeśli znak ten zostanie postawiony przed dowolnym wyrażeniem w PHP,jakiekolwiek powiadomienia o błędach wygenerowane przez to wyrażenie zostaną pominię-te (nie będą wyświetlone). Jeśli mechanizm track_errors został włączony, jakiekolwiekpowiadomienie o błędzie zostanie zapisane do zmiennej globalnej $php_errormsg. Należyjednak pamiętać, że zawartość tej zmiennej jest nadpisywana przy każdym błędzie, więc powystąpieniu kolejnego błędu w skrypcie, informacja o poprzednim błędzie jest tracona.

Operatory wykonania polecenia systemowego. PHP posiada jeden operator wy-konania polecenia systemowego: apostrof wsteczny (‘‘ zazwyczaj tam gdzie znak tyldy ~).Zawartość apostrofu wstecznego zostanie wykonana jako polecenie systemowe. Wynik pole-cenia zostanie zwrócony (tzn. nie będzie wysłany do przeglądarki tylko będzie dostępny doprzypisania do zmiennej).

$output = ‘ls -al‘;echo "<pre>$output</pre>";

Uwaga! Operator ten nie działa kiedy safe_mode jest włączony, lub shell_exec() jestzablokowana.

4.13 Priorytety operatorów

Priorytet operatora określa, jak "silnie" operator wiąże ze sobą dwa stojące obok niego wy-rażenia. Na przykład, w wyrażeniu 1 + 5 ∗ 3, wynik wynosi 16, nie 18 ponieważ operator

21

4 Podstawowy kurs języka PHP

mnożenia (∗) ma wyższy priorytet niż operator dodawania (+). Za pomocą nawiasów możnazmieniać priorytet działań według reguł arytmetyki. Na przykład: (1 + 5) ∗ 3 jest równe18. Operatory posiadają również cechę zwaną łącznością lub powiązaniem, która decyduje okolejności obliczeń w przypadku występowania operatorów o tym samym priorytecie. Kolej-ność może być wyznaczana od lewej do prawej (operatory lewostronne), od prawej do lewej(operatory prawostronne) lub też operatory mogą być niezwiązane. Poniższa tabela zawierapriorytet operatorów, od najniższego priorytetu na górze.

Powiązanie Operatorlewe ,

lewe or

lewe xor

lewe and

prawe print

lewe = += -= *= /= .= %= &= |= ^= ~= <<= >>=

lewe ? :

lewe ||

lewe &&

lewe |

lewe ^

lewe &

bez powiązania == != === !==

bez powiązania < <= > >=

lewe << >>

lewe + - .

lewe * / %

prawe ! ~ ++ -- (int) (double) (string) (array) (object) @

prawe []

bez powiązania New

bez powiązania ()

4.14 Struktury warunkowe

ifInstrukcja if (jeżeli) jest jednym z najważniejszych mechanizmów dostępnych w wielu

językach z PHP włącznie. Pozwala na wyodrębnienie fragmentu kodu, który zostanie wy-konany pod określonym warunkiem. Instrukcja if w PHP jest bardzo podobna do swojegoodpowiednika z języka C:

22

4 Podstawowy kurs języka PHP

if (warunek) wyrażenie

Jeśli warunek jest równy TRUE wyrażenie zostanie wykonane; w przeciwnym razie zostaniepominięte.

Często potrzeba, aby więcej niż jedna instrukcja była wykonana pod przyjętym warun-kiem. Nie ma oczywiście potrzeby umieszczać każdej z tych instrukcji w osobnej strukturzeif. Zamiast tego należy zgrupować te instrukcje za pomocą instrukcji grupującej. Na przy-kład poniższy kod wyświetli a jest większe niż b, jeżeli $a jest większe niż $b, i przypiszewartość $a do $b:

if ($a > $b) {

print "a jest większe niż b";

$b = $a;

}

Instrukcje if mogą być dowolnie umieszczane wewnątrz innych instrukcji if, co zapewniaautorowi programu kompletną elastyczność przy ustalaniu warunkowego wykonywania po-szczególnych części programu.

elseCzęsto potrzeba wykonać jedną instrukcję programu, gdy pewien warunek jest spełniony,

lub inną inną, gdy ten sam warunek nie jest spełniony. Służy do tego instrukcja else. elserozszerza możliwości instrukcji if do sytuacji kiedy warunek opisany przy instrukcji if mawartość FALSE. Na przykład poniższy kod wyświetli a jest większe niż b jeżeli $a jestwiększe niż $b, lub a NIE jest większe od b w przeciwnym przypadku:

if ($a > $b)

print "a jest większe niż b";

else

print "a NIE jest większe od b";

Kod zawarty w instrukcji else wykonywany jest tylko wówczas, kiedy wyrażenie logiczneprzy instrukcji if ma wartość FALSE.

elseifInstrukcja elseif, jak sama jej nazwa wskazuje, stanowi połączenie instrukcji if i else.

Podobnie jak else rozszerza instrukcję if do sytuacji, kiedy wyrażenie logiczne stojące przyif ma wartość FALSE. Jednakże w przeciwieństwie do typowej instrukcji else, kod objęty tąinstrukcją będzie wykonany, jeśli wyrażenie logiczne stojące przy tej instrukcji będzie miałowartość TRUE. Poniższy przykład wyświetli a jest większe niż b, a jest równe b luba jest mniejsze niż b:

23

4 Podstawowy kurs języka PHP

if ($a > $b){

print "a jest większe niż b";}

elseif ($a == $b){

print "a jest równe b";}

else { print "a jest mniejsze niż b";}

Można użyć kilku instrukcji elseif w jednym bloku instrukcji if. Wykonany wtedy będzieten blok, który pierwszy będzie mieć wartość TRUE. W PHP można też napisać else if

(dwoma słowami) zamiast elseif (jednym słowem).Dana instrukcja elseif będzie wykonana tylko wówczas, jeśli wszystkie poprzedzające

ją instrukcje if i elseif w danym bloku miały wartość logiczną FALSE, a ona sama mawartość logiczną TRUE.

switchInstrukcja switch jest podobna do serii instrukcji IF z warunkiem na to samo wyrażenie.

W wielu przypadkach istnieje potrzeba porównania jednej zmiennej (lub wyrażenia) z wie-loma różnymi wartościami i wykonania różnych fragmentów kodu, w zależności od wynikuporównania tej zmiennej z różnymi wartościami. Do tego właśnie służy instrukcja switch.

switch ($i) {

case 0: print "i jest równe 0";

break;

case 1: print "i jest równe 1";

break;

case 2: print "i jest równe 2";

break;

}

Instrukcja switch jest wykonywana linia po linii (dokładnie wyrażenie po wyrażeniu). Napoczątku żaden fragment kodu nie jest wykonywany. Dopiero kiedy zostaje odnalezione wy-rażenie case, którego wartość odpowiada wyrażeniu przy instrukcji switch, PHP rozpo-czyna wykonywanie kodu od miejsca, gdzie znajduje się ta instrukcja case. PHP wykonujeinstrukcje aż do momentu kiedy blok switch się skończy, lub do momentu znalezienia in-strukcji break. Jeśli nie napiszemy instrukcji break na końcu instrukcji w danym wyrażeniucase to PHP będzie wykonywać dalej instrukcje z następnego wyrażenia case.

W instrukcji switch wartość wyrażenia jest obliczana tylko raz, a następnie jest porów-nywana z każdym z wyrażeń przy etykiecie case. Natomiast w instrukcji elseif wartośćwyrażenia jest obliczana ponownie. Dlatego, jeśli wyrażenie jest bardziej skomplikowane odzwykłego porównania, switch może być szybszy.

24

4 Podstawowy kurs języka PHP

Specjalną etykietą jest etykieta warunku domyślnego - default. Etykieta ta dotyczysytuacji, w której wyrażenie nie pasowało do wartości przy innych etykietach typu case. Winstrukcji switch ta etykieta powinna być ostatnia z listy. Na przykład:

switch ($i) {

case 0: print "i jest równe 0";

break;

case 1: print "i jest równe 1";

break;

case 2: print "i jest równe 2";

break;

default: print "i jest różne od 0, 1 i 2";

}

4.15 Instrukcje iteracyjne

whilePętla while jest najprostszym typem pętli w PHP. Zachowuje się ona identycznie jak jej

odpowiednik z języka C. Jej podstawowa forma wygląda następująco:

while (wyrażenie) instrukcja

Znaczenie instrukcji while jest bardzo proste. Nakazuje ona PHP tyle razy wykonywaćokreślone instrukcje, jak długo wyrażenie przy słowie while ma wartość TRUE. Wartość tegowyrażenia jest sprawdzana za każdym razem na początku wykonywania nowej iteracji pętli,więc jeśli jego wartość zmieni się w trakcie wykonywania instrukcji, wykonanie całej pętlinie skończy się do momentu zakończenia całej iteracji. Jedna iteracja jest to jednokrotnewykonanie wszystkich instrukcji w pętli. Jeśli wyrażenie logiczne ma wartość FALSE już nasamym początku, instrukcje wewnątrz pętli nie będą w ogóle wykonane.

$i = 1;

while ($i <= 10) {

print $i++; /* zmienna $i będzie inkrementowana po wyświetleniu

do...whilePętla do...while zachowuje się bardzo podobnie do pętli while, z wyjątkiem tego, że

wartość wyrażenia logicznego sprawdzana jest na końcu iteracji, a nie na początku. Wy-nikającą z tego główną różnicą jest to, że pierwsza iteracja w pętli do...while na pewnozostanie wykonana (gdyż wyrażenie logiczne będzie sprawdzone dopiero na koniec iteracji).

25

4 Podstawowy kurs języka PHP

Natomiast w pętli while, gdzie wyrażenie logiczne jest sprawdzane na początku iteracji,może dojść do sytuacji, że pętla w ogóle nie zostanie wykonana, jeśli to wyrażenie będziemiało wartość FALSE od początku.

$i = 0;

do {

print $i;}

while ($i>0);

Powyższa pętla zostanie wykonana tylko raz, gdyż po pierwszej iteracji, wartość wyrażenialogicznego wynosić będzie FALSE ($i nie jest większe od 0) i pętla zostanie zakończona.

forPętla for jest najbardziej skomplikowanym rodzajem pętli w PHP. Zachowuje się iden-

tycznie jak jej odpowiedniki z C. Jej składnia wygląda następująco:

for (wyrażenie1; wyrażenie2; wyrażenie3) instrukcje

wyrażenie1 jest wykonywane tylko raz, na początku pętli. Na początku każdej nowej iteracji,obliczana jest wartość logiczna wyrażenia wyrażenie2. Jeśli wynikiem obliczenia jest TRUE,to pętla kontynuuje i następuje wykonanie instrukcji umieszczonych w pętli. Jeśli jednakwyrażenie ma wartość FALSE, to wykonanie pętli zostaje przerwane. Na końcu każdej iteracjizostaje wykonane wyrażenie3.

Każde z wyrażeń może być puste. Puste wyrażenie2 oznacza, że pętla jest nieskończona(PHP interpretuje to jako wartość TRUE, podobnie jak C). Nie jest to jednak tak bezużytecz-ne, jak to się może wydawać, gdyż często stosuje się to w połączeniu z instrukcją break, cozastępuje wyrażenie2 w pętli for. Wszystkie poniższe przykłady wyświetlają liczby od 1 do10. Proszę zauważyć rozmaite odmiany składni:

/* przykład 1 */

for ($i = 1; $i <= 10; $i++) {

print $i;}

/* przykład 2 */

for ($i = 1;;$i++) {

if ($i > 10) {

break; }

print $i;}

/* przykład 3 */

$i = 1;for (;;) {

if ($i > 10) {

26

4 Podstawowy kurs języka PHP

break; }

print $i; $i++;}

/* przykład 4 */

for ($i = 1; $i <= 10; print $i, $i++);

foreachPHP 4 zawiera, czego brak w PHP 3, konstrukcję foreach, podobną do jej odpowiedników

z Perla i innych języków. Pętla ta umożliwia łatwą iterację wewnątrz tablic. Istnieją dwieskładnie tej konstrukcji, przy czym druga jest mniej ważnym, lecz użytecznym rozszerzeniempierwszej:

foreach(wyrażenie_tablicowe as $wartość) wyrażenie

foreach(wyrażenie_tablicowe as $klucz => $wartość) wyrażenie

Pierwsza odmiana iteruje wewnątrz tablicy podanej w wyrażenie_tablicowe. Przy każdejiteracji, wartość aktualnego elementu tablicy jest przypisywana do zmiennej $wartość, awewnętrzny wskaźnik tablicy jest przesuwany o jeden (więc w następnej iteracji przypisanyzostanie kolejny element tablicy). Druga odmiana działa tak samo jak pierwsza, przy czymklucz aktualnego elementu tablicy zostanie przypisany do zmiennej $klucz w każdej iteracji.

Uwaga! Kiedy rozpoczyna się wykonywanie pętli foreach, wewnętrzny wskaźnik tablicyjest automatycznie resetowany, co ustawia go na pierwszym elemencie tablicy. Oznacza to,że nie trzeba wywoływać komendy reset() przed rozpoczęciem pętli foreach.

Uwaga! Proszę także pamiętać, że konstrukcja foreach operuje na kopii tablicy, a nie naoryginale, więc położenie wskaźnika tablicy nie jest modyfikowane jak w konstrukcji each(),a zmiany dokonane na pobranym elemencie tablicy nie oddziałują na oryginalną tablicę.

breakbreak kończy wykonywanie aktualnej instrukcji for, foreach, while, do...while i

switch.continuecontinue używane jest wewnątrz instukcji pętli do przerwania wykonywania danej ite-

racji pętli i rozpoczęcia zupełnie nowej iteracji.

4.16 Składnia alternatywna wyrażeń

PHP oferuje alternatywną składnię dla niektórych struktur, a dokładnie dla: if, while, for,foreach i switch. W każdym przypadku podstawowa forma składni alternatywnej polega nazamianie nawiasu otwierającego na dwukropek (:), a nawiasu zamykającego na odpowiedniesłowo: endif;, endwhile;, endfor;, endforeach; lub endswitch;.

27

5 Tablice

5 Tablice

Tablica w PHP jest uporządkowaną mapą. Mapa jest typem, który przyporządkowuje war-tości do kluczy. Kluczami w PHP mogą być liczby całkowite nieujemne i łańcuchy znaków(tablice asocjacyjne).

5.1 Tworzenie za pomocą array()

Tablicę można utworzyć za pomocą konstrukcji językowej array(). Argumentem tej kon-strukcji są rozdzielone przecinkiem pary klucz => wartość. Klucz może być albo nieujemnąliczbą całkowitą, albo łańcuchem znaków. Jeśli pominiemy klucz, to jako klucz zostanie uży-ty najwyższy indeks całkowity +1. Jeśli nie ma w ogóle indeksu całkowitego, to klucz będziemiał wartość 0 (zero). Jeśli używamy klucza, do którego już wcześniej została przypisa-na wartość, wartość ta zostanie nadpisana. Jeśli nie użyjemy kluczy, to stworzymy tablicęindeksowaną numerycznie o pierwszym indeksie 0.

$produkty = array("Opony","Olej","Swiece");

5.2 Tworzenie i edytowanie składnią nawiasów kwadratowych

Można zmieniać istniejącą tablicę jawnie ustawiając wartości. Robi się to przez przypisaniewartości do tablicy z podaniem klucza w nawiasach kwadratowych.

$arr[klucz] = wartość;

// klucz jest albo łańcuchem znaków, albo nieujemną liczbą całkowitą

// wartość może być dowolna

// Przykład:

$a[0] = "Ryan";

$a[1] = "Scott";

$a[] = "Randall"; // możemy pomijać indeksy, PHP automatycznie je zwiększa

$a[] = "Sherie"; // tu kluczem jest 3, wyżej 2

Jeśli tablica $arr nie istnieje, zostanie stworzona. Jest to więc metoda na tworzenie tablic.Aby zmienić wartość konkretnego klucza, po prostu przypisujemy nową wartość do niego.Aby usunąć parę klucz/wartość, trzeba użyć funkcji unset().

$a = array( ’kolor’ => ’czerowny’

, ’smak’ => ’słodki’

, ’kształt’ => ’okrągły’

28

5 Tablice

, ’nazwa’ => ’jabłko’

);

// znaczy dokładnie to samo, co to:

$a[’kolor’] = ’czerwony’;

$a[’smak’] = ’słodki’;

$a[’kształt’] = ’okrągły’;

$a[’nazwa’] = ’jabłko’;

A oto przykład zastosowania instrukcji foreach do tablicy $a:

foreach($a as $klucz=>$wart)

echo ’$a[’.$klucz.’]=’.$wart.’<br>’;

Kod ten wyświetli pary $a[klucz]=wartość.

5.3 Tablice wielowymiarowe

Tablice wielowymiarowe możemy konstruować używając zagnieżdżonych konstrukcji array:

$tablica = array ( "owoce" => array ( "a" => "pomarańcza"

, "b" => "banan"

, "c" => "jabłko"

)

, "liczby" => array ( 1

, 2

, 3

, 4

, 5

, 6

)

, "dziury" => array ( "pierwsza"

, 5 => "druga"

, "trzecia"

)

);

Ten sam efekt uzyskamy za pomocą serii przypisań:

$tablica[’owoce’][’a’]=pomarancza;

$tablica[’owoce’][’b’]=banan;

29

6 Funkcje

$tablica[’owoce’][’c’]=jabłko;

$tablica[’liczby’][0]=1;

$tablica[’liczby’][1]=2;

$tablica[’liczby’][2]=3;

$tablica[’liczby’][3]=4;

$tablica[’liczby’][4]=5;

$tablica[’liczby’][5]=6;

$tablica[’dziury’][0]=pierwsza;

$tablica[’dziury’][5]=druga;

$tablica[’dziury’][6]=trzecia;

Aby wyświetlić wyżej zdefiniowaną zmienna tablicową $tablica możemy użyć zagnieżdżonejinstrukcji iteracyjnej foreach (możemy też użyć funkcji each patrz Obsługa zmiennychtablicowych):

foreach($tablica as $klucz1=>$wart1)

foreach($wart1 as $klucz2=>$wart2)

echo ’$tablica[’.$klucz1.’][’.$klucz2.’]=’.$wart2.’<br>’;

6 Funkcje

Funkcja może być zdefiniowana używając składni takiej jak poniższa:

function foo ($arg_1, $arg_2, ..., $arg_n){

echo "Przykładowa funkcja.\n";

return $retval;

}

Dowolny poprawny kod PHP może się pojawić wewnątrz funkcji, także definicje innychfunkcji i klas. W PHP 3, funkcje muszą być zdefiniowane przed odwołaniem do nich. W PHP4 nie ma takiego wymagania. PHP nie obsługuje przeciążania funkcji (function overloading),czyli deklarowania funkcji o identycznych nazwach. Nie jest także możliwe skasowanie lubprzedefiniowanie wcześniej zadeklarowanych funkcji.

Uwaga! W nazwach funkcji w języku PHP nie są rozróżniane małe i duże litery. Wywołanianazwa_funkcji(), Nazwa_Funkcji(), czy też NAZWA_FUNKCJI() są poprawne i wszystkiedadzą ten sam efekt.

30

6 Funkcje

6.1 Argumenty funkcji

Informacje mogą być przekazywane do funkcji przez listę argumentów, która jest separowanąprzecinkami listą zmiennych i/lub stałych.

Przekazywanie argumentów przez referencję. Domyślnie, argumenty funkcji sąprzekazywane przez wartość (a więc jeśli zmienisz wartość argumentu wewnątrz funkcji,nie zmieni się ona poza funkcją). Jeśli chcemy pozwolić funkcji na modyfikację swoich argu-mentów, musisz przekazać je przez referencję.

Jeśli chcemy, aby argumenty były zawsze przekazywane przez referencję, przed nazwązmiennej w definicji funkcji musimy wstawić znak ampersand (&):

function dodaj_cos_extra(&$string){

$string .= ’i coś extra.’;

}

$str = ’To jest string, ’;

dodaj_cos_extra($str);

echo $str; // wyświetla ’To jest string string, i coś extra.’

Wartości domyślne argumentów. Funkcja może definiować, podobnie jest w C++, war-tości domyślne dla argumentów skalarnych:

function robkawe ($typ = "cappucino"){

return "Robię kubek $type.\n";

}

echo robkawe ();

echo robkawe ("espresso");

Powyższy kawałek kody wyświetli:

Robię kubek cappucino.

Robię kubek espresso.

Argumenty zawierające wartości domyślne powinny być po prawej stronie tych nie zawie-rających wartości domyślnych; w przeciwnym przypadku funkcja może nie działać tak jaksię tego spodziewaliśmy. Argumenty posiadające wartości domyślne są opcjonalne, nie jestkonieczne ich podawanie. Oczywiście nie musimy pomijać wszystkich - możemy przekazaćczęść z nich, a niektóre zignorować, możemy też podać wszystkie lub wszystkie opuścić.Argumenty przypisywane są od strony lewej do prawej.

Uwaga! Nie możemy opuścić jednego z argumentów opcjonalnych, a przekazać następne!

31

7 Wielokrotne wykorzystywanie kodu

6.2 Zwracane wartości

Wartości są zwracane przy użyciu opcjonalnej instrukcji return. Może być zwracany dowolnytyp, włączając w to tablice i obiekty. Spowoduje to natychmiastowe zakończenie działaniafunkcji i przekazanie kontroli do linii, z której była wywołana.

function kwadrat ($num){

return $num * $num;

}

echo kwadrat (4); // wyświetla ’16’.

Nie można zwracać wielu wartości z funkcji, ale podobne efekty mogą być uzyskane przezzwracanie listy.

function maleLiczby(){

return array (0, 1, 2);

}

list ($zero, $jeden, $dwa) = maleLiczby();

Aby funkcja zwracała referencję, musimy użyć operatora referencji & i w deklaracji funkcji iprzy przypisywaniu zwracanej wartości do zmiennej:

function &zwrocReferencje(){

return $jakasref;

}

$nowaref =& zwrocReferencje();

7 Wielokrotne wykorzystywanie kodu

PHP posiada cztery mechanizmy służące do dołączania plików zewnętrznych: include() irequire(), require_once() i include_once(). Jako, że require_once() i include_once()są tylko pewnymi wersjami dwóch poprzednich, zaczniemy omawianie tych instrukcji odinclude() i require().

Wyrażenie include() jest zwykłą funkcją PHP, natomiast require() jest konstrukcjąjęzykową, która posiada kilka ograniczeń. W obu przypadkach po dołączeniu pliku PHPprzechodzi do trybu HTML na początku dołączanego pliku. Na końcu pliku parser wracado trybu PHP. Oznacza to, że dowolny kod zawarty w pliku dołączanym musi być otoczonyprawidłowymi znacznikami PHP (np. <?php i ?>). Instrukcje require() i include() sąidentyczne niemal w każdym szczególe, z wyjątkiem obsługi błędów. W razie niepowodzenia,

32

7 Wielokrotne wykorzystywanie kodu

include() generuje ostrzeżenie (Warning), podczas gdy require() generuje błąd krytyczny(Fatal Error). Innymi słowy, instrukcji require() używa się do wczytywania plików, któresą niezbędne do działania skryptu i w przypadku ich braku wykonywanie skryptu musi zostaćprzerwane.

Przykłady użycia require():

<?php

require ’nagłówek.php’;

require $plik;

require (’jakiś_plik.txt’);

?>

Kiedy plik zostanie wczytany instrukcją include(), zawarty w nim kod dziedziczy zasięgzmiennych po linii, w której znajdowała się instrukcja wczytania. Każda zmienna dostępnaw linii z instrukcją include() będzie dostępna we wczytywanym pliku od miejsca wczytanianaprzód.

Funkcja include() jest wykonywana za każdym jej wywołaniem i może znajdować się we-wnątrz pętli lub instrukcji warunkowych. Pozwala to warunkowo włączać pliki, lub włączaćgrupy plików przy pomocy odpowiednio skonstruowanej pętli. Funkcja include() pozwalarównież, aby dołączany plik zwracał wartość, którą można następnie przypisać do zmiennej.Przetwarzanie pliku w instrukcji include() kończy się, gdy zostanie napotkana instrukcjareturn. Wyrażenie require() różni się tym od include(), że nie wchodzi w skład konstrukcjisterujących. Oznacza to, że pliki nie mogą być warunkowo dołączane za pomocą require().Wyrażenie to jest wykonywane raz, jeżeli znajduje się w pętli lub nawet, jeżeli znajdujesię w instrukcji warunkowej, której warunek ma wartość False. Inną różnicą jest to, że pli-ki dołączane za pomocą require() nie mogą zwracać wartości. Próba zwrócenia wartości wwyrażeniu require() powoduje błąd składni. Ponieważ include() i require() są specjalny-mi konstrukcjami językowymi, muszą być umieszczone w instrukcji grupującej, aby mogłydziałać w instrukcji warunkowej:

<?php

// Ten kod jest NIEPOPRAWNY i nie zadziała zgodnie z oczekiwaniami.

if ($warunek)

include $plik;

else

include $inny;

// Natomiast ten kod jest POPRAWNY.

33

8 Zmienne spoza PHP

if ($warunek) {

include $plik;

} else {

include $inny;

}

?>

Zachowanie require_once() jest identyczne z instrukcją require() z jednym wyjąt-kiem, tzn. jeśli dany plik został już raz wczytany do tego skryptu, nie będzie wczytanyponownie. Podobnie, działanie instrukcji include_once(), jest analogiczne, tzn. jeśli danyplik został już raz do danego skryptu wczytany, nie będzie już wczytany ponownie. Wska-zuje na to nazwa instrukcji: include_once znaczy wczytaj raz. include_once() powinnobyć stosowane w przypadkach, gdzie ten sam plik może być wczytany więcej niż raz w czasiewykonywania skryptu, ale chcemy mieć pewność że będzie wczytany tylko jeden raz, abyuniknąć problemów z redefiniowaniem funkcji, nadpisaniem wartości zmiennych, itp.

Uwaga! PHP w wersji starszej niż 4.3.0, pracujące pod kontrolą systemów Windows, nieobsługują dostępu do zdalnych plików w tej funkcji, nawet jeśli dyrektywa allow_url_fopen

jest włączona.

8 Zmienne spoza PHP

Zaczniemy od omówienia zmiennych predefiniowanych, które umożliwiają dostęp do danychspoza PHP.

8.1 Predefiniowane tablice superglobalne

Począwszy od wersji 4.1.0, PHP udostępnia zestaw predefiniowanych tablic, które zawierajązmienne serwera, zmienne środowiskowe oraz zmienne użytkownika. Tablice te są dość specy-ficzne, gdyż są one automatycznie globalne, tzn. automatycznie dostępne w każdym zasięgu.Dlatego nazywa się je "autoglobalami" albo "superglobalnymi" Poniżej zestawiamy ich listę:

• $GLOBALS - Zawiera referencje do każdej ze zmiennych aktualnie dostępnych w zasięguglobalnym skryptu. Kluczami tablicy są nazwy zmiennych globalnych.

• $_SERVER - Zmienne tworzone przez serwer lub bezpośrednio powiązane ze środowi-skiem uruchomieniowym danego skryptu. Analogiczna do dawnej tablicy $HTTP_SERVER_VARS

(która jest nadal dostępna, ale uznana za przestarzałą).

34

8 Zmienne spoza PHP

• $_GET - Zmienne dostarczone do skryptu za pomocą metodą GET protokołu HTTP.Analogiczna do dawnej tablicy $HTTP_GET_VARS (która jest nadal dostępna, ale uznanaza przestarzałą).

• $_POST - Zmienne dostarczone do skryptu metodą POST protokołu HTTP. Analo-giczna do dawnej tablicy $HTTP_POST_VARS (która jest nadal dostępna, ale uznana zaprzestarzałą).

• $_COOKIE - Zmienne dostarczone do skryptu przez ciasteczka HTTP. Analogiczna dodawnej tablicy $HTTP_COOKIE_VARS (która jest nadal dostępna, ale uznana za przesta-rzałą).

• $_FILES - Zmienne dostarczone do skryptu przez przesłanie plików do serwera metodąPOST protokołu HTTP. Analogiczna do dawnej tablicy $HTTP_POST_FILES (którajest nadal dostępna, ale uznana za przestarzałą).

• $_ENV - Zmienne dostarczone do skryptu przez środowisko operacyjne. Analogiczna dodawnej tablicy $HTTP_ENV_VARS (która jest nadal dostępna, ale uznana za przestarza-łą).

• $_REQUEST - Zmienne użytkownika dostarczone do skryptu przez każdy mechanizmwejścia, przez co NIE są one godne zaufania. Uwaga: kiedy skrypt jest uruchomiony zlinii poleceń, tablica ta nie zawiera zmiennych argv i argc. Zmienne te są dostępne wtablicy $_SERVER.

• $_SESSION - Zmienne aktualnie zarejestrowane jako sesyjne. Analogiczne do dawnejtablicy $HTTP_SESSION_VARS (która jest wciąż dostępna, ale uznana za przestarzałą).

Uwaga! W PHP 4.2.0 i późniejszych, domyślne ustawienie (register_globals), które udo-stępniało predefiniowane zmienne w zasięgu globalnym, zostało zmienione. Zmienne nadcho-dzące metodą GET i POST oraz zmienne serwera domyślnie nie są już umieszczane wzasięgu globalnym. Zamiast tego umieszczane są w odpowiednich tablicach superglobalnych.

8.2 Formularze HTML (GET i POST)

Kiedy do skryptu PHP zostanie wysłany formularz, każda zmienna z tego formularza zostanieautomatycznie dostarczona do tego skryptu przez PHP. Jeśli dyrektywa track_vars jest włą-czona, to zmienne te będą umieszczone w tablicach asocjacyjnych $_POST ($HTTP_POST_VARS)(zmienne wysłane metodą POST), $_GET ($HTTP_GET_VARS) (zmienne wysłane metodą

35

8 Zmienne spoza PHP

GET), i/lub $_FILES ($HTTP_POST_FILES) (plik wysłane metodą POST), w zależnościod rodzaju zmiennych w zapytaniu.

Prosty formularz ze zmienną

<form action="foo.php" method="post">

Name: <input type="text" name="username"><br>

<input type="submit">

</form>

Kiedy powyższy formularz zostanie wysłany, wartość wprowadzona do pola tekstowegobędzie dostępna w $_POST[’username’]. Jeśli dyrektywa register_globals jest włączona,zmienna z formularza będzie także dostępna jako zmienna globalna $username.

Rozważmy bardziej złożony formularz:

<form name="formularz" action="pokaz.php" method="post"

enctype="multipart/form-data">

Imię: <input type="text" name="imie" value="" />

Nazwisko: <input type="text" name="nazwisko" value="" />

Hasło: <input type="password" name="haslo" value="" />

Weryfikacja: <input type="password" name="haslo2" value="" /><br>

Uwagi:<br>

<textarea rows="5" cols="20" name=uwagi></textarea><br>

Wybierz płec:<br>

Kobieta:<input type="radio" name="plec" value="kobietą"/><br>

Mężczyzna:<input type="radio" name="plec" value="meżczyzną"/><br>

Zainteresowania:<br>

Narty <input type="checkbox" name="zainteresowania[]" value="narty" /><br>

Muzyka <input type="checkbox" name="zainteresowania[]" value="muzyka" /> <br>

Sporty wodne <input type="checkbox" name="zainteresowania[]"

value="sporty wodne" /><br>

Zwierzęta <input type="checkbox" name="zainteresowania[]"

value="zwierzeta" /><br>

Kwiaty <input type="checkbox" name="zainteresowania[]" value="kwiaty" /><br>

Twoja grupa wiekowa:<br>

<select name="wiek" size="1">

<option value="0">Mniej niz 18 lat

<option value="1">18-24 lata

<option value="3">Wiecej niz 24 lata

36

8 Zmienne spoza PHP

</select><br>

<input type="hidden" name="MAX_FILE_SIZE" value="1000">

<input type="file" name="plik" size="50" maxlength="70" value="Szukaj"><br>

Systemy operacyjne, które znasz:<br>

<select name="systemy[]" size="5" multiple=1>

<option value="MS Windows">MS Windows

<option value="Linux">Linux

<option value="Solaris">Solaris

<option value="Mac OS">Mac OS

<option value="FreeBSD">FreeBSD

</select><br>

<input type="image" src="obrazek.jpg" name="obraz" />

<br> <input type="submit" value="Wyślij" />

</form>

A oto skrypt pokaz.php, który przetwarza powyższy formularz:

<?

$imie=$_POST[’imie’];

$nazwisko=$_POST[’nazwisko’];

if(!$nazwisko)

echo "Nie podałes nazwiska!<br>";

else

echo ’Zawartość $_POST[\’nazwisko\’] <b>’.$nazwisko.’</b><br>’;

echo "<pre>".$_POST[’uwagi’]."</pre>";

echo Jesteś.$_POST[’plec’];

$zainteresowania=$_POST[’zainteresowania’];

if ($zainteresowania){

echo "<br>Interesujesz sie nastepujacymi rzeczami:<br>";

foreach($zainteresowania as $zaint)

if ($zaint) echo $zaint."<br>";

}

else

echo "Nie masz żadnych zainteresowań?";

switch ($wiek){

case 0:echo "Masz mniej niz 18 lat<br>"; break;

case 1:echo "Masz od 18 do 24 lat<br>"; break;

37

8 Zmienne spoza PHP

case 2:echo "Masz więcej niż 24 lat<br>"; break;

default: echo "Nie wiem ile masz lat!!<br>";

}

$plik=$_FILES[’plik’];

if ($plik)

echo $_FILES[’plik’][’name’].’ ’.$_FILES[’plik’][’type’]."<br>";

if (!empty($obraz_x))

print "Współrzedne x=". $obraz_x . " y=". $obraz_y ."<br>";

echo "<br>Znasz następujące systemy operacyjne:<br>";

if ($systemy=$_POST[’systemy’])

foreach($systemy as $sys)

echo $sys."<br>";

?>

8.3 Ciasteczka HTTP

PHP bez problemu obsługuje ciasteczka HTTP. Ciasteczka są mechanizmem przechowy-wania informacji w przeglądarce klienta w celu śledzenia lub identyfikowania stałych bywal-ców strony. Ciasteczka ustawia się za pomocą funkcji setcookie(). Ciasteczka są częściąnagłówka HTTP, więc funkcja setcookie() musi być wywołana zanim jakakolwiek in-na informacja zostanie wysłana do przeglądarki. Takie samo ograniczenie dotyczy funkcjiheader(). Wszystkie ciasteczka odebrane od klienta zostaną automatycznie zamienione wzmienne PHP, podobnie jak dane odebrane metodą GET lub POST.

Funkcja setcookie() jest zdefiniowana w sposób następujący:

int setcookie( string nazwa, string wartość, int czas,

string ścieżka, string domena, int bezpieczny )

Wszystkie argumenty funkcji poza nazwą są opcjonalne. Jeżeli funkcja jest wywołana tyl-ko z nazwą, cookie o podanej nazwie jest usuwane. Dowolny z ciągów może zostać opuszczonypodając pusty ciąg (""). Dowolna wartość numeryczna może zostać opuszczona podając war-tość zero. Argument czas jest standardowym czasem z systemu Unix w postaci liczby, którąmożna uzyskać jako wynik funkcji mktime() lub time(). Parametr bezpieczny wskazuje, żecookie może być przesyłane jedynie przez połączenie bezpieczne (HTTPS).

Należy pamiętać o następujących pułapkach i częstych błędach użycia cookie:

• Ustawione cookie nie będą widoczne w skrypcie do czasu jego powtórnego załadowania.

• Przeglądarki różnie obsługują cookie. Sprawdzajmy aplikację na możliwie dużej ilościprzeglądarek.

38

8 Zmienne spoza PHP

• Każda przeglądarka przechowuje cookie niezależnie. Oznacza to, że jeżeli użytkownikobejrzy witrynę przy użyciu jednej przeglądarki i zostanie ustawione cookie, to co-okie nie będzie dostępne, jeżeli użytkownik ponownie obejrzy witrynę za pomocą innejprzeglądarki.

• Wysłane ciasteczko zastąpi wcześniejsze ciasteczko o tej nazwie, o ile ścieżka lub do-mena nie są różne.

Przykład zastosowania setcookie():

$ilosc++;

setcookie("ilosc", $ilosc, time()+3600);

setcookie("koszyk[$ilosc]", $towar, time()+3600);

8.4 Przesyłanie plików metodą POST

PHP może odbierać pliki przesyłane za pomocą formularzy i metody POST protokołu HTTP.Prosty formularz do przesyłania plików:

<form enctype="multipart/form-data" action="_URL_" method="post">

<input type="hidden" name="MAX_FILE_SIZE" value="30000" />

Wyślij plik: <input name="userfile" type="file" />

<input type="submit" value="Send File" />

</form>

Adres _URL_ w powyższym przykładzie powinien wskazywać na odpowiedni skrypt w PHP.Ukryte pole o nazwie MAX_FILE_SIZE (mierzone w bajtach) oznacza maksymalną akcepto-walną wielkość pliku. Musimy również ustawić atrybut

enctype="multipart/form-data"

w przeciwnym razie przesyłanie nie zadziała.Zmienne definiowane dla przesłanych plików różnią się w zależności od wersji PHP i

konfiguracji parsera. Tablica autoglobalna $_FILES istnieje od wersji PHP 4.1.0. Starszakonstrukcja $HTTP_POST_FILES istnieje od wersji PHP 4.0.0 (jest ciągle dostępna). Zmiennete będą zawierać pełną informację o przesłanym pliku. Rekomendowane jest użycie tablicy$_FILES, ale jeśli dyrektywa register_globals jest włączona, to zarejestrowane są odpo-wiednie zmienne globalne.

Uwaga! Dyrektywa register_globals jest domyślnie ustawiona na off od wersji PHP4.2.0.

39

8 Zmienne spoza PHP

Opiszemy zawartość tablicy $_FILES na naszym przykładzie. Zauważmy, że zamiast na-zwy userfile można użyć w atrybucie name innej zgodnej ze składnią nazwy.

• $_FILES[’userfile’][’name’] - oryginalna nazwa plików na komputerze klienta.

• $_FILES[’userfile’][’type’] - typ MIME pliku ,w przypadku gdy przeglądarkaobsługuje przesyłanie tej informacji.

• $_FILES[’userfile’][’size’] - rozmiar pliku w bajtach.

• $_FILES[’userfile’][’tmp_name’] - nazwa pliku na serwerze - umożliwia dalszeprzetwarzanie pliku przez skrypt.

• $_FILES[’userfile’][’error’] - informacje o błędach. Mogą być następujące war-tości: UPLOAD_ERR_OK lub 0 - co oznacza, że nie było błędu i plik został przesłany;UPLOAD_ERR_INI_SIZE lub 1 - przesłany plik przekracza dopuszczalny rozmiar zdefinio-wany w dyrektywie upload_max_filesize w pliku php.ini; UPLOAD_ERR_FORM_SIZElub 2 - rozmiar pliku przekracza wartość podaną w atrybucie MAX_FILE_SIZE poda-nym w formularzu HTML; UPLOAD_ERR_PARTIAL lub 3 - przesłano tylko fragment pliku;UPLOAD_ERR_NO_FILE lub 4 - żaden plik nie został przesłany.

W przypadku, gdy register_globals jest włączona w php.ini, mamy dostępne równieżzmienne globalne. W tej sytuacji $userfile_name zawiera to samo, co $_FILES[’userfile’][’name’],$userfile_type jest równa $_FILES[’userfile’][’type’] itd. z tym wyjątkiem, że zmien-na $userfile jest równa $_FILES[’userfile’][’tmp_name’].

Pliki domyślne będą przechowywane w tymczasowym katalogu serwera, chyba że podamyinną lokalizację za pomocą dyrektywy upload_tmp_dir w pliku php.ini. Można równieżustawić zmienną środowiskową TMPDIR w systemie, w którym uruchomione jest PHP.

Uwaga! PHP domyślnie ogranicza wielkość plików, jakie można przesyłać używając te-go mechanizmu, do 2 megabajtów. Ta wielkość jest ważniejsza od zmiennej formularzaMAX_FILE_SIZE. Wartość ta może być zmieniona przez ustawienie wartości upload_max_filesizew pliku php.ini, lub ustawienie odpowiedniej dyrektywy w pliku konfiguracyjnym serwera.Gdy osiągnięta zostanie graniczna wielkość pliku (zarówno ustawiona w formularzu jak iglobalne maksimum), PHP generuje błąd, przerywa przesyłanie i ustawia nazwę pliku nanone.

40

9 HTTP - obsługa protokołu

9 HTTP - obsługa protokołu

W poprzednim paragrafie omówiliśmy funkcję setcookie(). Tu bliżej omówimy pozostałefunkcje do obsługi protokołu HTTP, a mianowicie:

• header() - wysyła surowy nagłowek HTTP.

• headers_list() - zwraca listę wysłanych lub gotowych do wysłania nagłówków.

• headers_sent() - sprawdza, czy nagłówki były już wysłane.

Poniżej przedstawiamy opis funkcji header().

int header ( string treść_nagłówka [, bool zamień [, int kod_odpowiedzi_http]])

Pierwszy argument opcjonalny zamień określa, czy funkcja ma zastąpić nagłówek tego same-go typu przygotowany przez serwer, czy dodać jeszcze jeden. Domyślnie, oryginalny nagłówekzostanie zastąpiony, ale jeśli ustawimy ten argument na FALSE, to nowy nagłówek zostaniedodany do już istniejących. Na przykład:

<?php

header(’WWW-Authenticate: Negociate’);

header(’WWW-Authenticate: NTLM’, FALSE);

?>

Drugi argument opcjonalny kod_odpowiedzi_http pozwala narzucić określony kod odpo-wiedzi HTTP. (Argument ten jest dostępny w PHP 4.3.0 i wyższych).

Są dwa specjalne wywołania funkcji header. Pierwszym z nich jest każdy nagłówek zaczy-nający się od "HTTP/" (wielkość liter nie jest istotna). Nagłówka tego używa się do podaniastatusu zapytania HTTP. Na przykład, jeśli skonfigurowaliśmy serwer Apache aby używałskryptu PHP do wyświetlania komunikatów o brakujących plikach (za pomocą dyrektywyErrorDocument), możemy chcieć wypróbować, czy skrypt generuje właściwy kod statusu.

<?php

header("HTTP/1.0 404 Not Found");

?>

Drugim specjalnym wywołaniem funkcji header jest nagłówek "Location:". W tej sy-tuacji, do klienta wysyłany jest nie tylko ten nagłówek, ale także status przekierowaniaREDIRECT (302), o ile inny status zapytania 3xx nie został już wysłany.

41

9 HTTP - obsługa protokołu

<?php

header("Location: http://www.example.com/"); /* Przekieruj przeglądarkę */

exit; /* Upewnij się, że kod poniżej nie zostanie wykonany

po przekierowaniu. */

?>

Uwaga! Protokół HTTP 1.1 wymaga bezwzględnego URI w nagłówku Location: włączniez określeniem protokołu, nazwy hosta i bezwzględnej ścieżki dostępu, ale niektóre klienty ak-ceptują względne URI. Zwykle używa się $_SERVER[’HTTP_HOST’], $_SERVER[’PHP_SELF’]i funkcji dirname() by wygenerować bezwzględny URI:

<?php

header("Location: http://".$_SERVER[’HTTP_HOST’]

."/".dirname($_SERVER[’PHP_SELF’])

."/".$względny_url);

?>

Skrypty PHP często służą do generowania dynamiczej treści, która nie może być buforowanaprzez klienta czy serwer proxy. Pamięć cache (bufor) w większości tych urządzeń da sięwyłączyć dzięki:

<?php

header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // data w przeszłości

header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// ciągle modyfikowany

header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1

header("Cache-Control: post-check=0, pre-check=0", false);

header("Pragma: no-cache"); // HTTP/1.0

?>

Uwaga! Można zaobserwować, że strony nie są buforowane, nawet jeśli nie użyliśmy wszyst-kich ww. nagłówków. Jest wiele sposobów, na jakie użytkownicy mogą skonfigurować swojeprzeglądarki, aby zmienić standardowy sposób buforowania. Przez wysłanie powyższych na-główków, powinno się udać ominąć wszystkie ustawienia pozwalające na zbuforowanie wy-niku pracy skryptu.Dodatkowo, session_cache_limiter() i dyrektywa konfiguracyjna session.cache_limitersłużą do automatycznego generowania nagłówków związanych z bufurowaniem, kiedy sesjesą w użyciu.

42

10 Formatowanie czasu i daty

Pamiętajmy, że header() może być wywoływana jedynie do momentu nim zostanie wysłanajakakolwiek treść, tzn. znaczniki HTML, puste linie lub wynik pracy PHP. Jest to bardzoczęsty błąd, gdzie skrypty z funkcjami include(), require() itp. mają spacje albo pustelinie przed wywołaniem funkcji header(). Problem ten pojawia się również w skryptachopartych na pojedynczym pliku PHP/HTML.

<html>

<?php

// Ten kod powoduje powstanie błędu. Proszę zauważyć, że

// ponad wywołaniem funkcji header() znajduje się jakaś treść.

header(’Location: http://www.na_przyklad.com/’);

?>

Aby użytkownik został monitowany o zapisanie wysyłanych danych, takich jak np. wygene-rowany plik PDF, można użyć nagłówka Content-Disposition aby podać zalecaną nazwępliku i zmusić przeglądarkę do wyświetlenia okienka zapisu pliku:

<?php

// przesyłamy plik PDF

header("Content-type: application/pdf");

// ustawiamy jego nazwę na downloaded.pdf

header("Content-Disposition: attachment; filename=downloaded.pdf");

// treść znajduje się w pliku original.pdf

readfile(’original.pdf’);

?>

Uwaga! W Microsoft Internet Explorer 4.01 jest błąd, który uniemożliwia wykorzystanietego mechanizmu. Nie ma na to rozwiązania. Błąd, który zahacza o ten mechanizm, jesttakże w Microsoft Internet Explorer 5.5, jednak da się go ominąć aktualizując przeglądarkępoprzez Service Pack 2 lub późniejszy.

10 Formatowanie czasu i daty

date - Formatuje lokalny czas/datę

string date ( string format [, int znacznik_czasu])

43

10 Formatowanie czasu i daty

Zwraca datę sformatowaną według szablonu podanego w argumencie format. Żądana dataokreślona jest w argumencie znacznik_czasu, a w przypadku jego braku pobierany jestaktualny czas.

Poniższych znaków używa się w szablonie formatującym datę:

• a - "am" lub "pm".

• A - "AM" lub "PM".

• B - Czas internetowy Swatcha.

• d - dzień miesiąca, 2 cyfry z zerem na początku; tzn. od "01" do "31".

• D - dzień tygodnia, tekst, 3 litery; np. "Fri".

• F - miesiąc, tekst, pełna nazwa; np. "January".

• g - godzina, format 12-godzinny bez zera na początku; tzn. od "1" do "12".

• G - godzina, format 24-godzinny bez zera na początku; tzn. od "0" do "23".

• h - godzina, format 12-godzinny z zerem na początku; tzn. od "01" do "12".

• H - godzina, format 24-godzinny z zerem na początku; tzn. od "00" do "23"

• i - minuty; tzn. od "00" do "59".

• I (duża litera i) - "1" jeśli czas oszczędzania światła słonecznego (w Polsce - czas letni),"0" jeśli czas standardowy (w Polsce - zimowy).

• j - dzień miesiąca bez zera na początku; tzn. od "1" do "31".

• l (mała litera ’L’) - dzień tygodnia, tekst, pełna nazwa; np. "Friday".

• L - "1" jeśli rok przestępny, "0" w przeciwnym razie.

• m - miesiąc; tzn. "01" to "12".

• M - miesiąc, tekst, 3 litery; np. "Jan".

• n - miesiąc bez zera na początku; tzn. "1" to "12".

• O - różnica w stosunku do czasu Greenwich; np. "+0200".

• r - data sformatowana według RFC 822; n.p. "Thu, 21 Dec 2000 16:01:07 +0200"(dodane w PHP 4.0.4).

44

10 Formatowanie czasu i daty

• s - sekundy; i.e. "00" to "59".

• S - standardowy angielski sufiks liczebnika porządkowego, 2 litery; tzn. "st", "nd", "rd"lub "th".

• t - liczba dni w danym miesiącu; tzn. od "28" do "31".

• T - strefa czasowa ustawiona na tej maszynie; np. "EST" lub "MDT".

• U - liczba sekund od uniksowej Epoki (1 stycznia 1970 00:00:00 GMT).

• w - dzień tygodnia, liczbowy, tzn. od "0" (Niedziela) do "6" (Sobota).

• W - numer tygodnia w roku według ISO-8601, tydzień zaczyna się w poniedziałek (do-dane w PHP 4.1.0).

• Y - rok, 4 liczby; n.p. "1999".

• y - rok, 2 liczby; n.p. "99".

• z - dzień roku; tzn. od "0" do "365".

• Z - ofset strefy czasowej w sekundach (tzn. pomiędzy "-43200" a "43200"). Ofset dlastref czasowych na zachód od UTC (południka zero) jest zawsze ujemny a dla tych nawschód od UTC jest zawsze dodatni.

Nierozpoznane znaki w szablonie formatującym będą wyświetlone tak jak są.Przykłady użycia funkcji date():

/* Dzisiaj jest March 10th, 2001, 5:16:18 pm */

$today = date("F j, Y, g:i a"); // March 10, 2001, 5:16 pm

$today = date("m.d.y"); // 03.10.01

$today = date("j, n, Y"); // 10, 3, 2001

$today = date("Ymd"); // 20010310

$today = date(’h-i-s, j-m-y, it is w Day z ’);

// 05-16-17, 10-03-01, 1631 1618 6 Fripm01

$today = date(’\i\t \i\s \t\h\e jS \d\a\y.’); // It is the 10th day.

$today = date("D M j G:i:s T Y");

// Sat Mar 10 15:16:08 MST 2001

$today = date(’H:m:s \m \i\s\ \m\o\n\t\h’); // 17:03:17 m is month

$today = date("H:i:s"); // 17:16:17

mktime - Oblicza uniksowy znacznik czasu dla podanej daty

45

11 Wysyłanie poczty elektronicznej za pomocą PHP

int mktime ( int godzina, int minuta, int sekunda,

int miesiąc, int dzień, int rok [, int letni/zimowy])

time - Zwraca aktualny uniksowy znacznik czasu

int time ( void )

Zwraca aktualny czas, podawany jako liczba sekund, które upłynęły od uniksowej Epoki(1 stycznia 1970 00:00:00 GMT).

11 Wysyłanie poczty elektronicznej za pomocą PHP

Aby wysłać pocztę elektroniczną należy użyć funkcji mail(). Oto jej składnia:

bool mail ( string do, string temat, string treść

[, string dodatkowe_nagłówki [, string dodatkowe_parametry]])

Funkcja mail() automatycznie wysyła wiadomość określoną w treść do odbiorcy określonegow do. Można wysłać wiadomość do kilku odbiorców na raz, wypisując ich adresy po przecinkuw argumencie do. Poprzez tę funkcję można też wysłać listy zawierające załączniki lub innetypy wiadomości. Jest to możliwe dzięki kodowaniu MIME.

Funkcja zwraca TRUE jeśli e-mail został zaakceptowany przez przekaźnik pocztowy dowysłania lub FALSE w przeciwnym wypadku.

Jeśli zostanie podany czwarty argument, będzie on dopisany na końcu nagłówka wiado-mości. Ten argument wykorzystuje się do wstawienia dodatkowych nagłówków. Dodatkowenagłówki rozdziela się znakiem powrotu karetki i nowego wiersza:

mail("[email protected]", "Temat listu", "Linia 1\nLinia 2\nLinia 3");

mail("[email protected]", "temat", $message,

"From: webmaster@$SERVER_NAME\r\n"

."Reply-To: webmaster@$SERVER_NAME\r\n"

."X-Mailer: PHP/" . phpversion());

Uwaga! Aby rozdzielić nagłówki, trzeba użyć sekwencji \r\n, chociaż niektóre uniksoweagenty pocztowe obsługują także pojedynczy znak nowej linii (\n).

Argumentu dodatkowe_parametry używa się do przekazania dodatkowego paramteru doprogramu wysyłającego pocztę skonfigurowanego w dyrektywie sendmail_path. Używa siętego na przykład do ustawienia adresu zwrotnego koperty (envelope sender adress) przywysyłaniu listu za pomocą sendmaila. Możemy być zmuszony dodać użytkownika jakim jest

46

11 Wysyłanie poczty elektronicznej za pomocą PHP

nasz serwer WWW do listy zaufanych użytkowników w pliku konfiguracyjnym sendmaila, abysendmail nie dodał nagłówka "X-warning" do wiadomości przy wysyłaniu koperty (envelope)tą metodą.

mail("[email protected]", "temat", $wiadomosc,

"From: webmaster@$SERVER_NAME", "-fwebmaster@$SERVER_NAME");

Uwaga! Piąty argument funkcji mail() został dodany w PHP 4.0.5. Począwszy od PHP4.2.3 argument ten jest zablokowany w trybie bezpiecznym. W przypadku próby użycia,funkcja mail() wygeneruje ostrzeżenie i zwróci FALSE.

Wysyłanie złożonego emaila (w formacie HTML):

// adresaci

$to = "Mary <[email protected]>" . ", " ; //zwróc uwagę na przecinek

$to .= "Kelly <[email protected]>";

// temat

$subject = "Birthday Reminders for August";

// wiadomość

$message = ’

<html>

<head>

<title>Birthday Reminders for August</title>

</head>

<body>

<p>Here are the birthdays upcoming in August!</p>

<table>

<tr>

<th>Person</th><th>Day</th><th>Month</th><th>Year</th>

</tr>

<tr>

<td>Joe</td><td>3rd</td><td>August</td><td>1970</td>

</tr>

<tr>

<td>Sally</td><td>17th</td><td>August</td><td>1973</td>

</tr>

</table>

47

15 Wyrażenia regularne

</body>

</html>

’;

/* Aby wysłać e-mail w formacie HTML, należy ustawić

nagłówek Content-type. */

$headers = "MIME-Version: 1.0\r\n";

$headers .= "Content-type: text/html; charset=iso-8859-2\r\n";

/* dodatkowe nagłówki */

$headers .= "From: Birthday Reminder <[email protected]>\r\n";

$headers .= "Cc: [email protected]\r\n";

$headers .= "Bcc: [email protected]\r\n";

// a teraz wyślij

mail($to, $subject, $message, $headers);

Uwaga! Upewnijmy się, że nie ma żadnych znaków nowej linii w argumencie do lub temat,gdyż w przeciwnym razie, e-mail może nie być wysłany poprawnie.

12 Obsługa zmiennych tablicowych

13 Funkcje do obsługi systemu plików

14 Łańcuchy znaków

15 Wyrażenia regularne

Wyrażenie regularne jest sposobem opisu wzorca (ang. pattern) szukanego we fragmencietekstu (od lewej do prawej). Najprostszym wyrażeniem jest zwykły ciąg znaków np. "to jestmój dom", który pasuje do dowolnego łańcucha znaków zawierającego ten tekst. Korzystającz wyrażeń regularnych możemy się posługiwać specjalnymi znakami (ang. meta characters),pozwalającymi na wyszukiwanie nie tylko dokładnych dopasowań. Są one interpretowanew sposób szczególny, przy ich pomocy możemy wskazać, czy wzorzec musi się pojawić napoczątku lub końcu łańcucha, że musi się składać z określonych znaków itp. Mamy dwa

48

15 Wyrażenia regularne

zbiory meta znaków: te które są rozpoznawane wszędzie poza nawiasami prostokątnymi [] ite, które są interpretowane w nawiasach prostokątnych.

Znaki specjalne poza nawiasami []:

• ^ - wskazuje, że wzorzec musi się znajdować na początku tekstu, np. wyrażenie ^dom

pasuje do dowolnego tekstu rozpoczynającego się od słowa dom.

• $ - wskazuje, że wzorzec musi się znajdować na końcu tekstu, np. wyrażenie dom$ pasujedo dowolnego tekstu kończącego się słowem dom.

• | - znak oznaczający rozgałęzienie (alternatywę) np. wyrażenie com|edu|net pasujedo tekstu, który zawiera słowo com, bądź edu bądź net.

• [] - nawiasy prostokątne oznaczają definicję klasy.

• . - kropka zastępuje dowolny znak prócz znaku nowej linii, np. .as pasuje do słów las,was, mas.

• () - nawiasy okrągłe umożliwiają tworzenie podwyrażeń.

• * - oznacza, że wyrażenie lub podwyrażenie musi się pojawić 0 lub więcej razy, np.(bardzo )* duży pasuje do słów duży, bardzo duży, bardzo bardzo duży itp.

• + - oznacza, że wyrażenie lub podwyrażenie musi się pojawić 1 lub więcej razy, np.(bardzo )+ duży pasuje do słów bardzo duży, bardzo bardzo duży itp.

• {} - nawiasy klamrowe specyfikują liczbę powtórzeń wyrażenia lub podwyrażenia, np.(bardzo ){1,3} duży pasuje do tekstów: bardzo duży, bardzo bardzo duży, bardzo bar-dzo bardzo duży.

• \ - znak unikatowy, zmienia znaczenie innych znaków specjalnych, przestają one byćinterpretowane i stają się zwykłymi znakami, np. 100\$ pasuje do ciągu 100$.

Znaki specjalne w klasach (między znakami []). Klasy specyfikują zakresy znaków,które powinny się znajdować w danym miejscu tekstu, np. [a-z] oznacza, że w danymmiejscu powinna być mała litera. W tym przypadku następujące znaki są interpretowane:

• \ - znak unikatowy, zmienia znaczenie innych znaków specjalnych, przestają one byćinterpretowane i stają się zwykłymi znakami, np. \^ pasuje do znaku ^.

49

17 Obsługa sesji

• ^ - zaprzeczenie (NOT), tylko wówczas gdy występuje jako pierwszy w klasie, np.[^a-z] oznacza, że znak nie może być małą literą.

• - - jest używany do określania zakresu znaków, np. [0-9], [A-M].

Oprócz klas wyliczeniowych mamy przedefiniowane klasy znaków:

Klasa Dopasowanie[[:alnum:]] znaki alfanumeryczne[[:alpha:]] znaki alfabetu[[:lower:]] małe litery[[:upper:]] duże litery[[:digit:]] cyfry dziesiętne[[:xdigit:]] cyfry heksadecymalne[[:punct:]] znaki interpunkcyjne[[:blank:]] tabulatory i spacje[[:space:]] znaki białe[[:cntrl:]] znaki sterujące[[:print:]] wszystkie znaki drukowane[[:graph:]] wszystkie znaki drukowane bez spacji

16 Dostęp do systemu MySQL z poziomu PHP

17 Obsługa sesji

Obsługa sesji w PHP ma na celu zapewnienie sposobu na zachowanie pewnych danych wtrakcie następujących po sobie wywołań strony. Pozwala to na budowanie bardziej sperso-nalizowanych aplikacji i zwiększenie atrakcyjności twojej strony internetowej.

Obsługa sesji pozwala na rejestrowanie dowolnej ilości zmiennych, które mają być prze-kazywane pomiędzy stronami. Kiedy użytkownik wchodzi na strone, PHP automatyczniesprawdzi (jeśli session.auto_start jest ustawione na 1) lub na nasze życzenie (jawnieprzez wywołanie session_start() lub niejawnie przez wywołanie session_register())czy specyficzne id sesji zostało przypisane. Jeśli tak, poprzednio zachowane środowisko jestodtwarzane.

Wszystkie zarejestrowane zmienne są serializowane po wykonaniu całego kodu strony.Zarejestrowane zmienne, które są niezdefiniowane, są zaznaczane jako niezdefiniowane. Niesą one definiowane przez moduł sesji w następujących po sobie wywołaniach, chyba że użyt-kownik zdefiniuje je później.

50

17 Obsługa sesji

Istnieją dwie metody propagacji identyfikatora sesji:

• ciasteczka,

• parametry URL-i lokalnych.

Moduł sesji obsługuje obie metody. Ciasteczka są metodą optymalną, ale ponieważ nie sąone pewne (klienci nie muszą ich akceptować), nie możemy na nich polegać. Druga metodawstawia identyfikatory sesji bezpośrednio do URL-i.

PHP może to robić ’przezroczyście’ jeśli został skompilowany z opcją --enable-trans-sid.Jeśli włączysz tą opcję, względne URI zostaną automatycznie podmienione tak, aby zawie-rały identyfikator sesji. Możemy także użyć stałej SID która jest definiowana jeśli klient niewysłał odpowiedniego ciastka. SID jest albo w postaci nazwa_sesji=id_sesji lub pustymłańcuchem znaków.

Poniższy przykład demonstruje jak zarejestrować zmienną i jak prawidłowo wstawić linkdo kolejnej strony korzystając ze stałej SID.

<?php if (!session_is_registered(’count’)) {

session_register(’count’);

$count = 1;

} else {

$count++;

} ?>

Witaj gościu. Oglądasz tą stronę <?php echo $count; ?> raz.<p>

<?php

# <?php echo SID?> (<?=SID?> może być użyte jeśli włączona jest możliwość

# używania krótkich tagów) jest konieczne do zachowania identyfikatora

# sesji jeśli użytkownik wyłączył ciastka

?>

Aby kontynuować, <A HREF="nextpage.php?<?php echo SID?>">kliknij tutaj</A>

Uwaga! <?=SID?> nie jest konieczne jeśli przy kompilacji PHP użyta została opcja--enable-trans-sid.

Uwaga! PHP zakłada, że bezwzględne URL-e odnoszą się do zewnętrznych serwisów, więcnie trzeba przekazywać SID, ponieważ istniałoby niebezpieczeństwo podkradania SID-ówprzez inny serwer.

51

17 Obsługa sesji

Opcje konfiguracyjne track_vars i register_globals wpływają na to, jak zmiennesesyjne są przechowywane i odtwarzane.

Jeśli włączona jest opcja track_vars a register_globals jest wyłączona, tylko pozycjenależące do zmiennej asocjacyjnej $HTTP_SESSION_VARS/$_SESSION mogą być zarejestro-wane jako zmienne sesyjne. Odtworzone zmienne sesyjne będą dostępne tylko w zmiennej$HTTP_SESSION_VARS/$_SESSION.

Uwaga! Od wersji PHP 4.1.0 dostępna jest globalna zmienna $_SESSION, podobnie jak$_POST, $_GET, $_REQUEST i tak dalej. W odróżnieniu od $HTTP_SESSION_VARS, $_SESSIONjest zawsze globalna. W związku z tym global nie powinno być użyte do $_SESSION.

Jeśli włączona jest opcja track_vars a register_globals jest wyłączona, tylko pozy-cje należące do zmiennej asocjacyjnej $HTTP_SESSION_VARS mogą być zarejestrowane jakozmienne sesyjne. Odtworzone zmienne sesyjne będą dostępne tylko w zmiennej $HTTP_SESSION_VARS.

Użycie $_SESSION (lub $HTTP_SESSION_VARS dla wersji PHP 4.0.6 i starszych) jest wska-zane ze względów bezpieczeństwa i czytelności kodu. Używając $_SESSION lub $HTTP_SESSION_VARS

nie ma potrzeby używać funkcji session_register()/session_unregister()/session_is_registered(). Użytkownicy mogą uzyskiwać dostęp do zmiennych sesyjnychtak jak do normalnych zmiennych.

Rejestrowanie zmiennych przez $_SESSION:

<?php

session_start();

// Użyj $HTTP_SESSION_VARS dla PHP 4.0.6 i starszych

if (!isset($_SESSION[’count’])) {

$_SESSION[’count’] = 0;

} else {

$_SESSION[’count’]++;

}

?>

Wyrejestrowywanie zmiennej korzystając z $_SESSION:

<?php

session_start()

// Użyj $HTTP_SESSION_VARS dla PHP 4.0.6 i starszych

unset($_SESSION[’count’]);

?>

52

18 Zasoby sieciowe związane z językiem PHP

Uwaga! Jeśli używane są tablice $HTTP_SESSION_VARS/$_SESSION i i wyłączona jest opcjaregister_globals, nie powinno się używać session_register(), session_is_registered()i session_unregister().

Jeśli włączona zostanie opcja register_globals, powinno się używać session_unregister()ponieważ zmienne sesyjne są rejestrowane jako zmienne globalne kiedy dane sesyjne są de-serializowane. Wyłączenie register_globals jest zalecane ze względów bezpieczeństwa iwydajności.

18 Zasoby sieciowe związane z językiem PHP

• http://www.php.net - oficjalna witryna języka PHP.

• http://zend.com - witryna mechanizmu ZEND, na którym oparte jest PHP.

• http://www.phpwizard.net - źródła wielu aplikacji PHP.

• http://www.phpbuilder.com - portal z podręcznikami PHP.

• http://px.sklar.com - PX-PHP Code Exchange - mnóstwo przykładowych skryptówi funkcji.

• http://www.hotscripts.com - bogaty, podzielony na kategorie wybór skryptów wróżnych językach, takich jak PHP, ASP czy Perl.

• http://phpclub.net - mnóstwo zasobów dla początkujących programistów PHP.

• http://phpclasses.upperdesign.com - PHP Classes Repository - witryna, na którejoferowane są za darmo klasy tworzone w PHP.

• http://www.webhelp.pl/ - Webhelp - polski portal zawierający wiele materiałów do-tyczących m. in. php, mysql, html, css, flash, javascript, asp, cgi.

• http://webcity.pl/ - WebCity - strona po Polsku, zawiera kursy PHP i MySQL.

• http://4programmers.net/ - 4Programmers - polska witryna o programowaniu.

53