Co to jest PHP

PHP jest językiem skryptowym służącym do rozszerzania możliwości stron internetowych. Jego składnia jest bardzo podobna do popularnych języków programowania C/C++, lecz jest bardzo uproszczona – programista PHP zazwyczaj nie musi przejmować się poprawnością typów zmiennych, przydzielaniem dla nich pamięci itp. Dodatkowo wbudowana obsługa wielu popularnych baz danych ułatwia twórcy operacje na tych bazach. Dzięki połączeniu z biblioteką GD możliwe jest także dynamiczne tworzenie obrazków GIF (starsze wersje GD) lub PNG (nowsze wersje).

Osadzanie skryptów PHP

Aby plik był rozpoznany przez serwer WWW jako skrypt PHP musi on mieć odpowiednie rozszerzenie. Rozszerzenia te można zdefiniować w konfiguracji serwera WWW, ale zazwyczaj jest to .php3 (dla PHP w wersji 3), .php lub php4 (dla PHP w wersji 4) i .phtml (dla PHP w wersji starszej niż 3). Po nadaniu plikowi takiego rozszerzenia serwer będzie wiedział, że plik ten nie jest przeznaczony do bezpośredniego wyświetlenia (jak w przypadku plików HTML), ale że najpierw trzeba go przepuścić przez parser PHP.

Jeśli zwykłemu plikowi HTML nadamy rozszerzenie .php, to zostanie on prawidłowo wyświetlony, mimo że nie jest to skrypt PHP. Dzieje się tak dlatego, że parser PHP przetwarzając stronę ma 2 tryby pracy: HTML, gdzie cała treść jest wyświetlana, bez przetwarzania, i PHP, gdzie treść jest traktowana jako skrypt do przetworzenia. Do określenia w pliku co jest kodem HTML a co PHP służą specjalne znaczniki. Początkowo parser jest w trybie HTML. Aby przejść do trybu PHP można użyć jednego z czterech znaczników:

  • <? echo ("to jest najprostsza metoda, podobna do SGML'a"); ?>
  • <?php echo("jeśli serwujesz pliki XML, użyj tej metody"); ?>
  • <script language="php">
    echo ("niektóre edytory (np. FrontPage) nie lubią przetwarzania instrukcji");
    </script>
  • <% echo ("Możesz też użyć metody podobnej do tej z ASP"); %>
    <%= $variable; # To jest skrót dla "<% echo ..." %>

W powyższych przykładach użyta jest niby-funkcja echo. Niby-funkcja, ponieważ dla większości normalnych funkcji parametry trzeba podawać w nawiasach, a w przypadku funkcji echo można je pominąć. “echo” jest po prostu elementem składni języka. Jak się można łatwo domyślić, służy ona do wysyłania tekstu podanego jako parametr do przeglądarki użytkownika.

Po przeczytaniu powyższego fragmentu każdy powinien być już gotowy do napisania programu, jaki każda osoba pisze zaraz po wstępnym zapoznaniu się z nowym językiem programowania – Hello World!. W przypadku PHP jest to zadanie uproszczone do minimum.

Przykład 1.1. Skrypt Hello World!

<?php echo 'Hello World!'; ?>

Po zapisaniu tego pliku z odpowiednim rozszerzeniem i umieszczeniu go odpowiednim miejscu (czyli w katalogu z którego będzie dostęp będzie miał serwer WWW). Po wejściu na tę stronę z przeglądarki WWW w okienku powinno być widać tylko napis “Hello World!” (bez cudzysłowów). Jedna uwaga: polecenie echo nie wysyła znaku końca linii, więc jeśli chcesz, aby po ciągu znaków (albo w którymkolwiek miejscu tego ciągu) kończyła się linia, w tym miejscu trzeba wstawić ‘\n’.

Błędy i debugowanie

Parser PHP podczas wykonywania skryptu sprawdza jego poprawność. Jeśli coś się nie zgadza, zostaniemy o tym poinformowani. Skrypt będzie jednak wykonany do miejsca, w którym pojawił się błąd. Przy komunikacie o błędach podana zostanie informacja o typie błędu, pliku w którym ten błąd zaszedł oraz linii zawierającej błąd. Najczęściej są to błędy składniowe – brak średnika na końcu linii, niedomkniętych nawiasach (bardzo częsty błąd przy złożonych instrukcjach warunkowych), cudzysłowach lub nawiasach klamrowych kończących blok danych (przy instrukcjach warunkowych, pętlach). Błędy przy braku zamykających nawiasów klamrowych łatwo można rozpoznać, ponieważ numer linii zawierającej błąd jest o jeden większa od liczby linii w pliku.

PHP w wersji czwartej nie posiada jako-takiego debuggera. Wersja trzecia miała możliwość debugowania skryptów po ustawieniu odpowiednich opcji w konfiguracji PHP, który będzie się łączył z odpowiednim portem podanym w konfiguracji, na który będą przesyłane dane o błędach. Niektóre edytory wspomagające tworzenie skryptów PHP (jak np. Quanta+ pod Linuksa) posiadają wbudowaną obsługę debuggera. Jest to jednak metoda skomplikowana (więcej o niej w dokumentacji do PHP) i wymaga interwencji administratora serwera (sprawa jest łatwiejsza jeśli programista jest administratorem). Istnieje metoda dużo prostsza. Po prostu w kluczowych miejscach skryptu (zazwyczaj tych, w których skrypt działa nieprawidłowo lub niezgodnie z zamierzeniami) należy wyświetlić interesujące nas zmienne za pomocą polecenia echo. Można też skorzystać z instrukcji warunkowych, ale o tym w dalszej części kursu.

Na początek warto jest zapoznać się z informacjami, które wyświetlą się po użyciu funkcji phpinfo(). Funkcja ta wyświetla wszystkie informacje o konfiguracji PHP (bardzo przydatne przy poszukiwaniu gdzie powinien znajdować się plik php.ini) oraz wszystkie zmienne środowiskowe, serwera oraz przekazane metodami GET, POST, COOKIE oraz sesyjnymi.

 

Oddzielanie instrukcji

Jak już można zauważyć w przykładach z poprzedniego rozdziału, jedną z głównych zasad języka PHP (jak i wielu innych – m. in. C i Perla) jest umieszczenie na końcu każdej instrukcji (niekoniecznie linii) znaku średnika (‘;’). Można go pominąć tylko jeśli w danym miejscu następuje przejście do trybu HTML, a więc po danej linii następuje symbol przejścia do trybu HTML.

Przykład 2.1. Oddzielanie instrukcji

<?php
    echo "To jest test";
?>

<?php echo "To jest test" ?>

Komentarze

Czasem zachodzi potrzeba oznaczenia czegoś w kodzie, dla kogoś innego czy nawet dla siebie samego (zwłaszcza jeśli pracuje się nad dużym projektem można się pogubić). Wtedy można skorzystać z jednej z kilku metod oznaczania, dzięki którym parser PHP będzie wiedział, że dany tekst nie jest częścią skryptu i można go zignorować. Komentarze przydają się także do tymczasowego “wyłączania” niektórych linii kodu. PHP obsługuje 3 metody oznaczania komentarzy – 2 z nich znane są z języków C/C++ a jedna z powłok (shell) systemów Uniksowych. Poniższe 2 metody służą do oznaczania, że tekst od danego miejsca do końca linii jest komentarzem:

Przykład 2.2. Stosowanie komentarzy

<?php

   echo "To jest test komentarzy"; // Ta metoda znana jest z języków C/C++

   echo "A to drugi test"; # A ta z powłok Uniksowych

?>

Ostatnia metoda, także znana z języków C/C++, służy do oznaczania wielu linii jako komentarz. Należy przy niej pamiętać, aby nie zagnieżdżać wewnątrz siebie takich komentarzy ponieważ może to doprowadzić do nieprawidłowego funkcjonowania skryptów.

Przykład 2.3. Komentarze wielolinijkowe

<?php

   echo "Test komentarzy"; /* Tu jest początek komentarza
   tu dalej trwa
   a tu się kończy */

?>

Zmienne

Jeśli ktoś nie spotkał się jeszcze z pojęciem zmiennej, to postaram się to wyjaśnić. Otóż zmienna jest to identyfikator znakowy, któremu przypisano jakąś wartość. W języku PHP zmienne oznacza się za pomocą znaku dolara (‘$’) przed wspomnianym identyfikatorem. Obsługa zmiennych w PHP jest uproszczona do minimum. W “dużych” językach programowania zmienne trzeba najpierw inicjować (przy czym z góry trzeba określić typ zmiennej), zmienne tekstowe muszą mieć z góry ustalony rozmiar itp. W PHP nie jest to konieczne. Zmienna jest inicjalizowana (to znaczy rezerwowany jest dla niej pewien obszar w pamięci) przy pierwszym jej użyciu. Nazwy zmiennych muszą zaczynać się od litery (dużej lub małej) lub “underscore” (dolna kreska – ‘_’) a dalej mogą się składać z dowolnej ilości liter, cyfr i znaków o kodzie ASCII powyżej 127. Przy nazwach zmiennych respektowana jest wielkość znaków – zmienne $Test i $test to dwie różne zmienne. Oto przykład przypisywania wartości zmiennym i wykorzystanie ich w poleceniu echo:

Przykład 2.4. Koncepcja zmiennych

<?php

   $nazwa = 1; // Zmiennej "nazwa" przypisywana jest wartość liczbowa 1

   $druga_nazwa = "Tekst"; // Zmiennej "druga_nazwa" przypisany jest ciąg znaków "Tekst"

   $trzecia_nazwa = $nazwa; // Zmiennej "trzecia_nazwa" przypisywana
                            //jest wartość zmiennej "nazwa"

   echo "To jest $druga_nazwa"; // Powinien wyświetlić się napis "To jest Tekst"

   echo '$druga_nazwa'; // Powinien wyświetlić się napis "$druga_nazwa"

   echo $nazwa; // Powinna wyświetlić się cyfra 1

?>

W powyższym przykładzie można zauważyć, że parametr dla polecenia echo można podawać zarówno w cudzysłowach jak i apostrofach. Jednak te parametry nie są sobie równoznaczne. W przypadku cudzysłowów zmienne zawarte między nimi są zamieniane na ich wartość, a w przypadku apostrofów zmienna pozostaje swoją nazwą (jak można zauważyć w powyższym przykładzie).

Typy zmienych

  • liczby całkowite (integer)
  • liczby rzeczywiste (double)
  • ciągi (string)
  • tablice (array)
  • obiekty (object)

Dodatkowo PHP potrafi konwertować zmienne całkowite zapisane w różnych formatach liczbowych.

Przykład 2.5. Formaty liczbowe

<?php
$a = 1234; # liczba dziesiętna
$a = -123; # liczba ujemna
$a = 0123; # liczba ósemkowa (równoznaczne z dziesiętnym 83)
$a = 0x12; # liczba szesnastkowa (równoznaczne z dziesiętnym 18)
?>

Zmiana typu

Zazwyczaj nie jest konieczne określenie typu zmiennej – PHP sam to ustala, zależnie od kontekstu.

Przykład 2.6. Zmiana typu zmiennej

<?php
$blah = "0";  // $blah jest ciągiem (ASCII 48)
$blah++;      // $blah jest ciągiem "1" (ASCII 49)
$blah += 1;   // $blah jest teraz wartością całkowitą (2)
$blah = $foo + 1.3;  // $blah jest wartością rzeczywistą (1.3)
$blah = 5 + "10 Malutkich Świnek"; // $blah jest wartością całkowitą (15)
$blah = 5 + "10 Małych Świń";     // $blah jest wartością całkowitą (15)
?>

Podczas przypisywania zmiennej nowej wartości, poprzednia wartość jest oczywiście zamazywana. W takim przypadku typ zmiennej ustalany jest od nowa.

Jeśli jednak zachodzi potrzeba zmiany typu lub PHP błędnie rozpoznaje typ, to można tego dokonać za pomocą rzutowania (cast – efekt jest jednorazowy) lub za pomocą funkcji settype (efekt trwały).

Rzutowanie typów odbywa się przez podanie nowego typu w nawiasie przed zmienną lub wartością, której typ chcemy zmienić.

Przykład 2.7. Rzutowanie typów

<?php
$liczba_calkowita = 10;

$liczba_rzeczywista = (real) $liczba_calkowita;
?>

Dozwolone typy rzutowań

  • (int), (integer) – rzutuj do typu całkowitego
  • (real), (double), (float) – rzutuj do typu rzeczywistego
  • (string) – rzutuj do ciągu
  • (array) – rzutuj do tablicy
  • (object) – rzutuj do obiektu

Drugim sposobem, trwałym, jest użycie funkcji settype. Funkcja ta pobiera 2 argumenty. Pierwszym jest nazwa zmiennej do ustalenia typu, a drugim ciąg określający nowy typ zmiennej.

Dopuszczalne argumenty funkcji settype

  • “integer”
  • “double”
  • “string”
  • “array”
  • “object”

Funkcja zwraca wartość “true” gdy wszystko poszło pomyślnie. W przeciwnym razie zwracana jest wartość “false”.

Przykład 2.8. Przykład użycia funkcji settype

<?php

   $zmienna = 10.3;

   echo "$zmienna <br>"; // Wyświetlona wartość to "10.3"

   settype($zmienna, "integer");

   echo "$zmienna <br>"; // Wyświetlona wartość to "10"

?>

Predefiniowane zmienne

W każdym skrypcie PHP dostępne jest kilka zmiennych, których wartość jest ustalana na podstawie zmiennych środowiskowych serwera WWW. Dostępne są jak zwykłe zmienne – ze znakiem dolara przed nazwą.

Zmienne ustawiane przez serwer WWW

GATEWAY_INTERFACE
Informacja o specyfikacji CGI używanej przez serwer, np. ‘CGI/1.1′.
SERVER_NAME
Nazwa hosta serwera na którym skrypt jest uruchamiany. Jeśli skrypt pracuje na wirtualnym hoście, to zmienna przyjmie jako wartość nazwę wirtualnego hosta.
SERVER_SOFTWARE
Ciąg identyfikujący serwera podawany przy odpowiadaniu na zapytania.
SERVER_PROTOCOL
Nazwa i numer wersji protokołu za pomocą którego wysłano zapytanie o stronę, np. ‘HTTP/1.0′;
REQUEST_METHOD
Metoda zapytania użyta do uzyskania dostępu do strony, np. ‘GET’, ‘HEAD’, ‘POST’, ‘PUT’.
QUERY_STRING
Ciąg zapytania (jeśli takowy istnieje) za pomocą którego połączono się ze stroną.
DOCUMENT_ROOT
Katalog główny drzewa dokumentów spod którego skrypt jest wykonywany – jest to ustawienie z pliku konfiguracyjnego serwera.
HTTP_ACCEPT
Nagłówek z aktualnego zapytania, jeśli taki istnieje.
HTTP_ACCEPT_CHARSET
Zawartość nagłówka “Accept-Charset” z aktualnego zapytania, jeśli taki istnieje, np. ‘iso-8859-1,*,utf-8′.
HTTP_ENCODING
Zawartość nagłówka “Accept-Encoding” z aktualnego zapytania, jeśli taki istnieje, np. ‘gzip’.
HTTP_ACCEPT_LANGUAGE
Zawartość nagłówka “Accept-Language” z aktualnego zapytania, jeśli taki istnieje, np. ‘en’.
HTTP_CONNECTION
Zawartość nagłówka “Connection” z aktualnego zapytania, jeśli taki istnieje, np. ‘Keep-Alive’.
HTTP_HOST
Zawartość nagłówka “Host” z aktualnego zapytania, jeśli taki istnieje.
HTTP_REFERER
Adres strony (jeśli taka była), która wskazała przeglądarkę do tej strony. Wartość ta jest ustawiana przez przeglądarkę – nie wszystkie to robią.
HTTP_USER_AGENT
Zawartość nagłówka “User-Agent” z zapytania, jeśli taki istnieje. Jest to ciąg informujący o przeglądarce która została użyta do obejrzenia bieżącej strony, np. Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). Można użyć funkcji get_browser() aby dopasować funkcjonalność strony do przeglądarki użytkownika.
REMOTE_ADDR
Adres IP z którego użytkownik połączył się z serwerem.
REMOTE_PORT
Port używany do komunikacji pomiędzy użytkownikiem a serwerem.
SCRIPT_FILENAME
Ścieżka do aktualnie wykonywanego skryptu.
SERVER_ADMIN
Wartość podana dla opcji SERVER_ADMIN w konfiguracji serwera WWW. Jeśli skrypt działa na wirtualnym serwerze, to będzie to wartość podana dla tego wirtualnego serwera.
SERVER_PORT
Port na serwerze którego użyto do połączenia. Dla normalnych połączeń będzie to ’80′.
SERVER_SIGNATURE
Ciąg zawierający wersję i nazwę wirtualnego hosta który jest dodawany do stron generowanych przez serwer.
SCRIPT_NAME
Zawiera ścieżkę do aktualnie wykonywanego pliku. Jest to przydatne do skyptów, które muszą wskazywać samego siebie.
REQUEST_URI
URI który został podany aby uzyskać dostęp do tej strony.

Zmienne ustawiane przez PHP

argv
Tablica argumentów przkazywanych do skryptu. Jeśli skrypt jest uruchamiany z linii poleceń, to zmienna ta daję dostęp do argumentów w stylu języka C. Jeśli jest wywołany przez metodę GET, to zmienna ta zawierać będzie ciąg parametrów (query string).
argc
Zawiera liczbę parametrów podanych podanych do skryptu w linii poleceń (jeśli skrypt został wywołany z linii poleceń).
PHP_SELF
Nazwa pliku aktualnie wykonywanego skryptu, względna do katalogu głównego dokumentów. Ta zmienna jest niedostępna jeśli PHP jest uruchamiany z linii poleceń.
HTTP_COOKIE_VARS
Tablica asocjacjna zmiennych przekazanych do skryptu przez HTTP cookies. Dostępna tylko jeśli włączone zostało śledzenie zmiennych przez ustawienie w konfiguracji PHP opcji track_vars lub komendą .
HTTP_GET_VARS
Tablica asocjacjna zmiennych przekazanych do skryptu przez metodę GET. Dostępna tylko jeśli włączone zostało śledzenie zmiennych przez ustawienie w konfiguracji PHP opcji track_vars lub komendą .
HTTP_POST_VARS
Tablica asocjacjna zmiennych przekazanych do skryptu przez metodę POST. Dostępna tylko jeśli włączone zostało śledzenie zmiennych przez ustawienie w konfiguracji PHP opcji track_vars lub komendą <?php_track_vars?>.

Stałe

W PHP występują także tzw. stałe, czyli identyfikatory znakowe, których wartości nie można zmienić. Stałych, w odróżnieniu od zmiennych, używa się bez znaku dolara na początku. W PHP występuje kilka zmiennych ustawianych przez parser.

Stałe ustawiane przez PHP

__FILE__
Nazwa pliku ze skryptem który jest aktualnie przetwarzany. Jeśli stała ta użyta jest wewnątrz pliku który został zainkludowany (o poleceniu include w dalszej części kursu), to podana zostanie nazwa pliku zainkludowanego, a nie pliku nadrzędnego.
__LINE__
Numer linii w skrypcie która aktualnie jest przetwarzana. Jeśli stała ta użyta jest wewnątrz pliku który został zainkludowany, to podany zostanie numer linii przetwarzanej w pliku zainkludowanym.
PHP_VERSION
Ciąg reprezentujący wersję parsera PHP aktualnie używaną.
PHP_OS
Nazwa systemu operacyjnego na którym uruchamiany jest parser PHP.
TRUE
Logiczna wartość prawdy.
FALSE
Logiczna wartość fałszu.

Stałe mogą być definiowane przez użytkownika za pomocą funkcji define(), która przyjmuje 2 parametry: nazwę stałej i wartość do niej przypisaną.

Operatory

Co to jest?

Operatory są to najprościej mówiąc symbole, które służą do operacji na zmiennych. Operatory dzielą się na operatory arytmetyczne, które służą do operacji na liczbach, operatory przypisania służące do przypisywania zmiennym wartości, operatory operacji bitowych, operatory porównania niezbędne do instrukcji warunkowych, operator kontroli błędów, operator wykonania służący do uruchamiania zewnętrznych programów, operatory inkrementacji i dekrementacji, operatory logiczne i operatory ciągu.

Operatory arytmetyczne

Operatory te każdy powinien pamiętać z podstawówki :)

Przykład Nazwa Wynik
$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 i $b (bez reszty).
$a % $b Modulo Reszta z dzielenia $a przez $b.

Operator przypisania

Podstawowym operatorem przypisania jest symbol ‘=’. Oczywiście nie oznacza on ‘jest równe’. Wyrażenie $b = 5 oznacza, że zmienna $b przyjmuje wartość równą 5. Zmiennej można przypisać także wartość innej zmiennej: $b = 5; $a = $b; – zmienna $a przyjmie wartość 5.

Zmiennym można przypisywać nie tylko konkretne wartości, ale też wartości innych zmiennych. Wartości te można przypisywać kaskadowo, przy czym wartości przypisywane będą od prawej do lewej, np.:

<?php
$nazwa = $inna_nazwa = $trzecia_nazwa = 5;
?>

W tym wypadku wszystkim zmiennym zostanie przypisana wartość 5. Operator przypisania można łączyć z operatorami arytmetycznymi i operatorem łączenia ciągów:

Przykład Wynik
$a += 2 Do zmiennej $a dodane zostanie 2
$a -= 2 Od zmiennej $a odjęte zostanie 2
$a *= 2 Zmienna $a zostanie pomnożona przez 2
$a /= 2 Zmienna $a dodane podzielona przez 2
$a %= 2 Zmienna $a przyjmie wartość reszty z dzielenia $a przez 2
$a .= ” dalszy ciąg” Do zmiennej $a na końcu dodany zostanie ciąg ” dalszy ciąg”

Operatory operacji bitowych

Operatory operacji bitowych pozwalają na przestawianie pojedyńczych bitów zmiennych. Poniższa tabelka przeznaczona jest dla osób, które miały już jakąkolwiek styczność z operacjami na bitach.

Przykład Nazwa Wynik
$a & $b AND Ustawiane są bity które są ustawione w obu zmiennych.
$a | $b OR Ustawiane są bity, które są ustawione w jednej lub drugiej zmiennej.
$a ^ $b XOR Ustawiane są bity, które są ustawione w jednej lub drugiej zmiennej, ale nie w obu.
~ $a NOT Inwerter – ustawiane są bity które nie są ustawione w zmiennej $a i odwrotnie.
$a << $b Przesunięcie w lewo Przesuń bity z $a $b-razy w lewo (każdy krok oznacza pomnożenie przez 2)
$a >> $b Przesunięcie w prawo Przesuń bity z $a $b-razy w prawo (każdy krok oznacza podzielenie przez 2)

Operatory porównania

Operatory porównania są niezbędne do korzystania z instrukcji warunkowych (jeśli coś to zrób coś). Zwracają one wartość TRUE (prawda – 1) lub FALSE (fałsz – 0).

Przykład Nazwa Wynik
$a == $b Równy Prawda jeśli $a jest równe $b.
$a === $b Identyczny Prawda jeśli $a jest równe $b i są tego samego typu. (tylko PHP4)
$a != $b Nie równe Prawda jeśli $a nie jest równe $b.
$a !== $b Nie identyczny Prawda jeśli $a nie jest równe $b lub nie są tego samego typu. (tylko PHP4)
$a < $b Mniejsze Prawda jeśli $a jest mniejsze niż $b.
$a > $b Większe Prawda jeśli $a jest większe niż $b.
$a <= $b Mniejsze lub równe Prawda jeśli $a jest mniejsze lub równe $b.
$a >= $b Większe lub równe Prawda jeśli $a jest większe lub równe $b.

Operator kontroli błędów

Operator kontroli błędów (‘@’) powoduje, że wyrażenie przed którym postawiono ten znak nie spowoduje wyświetlenia się jakiegokolwiek błędu lub ostrzeżenia.

Przykład 3.1. Przykład użycia operatora kontroli błędów

<?php
/* Jeden z najczęstszych błędów SQL (za dużo o jeden apostrof) */
$res = @mysql_query ("select nazwa, kod from 'lista") or
    die ("Zapytanie się nie powiodło: błąd to '$php_errormsg'");
?>

Operator wywołania

Operator ten służy do uruchamiania zewnętrznych programów lub poleceń powłoki. Wystarczy wpisać polecenie pomiędzy znaki odwróconego apostrofu (‘`’) aby zostało ono wykonane.

Przykład 3.2. Przykład użycia operatora wywołania

<?php

  $wynik = `ls -l /home/`;

  echo $wynik;

?>

Po uruchomieniu tego skryptu wyświetlona zostanie zawartość katalogu /home na serwerze.

Operatory inkrementacji i dekrementacji

Operatory te występują w większości języków programowania. Służą one do zmniejszenia lub zwiększenia wartości danej zmiennej o 1. Każdy operator można stosować na 2 sposoby: preinkrementacja/predekrementacja – najpierw wartość zmiennej zostanie zmieniona, a później zwrócona, lub postinkrementacji/postdekrementacji – najpierw zostanie zwrócona wartość zmiennej, a następnie wartość zmiennej zostanie zmieniona.

Przykład Nazwa Wynik
++$a Preinkrementacja Zwiększa $a o jeden, a następnie zwraca $a.
$a++ Postinkrementacja Zwraca $a, a następnie zwiększa $a o jeden.
–$a Predekrementacja Zmniejsza $a o jeden, po czym zwraca $a.
$a– Postdekrementacja Zwraca $a, po czym zmniejsza $a o jeden.

Przykład 3.3. Przykład funkcjonowania inkrementacji i dekrementacji

<?php
echo "Postinkrementacja";
$a = 5;
echo "Powinno być 5: " . $a++ . "\n";
echo "Powinno być 6: " . $a   . "\n";

echo "Preinkrementacja";
$a = 5;
echo "Powinno być 6: " . ++$a . "\n";
echo "Powinno być 6: " . $a   . "\n";

echo "Postdekrementacja";
$a = 5;
echo "Powinno być 5: " . $a-- . "\n";
echo "Powinno być 4: " . $a   . "\n";

echo "Predekrementacja";
$a = 5;
echo "Powinno być 4: " . --$a . "\n";
echo "Powinno być 4: " . $a   . "\n";
?>

Operatory logiczne

Operatory logiczne służą do budowania bardziej skomplikowanych instrukcji warunkowych – do łączenia kilku warunków w jednej instrukcji.

Przykład Nazwa Wynik
$a && $b AND Prawda, jeśli $a i $b są prawdą
$a || $b OR Prawda, jeśli $a lub $b są prawdą
! $a NOT Prawda, jeśli $a nie jest prawdą

Operator ciągu

Operator ciągu (‘.’ – kropka) służy do łączenia kilku ciągów w jedną całość.

Przykład 3.4. Przykład użycia operatora ciągu

<?php

   $zmienna1 = "Wartość zmiennej 'zmienna2' to";

   $zmienna2 = 5;

   echo $zmienna1." ".$zmienna2; // Powinno się wyświetlić:
                                 // "Wartość zmiennej 'zmienna2' to 5"

?>

Jak widać na tym przykładzie, aby użyć niektórych znaków (między innymi cudzysłowów jeśli ciąg podany jest cudzysłowach, znaków dolara jeśli nie chcemy aby został potraktowany jako zmienna) trzeba zamienić go na tzw. sekwencję escape, to znaczy wstawić przed nim znak backslash – \.

Instrukcje warunkowe

Instrukcje warunkowe są podstawą każdego języka programowania. Używa się jej do wykonania pewnej instrukcji (lub bloku instrukcji), ale tylko w pewnych okolicznościach – zostanie spełniony określony warunek (lub cały zestaw warunków).

Przykład 4.1. Składnia instrukcji warunkowej

<?php
if(wyrażenie_warunkowe)
   instrukcja wykonywana jeśli spełniony zostanie warunek
elseif(inne_wyrażenie_warunkowe)
   instrukcja wykonywana jeśli spełniony zostanie drugi warunek, a pierwszy nie
else
   instrukcja wykonywana jeśli nie zostanie spełniony żaden z warunków
?>

Wyrażeniem warunkowym jest w zasadzie dowolne wyrażenie, ponieważ za warunek uznawane jest wszystko co zwraca wartość, czyli wszystkie zmienne, wyrażenia logiczne, funkcje itp. Za spełniony warunek uznawana jest wartość większa od zera.

Przykład 4.2. Przykład instrukcji warunkowej

<?php

   $a = 2;
   $b = 5;
   $c = 1;

   if($a > $b)
      echo "$a jest większe od $b";
   elseif ($b > $c)
      echo "$b jest większe od $c";
   else
      echo "$c jest większe od $a i $b";

   if($a)
      echo "Zmienna $a ma wartość większą od zera";

?>

Jeśli chcemy, aby po sprawdzeniu warunku wykonane zostało nie jedno, ale kilka poleceń, to te polecenia trzeba ująć w nawiasy klamrowe. Bez tego warunkiem objęta by była tylko jedna instrukcja po instrukcji if.

Instrukcje mogą być zagnieżdżane wewnątrz siebie.

Przykład 4.3. Zagnieżdżanie instrukcji warunkowych

<?php

$a = 6;
$b = 5;
$c = 1;

if($a > $b){

   echo "$a jest większe od $b";   

   if($a > $c)
      echo " i od $c"; // Powinien zostać wyświetlony napis "6 jest większe od 5 i od 1"

}

?>

Oczywiście możliwe jest korzystanie z warunków bardziej złożonych niż pojedyńcze porównanie wielkości zmiennych – do łączenia warunków niezbędne jest wykorzystanie operatorów logicznych opisanych w poprzednim rozdziale. Operator logiczny OR (lub) ma większy priorytet niż operator AND (i), więc aby sprawdzić jakiś warunek gdzie konieczna jest inna kolejność, niezbędne jest użycie nawiasów grupujących warunki. Na przykład chcemy aby jakaś instrukcja była wykonana jeśli zmienna $a jest większa od $b lub $c, i zmienna $d była równa $e. Jeśli chcielibyśmy zapisać to bez żadnych nawiasów: $a > $b || $a > $c && $d == $e to efekt byłby zupełnie inny od zamierzonego: instrukcja była by wykonana jeśli $a było by większe od $b, lub jeśli $a było by większe od $a i $d było by równe $e. Poprawna konstrukcja to ($a > $b || $a > $c) && $d == $e.

Przykład 4.4. Grupowanie warunków

<?php

$a = 6;
$b = 5;
$c = 7;
$d = 6;
$e = 6;

if( ($a > $b || $a > $c) && // Nawiasy klamrowe nie są potrzebne - to
      $d == $e )            // 2 linie ale jedna instrukcja
   echo 'Zmienna $a jest większa od $b a zmienna $d jest równa $e, '.
      'więc ten tekst pokaże się.';   // Taka konstrukcja jest dozwolona

?>

Pętla FOR

Czasem zachodzi potrzeba wykonania jakiejś czynności określoną ilość razy. Z pomocą przychodzi jedna z najczęściej używanych składni w większości języków programowania, czyli pętla FOR. Ogólny zapis wygląda tak:

Przykład 4.5. Pętla FOR

<?php

for( inicjalizacja zmiennych ; sprawdzenie warunku ; modyfikacja zmiennych) {

   blok wyrażeń 

}

?>

Jak widać, w tej pętli podaje się 3 wyrażenia jako parametry: inicjalizację zmiennych, czyli ustawienie początkowych wartości dla zmiennych kontrolujących pętlę, sprawdzenie warunku, czyli wyrażenie logiczne kontrolujące pętlę – pętla będzie wykonywana dopóki ten warunek jest prawdziwy, oraz modyfikację zmiennych kontrolujących pętlę – bez tego pętla będzie wykonywała się w nieskończoność (oczywiście wartość tych zmiennych można modyfikować wewnątrz pętli, ale jest to niezalecane). Przykład najprostszej pętli, która wypisze cyfry od 1 do 10:

Przykład 4.6. Przykład użycia pętli for

<?php

for( $x = 1; $x <= 10; $x++ )
   echo $x."<br>";

?>

Pętla while

Innym rodzajem pętli jest pętla WHILE. Jest ona wykorzystywana w sytuacjach, kiedy niezbędne jest wykonywanie jakiejś operacji dopóki nie zostanie spełniony warunek.

Przykład 4.7. Pętla while

<?php

while( warunek ){
   ...
   instrukcje
   ...
}

?>

Można na przykład za pomocą tej pętli zapisać odpowiednik pętli FOR z poprzedniego przykładu.

Przykład 4.8. Przykład użycia pętli while

<?php

$x=1;
while($x <= 10){
   echo $x."<BR>";
   $x++;
}

?>

Pętla do…while

Odmianą pętli while jest pętla do…while. Od zwykłej pętli while różni się ona tym, że polecenia zawarte w pętli będą przynajmniej raz wykonane – w przypadku pętli while tak być nie musi, to znaczy jeśli za pierwszym razem warunek nie zostanie spełniony to polecenia z pętli nigdy nie zostaną wykonane. W przypadku tej pętli zostano one wykonane przynajmniej ten pierwszy raz.

Przykład 4.9. Pętla do … while

<?php

do {
   ...
   instrukcje
   ...
} while( warunek );

?>

Przerywanie wykonań pętli

Czasem zachodzi potrzeba przerwania danej iteracji (powtórzenia) pętli i przejścia do następnej iteracji. Z pomocą wtedy przychodzi instrukcja continue. Wystarczy wstawić ją w odpowiednie miejsce wewnątrz pętli. Przykład (niezbyt wyszukany):

Przykład 4.10. Instrukcja continue

<?php

for($x = 1; $x<=100; $x++) {

   if($x % 2 != 0)
      continue;

   echo $x." ";
}

?>

Po uruchomieniu powyższego przykładu powinniśmy zobaczyć liczby parzyste od 1 do 100. Oczywiścje można to zapisać łatwiej.

Przykład 4.11. Wyświetlanie liczb parzystych

<?php

for($x = 2; $x <= 100; $x+=2) {
      echo $x." ";
}

?>

Istenie też polecenie, które powoduje całkowite wyjście z pętli – nie tylko z bieżącej iteracji. To polecenie to "literal">brake. Załóżmy, że zmienna $nazwa to zmienna podana z formularza:

Przykład 4.12. Instrukcja brake

<?php

for($x = 0; $x<10; $x++) {
   if($x%2==0)
      echo $x." ";
   if($nazwa == "Test1")
      break;
}

?>

Składnia switch

Składnia switch jest instrukcją warunkową, ale jedną zmienną można porównać nie z jedną wartością, ale z kilkoma. Niestety nie można konstruować złożonych warunków – możliwe jest tylko proste porównywanie (równoważne instrukcji:if($zmienna=="wartość") instrukcja).

Przykład 4.13. Składnia switch

<?php

switch($zmienna){
   case 'wartość1':
      ...
   instrukcje
   ...
   break;
   case 'wartość2':
      ...
   instrukcje
   ...
   break;
   default:
      ...
   instrukcje
   ...
}

?>

Instrukcje zawarte po identyfikatorze “default” wykonywane są jeśli zmienna $zmienna nie przyjęła wartości “wartość1″ i “wartość2″ (dla tego przykładu). Aby móc dobrze wykorzystać tą składnię warto jest dokładnie wiedzieć jak ona działa. Instrukcje są przetwarzane linia po linii. Parser przechodzi do pierwszej linii “case” pasującej do zmiennej. Następnie przetwarzane są wszystkie linie wewnątrz nawiasów klamrowych aż do napotkania instrukcji break – nawet jeśli po drodze znajdują się instrukcje “case”.

Przekazywanie danych między stronami

Formularze

Jeśli użytkownik musi podać jakieś dane (np. w celu dodania ich do bazy danych), to jedyną metodą jest pobranie ich ze standardowego formularza HTML. W większości języków programowania należy używać dodatkowych bibliotek aby uzyskać dostęp do danych przesyłanych z formularza. W PHP zostało to maksymalnie uproszczone. Wszystkie dane z formularza trafiają do odpowiednich tablic asocjacyjnych o nazwach kluczy takich, jak nazwy pól formularza. Jeśli w konfiguracji PHP włączona zostanie opcja register_globals (jest ona domyślnie wyłączona od wersji 4.2.0), to stworzone zostaną od razu zmienne o nazwach takich jak nazwy pól formularza.

Są dwie metody przekazywania parametrów do innych stron: metoda “GET” i metoda “POST”. Metody GET używa się kiedy parametrów jest niewiele. Dzieje się tak ponieważ parametry przekazuje się za pomocą adresu URL (np. http://www.coś.pl/strona.php?parametr1=wartość1¶metr2=wartość2), którego długość jest ograniczona. Należy też pamiętać że parametry są widoczne w pasku adresu przeglądarki, więc tej metody nie należy używać jeśli przekazywane są np. hasła. Jak widać, sam adres od parametrów oddzielany jest za pomocą znaku zapytania, a kolejne pary parametr=wartość za pomocą znaku ampersand (“&”). Tą metodę można wykorzystać także przy przekazywaniu parametrów przez odnośnik (zobacz dalej).

Metoda “POST” do przekazywania parametrów wykorzystuje nagłówek zapytania – wystarczy wiedzieć, że metoda ta umożliwia przekazywanie dużo większych parametrów, a także że parametrów nie widać w pasku przeglądarki.

Zależnie od metody, zmienne trafiają do odpowiednich tablic asocjacyjnych. Dane przesłane metodą GET trafiają do tablicy $_GET (lub $HTTP_GET_VARS w wersjach starszych niż 4.1.0) a dane z metody POST to tablicy $_POST (lub $HTTP_POST_VARS). Tablice $_GET i $_POST są superglobalne. Oznacza to, że są widoczne w każdym miejscu kodu PHP bez konieczności użycia składni globals.

Przykład 7.1. Odczytywanie wartości z formularza

Plik jeden.html

<html>
 <head>
  <title>

   Test formularza
  </title>
 </head>
 <body>
 <form action="dwa.php" method="GET">
  Imię: <input type=text name="imie"/><br/>

  Nazwisko: <input type=text name="nazwisko"/><br/>
  Proszę o fakturę do zamówienia: <input type=checkbox name="faktura"/><br/>
  Chcę zamówić:<br/>
  <input type=radio name=zamow value="kola"/>Coca-colę<br>

  <input type=radio name=zamow value="fanta"/>Fantę<br>
  <input type=radio name=zamow value="sprite"/>Sprite'a<br>
  <input type=submit value="Wyślij"/>
  </form>
 </body>

</html>

Plik dwa.php

<html>
 <head>
  <title>
   Wyniki
  </title>
 </head>

 <body>
  Imię: <?php echo $_GET['imie']?><br>
  Nazwisko: <?php echo $_GET['nazwisko']?><br>
  Faktura: <?php echo ($_GET['faktura'] == 'on' ? 'Tak' : 'Nie')?><br>

  Zamówienie: <?php switch($_GET['zamow']){
   case "kola":
     echo "Coca-cola";
     break;
   case "fanta":
     echo "Fanta";
     break;
   case "sprite":
     echo "Sprite";
     break;
   }
?>
 </body>
</html>

Upload plików

Często zachodzi też potrzeba przekazania jakiegoś pliku na serwer, na przykład dodając zdjęcie do galerii. Plik przesyła się korzystając z pola formularza typu “file”. Należy pamiętać o tym, że w tagu otwierającym formularz musi znaleźć się parametr ENCTYPE=”multipart/form-data” a formularz musi być wysyłany metodą POST. Na stronie do której został wysłany formularz dostępna będzie wielowymiarowa tablica asocjacyjna $_FILES ($HTTP_POST_FILES w starszych wersjach PHP), której pierwszym wymiarem będą pola typu file z formularza (klucze są nazwami tych pól), a w drugim informacje o przesłanym pliku.

Informacje o przesyłanym pliku

tmp_name
nazwa tego pliku na serwerze wraz ze ścieżką; używając tego pola można uzyskać dostęp do przesłanego pliku
name
nazwa pliku jaką posiadał u użytkownika
type
typ MIME pliku, np. text/plain lub image/gif; informacja ta jest dostępna tylko jeśli przeglądarka klienta dostarczyła takiej informacji.
size
wielkość pliku w bajtach

Dokładniejsze informacje wraz z przykładami użycia znajdują się w rozdzialeOdbieranie plików od użytkownika.

Odnośniki

Istnieje możliwość przekazywania niedużej liczby parametrów za pomocą zwykłych odnośników dostępnych w języku HTML. W takim przypadku wykorzystuje się metodę GET – konstruuje się odnośnik, na końcu którego należy umieścić znak zapytania a po nim oddzielone ampersandami pary parametr=wartość, np: <a href=”strona.php?imie=Franek&nazwisko=Kowalski”>Kliknij tu</a>

Cookies

Metodą nie tyle przekazywania parametrów, co przechowywania niewielkich ilości danych na komputerze oglądającego stronę (np. informacje o imieniu i nazwisku lub nazwie użytkownika w tym serwisie) jest mechanizm cookies (ciasteczka). Ciasteczka ustawione przez dany serwis dostępne są tylko dla niego i ustawiane są na jakiś czas.

Ciasteczka przekazywane są za pomocą nagłówków HTTP. Muszą być one wysłane zanim do przeglądarki zostanie wysłana jakakolwiek inna treść. W związku z tym przed zapisaniem ciasteczka nie może być żadnego wywołania funkcji echo i pochodnych, a także tag otwierający tryb PHP musi być pierwszymi znakiami w pliku – nie może być żadnej spacji ani pustych wierszy. Ograniczenie to można obejść używając buforowania wyjścia – po szczegóły odsyłam do podręcznika PHP.

PHP automatycznie odczytuje ciasteczka i zamienia je na zmienne. Są one przechowywane w superglobalnej tablicy asocjacyjnej $_COOKIE (dawniej $HTTP_COOKIE_VARS), w której kluczami są nazwy ciasteczek. Ciasteczka ustawia się je pomocą funkcji setcookie( nazwa, wartość, czas_wygaśnięcia, ścieżka, domena, bezpieczeństwo). Tylko pierwszy parametr jest niezbędny. Oznacza on nazwę cookiesa – taką nazwą będzie miała zmienna stworzona przez PHP po ponownym odczytaniu ciastek. Funkcja parametru “wartość” jest chyba oczywista – taka wartość będzie przechowana w ciasteczku o podanej nazwie. Parametr czas_wygaśnięcia oznacza czas, po jakim ciastko zostanie skasowane. Czas ten należy podać jako ilość sekund od 1.1.1970 – tak jest przechowywany czas w systemach UNIX’owych. Aktualny czas w tym formacie zwracany jest przez funkcjętime(). Jeśli cookie ma być trzymany przez godzinę, to do czasu zwróconego przez time() należy dodać ilość sekund zawartych w godzinie – “time() + 3600″. Podobnie należy postępować w przypadku innych przedziałów czasu.

Przedziały czasu dla funkcji setcookie

  • godzina – time()+3600
  • dzień – time()+86400
  • miesiąc – time()+30*86400

Jeśli czas będzie wcześniejszy niż aktualny czas, ciasteczko zostanie skasowane. Jeśli będzie równy zero – ciasteczko będzie ważne tylko do zamknięcia przeglądarki.

Dwa następne parametry używane są do wskazania adresu, dla którego dostępne będą cookiesy. Jeśli ostatni parametr jest ustawiony na 1, to cookie będzie przesłany za pomocą szyfrowanego połączenia HTTPS.

Standardowo nie ma możliwości przechowywania tablic w ciasteczkach, lecz można to zrobić “na około”. Przed zapisaniem tablicy w ciasteczku należy użyć funkcjiserialize(). Zamienia ona tablicę na ciąg znaków. Do ponownego odczytania takiej tablicy służy funkcja unserialize().

Przykład 7.2. Serializacja i deserializacja tablicy

<?php
// zapis
$tablica = Array('a' => 'pierwszy', 'b' => 'drugi');
setcookie('tablica', serialize($tablica), time()+3600);

// odczyt zabezpieczony przed nieistniej±cym ciasteczkiem
if (isset($_COOKIE['tablica'])) {
    $tablica = unserialize($_COOKIE['tablica']);
} else {
    $tablica = Array();
}

?>

W PHP nowszych od 4.1.0 istnieje jeszcze superglobalna tablica $_REQUEST, która łączy w sobie tablice $_GET$_POST$_COOKIE i $_FILES.

register_globals

PHP posiada możliwość ustawienia w pliku konfiguracyjnym php.ini dyrektywyregister_globals. Jest ona odpowiedzialna za rejestrowanie danych otrzymanych z formularzy, ciastek, sesji czy serwera jako zmienne globalne. Oznacza to, że jeśli dyrektywa register_globals została ustawiona na on to wszystkie zmienne przekazane do skryptu dostępne są w postaci $nazwa_zmiennej, bez potrzeby stosowania żadnych tablic. Wydaje się to wygodniejsze i łatwiejsze, lecz powoduje pewne niebezpieczeństwo. Mianowicie używając zmiennych globalnych nie można stwierdzić, czy dana wartość pochodzi z sesji czy może została podana w URLu metodą GET. Przy źle napisanych skryptach można tak obchodzić zabezpieczenia.

W związku z powyższym, używanie odpowiednich tablic jest mocno zalecane. Ostatnio twórcy PHP dodali do tego jeszcze jeden powód. Począwszy od wersji 4.2.0, dyrektywa register_globals jest domyślnie wyłączona. Tak więc pisząc skrypt dla nieznanego serwera trzeba się liczyć z ewentualnością braku dostępu do zmiennych globalnych.

Z czasem pojawi się coraz więcej materiałów.

materiał z strony phpkurs.pl