Podstawy PHP

Słowo o sprawie

Oczekiwana jest elementarna znajomość HTML i abstrakcyjnych pojęć podstaw programowania (zmienne, tablice, pętle, warunki itp.)

Do wypróbowywania skryptów niezbędne będzie stanowisko z zainstalowanym serwerem WWW i odpowiednią dla systemu dystrybucją PHP. Dla Win32 serwerem może być dołączany do instalacyjnego CD Win9x Personal Web Server (PWS); dla NT - Internet Information Server (IIS); dla systemów unixowych (w tym Linux) serwer APACHE, który również ma swoją wersję pod Win9x. Godny uwagi jest pakiet PHPDEV – kombajn w składzie Apache + PHP + MySQL + Perl + Dodatki (osiągalny pod adresem: http://www.firepages.com.au). Sam PHP osiągalny jest pod adresem http://www.php.net.

Czym są skrypty PHP?

PHP (Hypertext Preprocessor) jest zagnieżdżonym w HTML językiem skryptowym działającym po stronie serwera.

Oznacza to, że:

Mozliwości PHP:

Stanowiąc integralną część strony WWW, skrypty PHP są w użyciu wygodniejsze niż CGI, Perl, ...

Nazwy plików

Rozszerzenie w nazwach plików zawierających skrypty ustala administrator serwera WWW. Zwykle są to .PHP, czasem .PHTML.

Zagnieżdżanie skryptów

Fragment dokumentu, który ma zastać rozpoznany przez serwer WWW jako skrypt PHP, zapisać można na 4 sposoby:

1. <?echo(„To jest postać najprostsza, na modłę SGML\n”);?>
2. <?php echo(„ta postać używana jest w połączeniu z XML\n”);?>
3. <script language="php">
    echo(„czasem edytor toleruje tylko taką postać\n”);
   </script>
4. <%echo(„postać na modłę skryptów ASP\n”);%>

Postać trzecia zalecana jest w przypadku używania edytorów HTML nie tolerujących innej składni, (np. FrontPage).

Przykład
<HTML>
<HEAD>
 <TITLE>Piosenka o ...</TITLE>
<HEAD>
<BODY>
 <P>Jeśli wszystko pójdzie dobrze</P>
 <? echo("<P>Szła dzieweczka do laseczka</P>\n"); ?>
 <P>W oknie przeglądarki powinny być trzy akapity – jeden z „dzieweczką” :-)</P>
</BODY>
</HTML>

Procedura standardowa echo() powoduje wygenerowanie i umieszczenie w treści dokumentu łańcucha znaków równego co do wartości argumentowi umieszczonemu w nawiasach.

Separatory

Poszczególne instrukcje skryptu oddziela się znakiem średnika. Zamknięcie sekcji skryptu: ?>  jest jego ekwiwalentem.

Komentarze

Komentarz, czyli tekst ignorowany przez interpreter PHP oznaczany jest tak jak w języku C – parą sekwencji znaków /*, znakiem # lub // jeśli nie zajmuje wiecej niż jednej linii np:

# komentarz w jednej linii
echo("Przykład pierwszy");  // to też komentarz jednoliniowy
/* komentarz w dowolnej
   liczbie linii */

Zmienne

Zmienne w PHP nie wymagają deklaracji. Ich typ jest determinowany podczas pierwszego przypisania wartości. W razie potrzeby dokonywana jest konwersja typu.

Identyfikator zmiennej obowiązkowo zaczyna się znakiem $.

Przykład
$a=17;
$b="Liczba Avogadro";
$c=3.14;
$d=0.0;

PHP obsługuje następujące typy zmiennych:

Łańcuchy znaków ujmuje się w cudzysłowy. W razie potrzeby umieszczenia w tekście niektórych znaków należy posłużyć się specjalną sekwencją:

sekwencja
znaczenie
\n
koniec linii
\r
karetka
\t
tabulacja
\\
backslash
\$
dolar
\"
cudzysłów

Wewnątrz tekstu można też użyć zdefiniowanych wcześniej zmiennych:

$a=1;
$b=2;
$c="plus";
$d="daje";
$e="$a $c $b $d ”.($a+$b);
echo($e);

Efektem będzie napis: "1 plus 2 daje 3".

W powyższym przykładzie dokonała się konwersja typów numerycznych na łańcuchowe. Operatorem konkatenacji (dodawania łańcuchów) jest kropka

Inne przykłady konwersji typów:
$x = 1 + "1.5";           // $x jest double (2.5)
$x = 1 + "-2.2e3";        // $x jest double (-2199)
$x = 1 + "ala-1.3e3";     // $x jest integer (1)
$x = 1 + "ala3";          // $x jest integer (1)
$x = 1 + "10 pączków";    // $x jest integer (11)
$x = 1 + "10 pączków";    // $x jest integer (11)
$x = "10.0 kotów" + 1;    // $x jest integer (11)
$x = "10.0 kotów" + 1.0;  // $x jest double (11)

Tablice

Utworzenie tablicy następuje po przypisaniu wartości któremuś z jej elementów:

$tablica[0]="wartość A";
$tablica[1]="wartość B";
$tablica[2]="wartość C";

Jako indeksu można użyć innej zmiennej, np.

$indeks=3;
$tablica[$indeks]=27;

Dołączenie nowego elementu na końcu tablicy:

$tablica[]=200;    // równoważne: $tablica[4]=200;

Operatory i wyrażenia

Operatory arytmetyczne

działanie
operator
dodawanie
+
odejmowanie
-
mnożenie
*
dzielenie
/
reszta z dzielenia
%

Operator łączenia łańcuchów (konkatencji)

Operatorem służącym do łączenia łańcuchów jest znak kropki.

Przykład
$lan1=”Cześć”;
$lan2=”!!!”;
$lan3=$lan1.$lan2;    //$lan3=”Cześć!!!”

Działania na zmiennych:

$a=5;             # instrukcja podstawienia
$b=$a+2;          # $b ma wartość 7
$b=$b+3;          # $b ma wartość 10
$b+=3;            /* działanie równoważne z poprzednim
                     ale zapisane w stylu języka C */
$c=$a+3*($b-$a);  # bardziej złożone działanie
$t=”Cześć”;       # podstawienie łańcucha znaków
$t=$t.”!!!”;      #dołączenie łańcucha; efekt :”Cześć!!!” 
$t.=”!!!”;        # j.w. ale w stylu języka C

Łączona instrukcja przypisania:

$a=$b=5;

Kolejność przypisania w powyższym wyrażeniu: od prawej do lewej strony wyrażenia.

Operatory porównania

znaczenie
operator
równe
==
równe i o zgodnych typach
===
nierówne
!=
mniejsze
<
większe
>
większe lub równe (nie mniejsze)
>=
mniejsze lub równe (nie większe)
<=

Wyrażenia zawierające operatory logiczne mają wartość prawda lub fałsz.

$a==$b    /*prawda gdy $a i $b są równe;
            odróżniać od podstawienia $a=$b (!)*/
$a>$b     //prawda gdy $a jest większe od $b
$a>=$b    //prawda gdy $a jest większe lub równe $b
$a<=$b    //prawda gdy $a jest mniejsze lub równe $b
$a!=$b    //prawda gdy $a i $b są różne.

Operatory inkrementacji i dekrementacji

przykład
znaczenie
wynik
++$a
Preinkrementacja
Zwiększa $a o 1, po czym zwraca $a.
$a++
Postinkrementacja
Zwraca $a, po czym zwiększa $a o 1.
--$a
Predekrementacja
Zmniejsza $a o 1, po czym zwraca $a.
$a--
Postdekrementacja
Zwraca $a, po czym zmniejsza $a o 1.
Przykład
<?
echo "<h3>Postinkrementacja</h3>";
$a = 5; 
echo "Powinno dać 5: ".$a++."<br>\n";
echo "Powinno dać 6: ".$a."<br>\n";
 
echo "<h3> Preinkrementacja </h3>";
$a = 5; 
echo "Powinno dać 6: ".++$a . "<br>\n";
echo "Powinno dać 6: ".$a."<br>\n";
 
echo "<h3> Postdekrementacja </h3>";
$a = 5; 
echo "Powinno dać 5: ".$a--."<br>\n";
echo "Powinno dać 4: ".$a."<br>\n";
 
echo "<h3> Predekrementacja </h3>";
$a = 5; 
echo "Powinno dać 4: ".--$a."<br>\n";
echo "Powinno dać 4: ".$a."<br>\n";
?>

Operatory logiczne

Przykład
Znaczenie
Wynik
$a and $b
logiczne “i”
Prawda jeśli $a i $b są prawdziwe.
$a or $b
logiczne “lub”
Prawda jeśli $a lub $b jest prawdziwe.
$a xor $b
róznica symetryczna
Prawda jeśli tylko $a lub tylko $b jest prawdziwe.
! $a
negacja
Prawda jeśli $a jest nieprawdziwe.
$a && $b
jak AND
Prawda jeśli $a i $b są prawdziwe.
$a || $b
jak OR
Prawda jeśli $a lub $b jest prawdziwe.

Instrukcje sterujące

Blok instrukcji {...}

W sytuacji gdy istnieje potrzeba potraktowania ciagu kolejnych czynności wykonywanych przez skrypt jako jednego integralnego bloku (ekwiwawentu jednej dużej instrukcji złożonej) należy ten ciąg ująć w parę nawiasów klamrowych. Spełniają one tę sama rolę co w Pascalu słowa kluczowe Begin...End.

Instrukcje warunkowe

Instrukcja warunkowa prosta if

Składnia

if (wyrażenie_logiczne) instrukcja;

if (wyrażenie_logiczne) {
  instrukcja1; 
  instrukcja2;
  instrukcja3;
}

Jeśli wyrażenie logiczne jest prawdziwe wykonywana jest instrukcja (składnia 1) lub zbiór instrukcji w nawiasach klamrowych (składnia 2) po wyrażeniu logicznym

Przykład
if ($a > $b) echo("a jest większe od b");
if ($a > $b) {
  $lan1=”a jest”;
  $lan2=” większe”;
  $lan3=” od b!”;
  echo($lan1.$lan2.$lan3);
}

Instrukcja warunkowa z alternatywą (if…else)

Składnia
if (wyrażenie_logiczne) {
  instrukcja1;
}
else {
  instrukcja2;
}

Jeśli warunek nie jest spełniony (wyrażenie logiczne jest fałszywe) wykonywana jest instrukcja lub ciąg instrukcji (w klamrach) po słowie kluczowym else.

Przykład
if ($a > $b) {
  echo(“a jest większe od b”);
}
else {
  echo(„a nie jest wieksze od b”);
}

Instrukcja warunkowa z alternatywnym warunkiem (if…elseif…else)

Składnia
if (wyrażenie_logiczne1) {
  instrukcja1;
  instrukcja2;
}
elseif (wyrażenie_logiczne2) {
  instrukcja3;
  instrukcja4;
}
else {
  instrukcja5;
  instrukcja6
}

Jeśli wyrażenie logiczne po słowie if jest prawdziwe, wykonywane są kolejne instrukcje aż do słowa elseif; w przeciwnym wypadku sprawdzane jest wyrażenie logiczne po słowie kluczowym elseif. Jeśli jest ono prawdziwe wykonują się instrukcje zamieszczone po nim, zaś w przeciwnym wypadku wykonują się instrukcje po słowie kluczowym else.

Można wielokrotnie zagnieżdżać konstrukcję elseif.

Przykład
if ($a > 10) {
  echo(“a jest większe od 10”);
}
elseif ($a>0) {
  echo(„a jest dodatnie i nie większe od 10”);
}
elseif ($a=0) {
  echo(„a jest zerowe”);
}
else {
  echo(„a jest ujemne”);
}

Pętle

Pętla warunkowa (while)

Składnia
while (wyrażenie_logiczne) {
  instrukcja1;
  instrukcja2;
}

Jest to konstrukcja pętli z kontrolą wykonania przed cyklem. Dopóki wyrażenie logiczne po słowie while jest prawdziwe cykl instrukcji jest powtarzany. W skrajnym przypadku, jeśli warunek wykonania nie jest spełniony już na początku pętli, ani jeden cykl nie zostanie wykonany.

Przykład
$i = 1; 
while ($i<=10) {
  echo($i.” wiersz<br>\n”);
  $i++;
}

Skrypt zamieści w dokumencie 10 ponumerowanych wierszy.

Pętla warunkowa (do…while)

Składnia
do {
  instrukcja1;
  instrukcja2;
} while (wyrażenie_logiczne);

Warunek powtórzenia cyklu pętli sprawdzany jest na końcu pętli. Nawet jeśli przed pętlą nie jest on spełniony to pierwszy cykl zostanie i tak wykonany.

Przykład
$i = 1; 
do {
  echo($i.” wiersz<br>\n”);
  $i++;
} while ($i<=10)

Skrypt zamieści w dokumencie 10 ponumerowanych wierszy.

Pętla (for)

Składnia
for (wyr1;wyr2;wyr3) {
instrukcja1;
instrukcja2;
}

Wyrażenie wyr1 obliczane jest bezwarunkowo i jednorazowo na początku działania instrukcji. Wyrażenie wyr2 obliczane jest na początku każdego cyklu. Cykl jest wykonywany jeśli wyr2 jest prawdziwe. W przeciwnym wypadku pętla kończy swe działanie. Wyrażenie wyr3 obliczane jest na końcu każdego cyklu.

Przykład
for ($i=1;$i<=10;$i++) {
  echo($i.” wiersz<br>\n”);
}

Skrypt zamieści w dokumencie 10 ponumerowanych wierszy.

Instrukcja przerwania (break)

Składnia
break;

Przerywa wykonanie instrukcji if, for, while, swich.

Przykład
for ($i=1;$i<=10;$i++) {
  echo($i.” wiersz<br>\n”); 
  if (($x/$i)<1) break;
}

Instrukcja wyboru (swich)

Składnia
switch (zmienna) {
 case wartość1: 
  instrukcja1;
  instrukcja2;
  break; 
 
 case wartość2: 
  instrukcja3;
  instrukcja4;
  break; 
 
 case wartość3: 
  instrukcja5;
  instrukcja6;
  break; 
 default:
  instrukcja7;
  instrukcja8;
  instrukcja9;
}

Instrukcja wyboru zastępuje wielokrotne użycie instrukcji warunkowych w przypadku gdy program reagować ma indywidualnie na konkretne wartości zmiennej wyboru. Wykonywane są instrukcje po słowie kluczowym case z adekwatną wartością zmiennej. Jeśli żadna wartość nie pasuje do zmiennej, wykonywane są instrukcje po słowie kluczowym default. Zamieszczanie sekcji default nie jest obowiązkowe.

Przykład
switch ($i) {
 case 0:
  echo("i równe 0");
  break;
 
 case 1:
  echo("i równe 1");
  break;
 
 case 2:
  echo("i równe 2");
  break;
 
 default:
   echo(“i inne niż 0,1 i 2”);
}

Instrukcja włączenia (include)

Składnia
include(„nazwa_pliku”);

Procedura standardowa include powoduje wstawienie do dokumentu zawartości pliku o nazwie podanej jako argument procedury. Rozszerzenie w nazwie pliku nie jest istotne.

Przykład
<?include(„plik.inc”);?>

Jeśli istnieje plik o nazwie „plik.inc” jego zawartość zostanie wpisana do wnętrza dokumentu w miejsce umieszczenia powyższego skryptu.

Skrypt można podzielić na części (moduły) i każdą zapisać w osobnym pliku dokonując tym samym modularyzacji kodu. W ciele dokumentu można wstawić potrzebny moduł w pożądane miejsce zamieszczając wywołanie procedury include z odpowiednią nazwą pliku jako argumentem. Pozwala to uniknąć wielokrotnego umieszczania tych samych skryptów w wielu dokumentach. W razie potrzeby, modyfikacja skryptu wykonywana jest w jednym miejscu, a nie w każdym dokumencie korzystającym z niego.

Inny sposób pożytecznego wykorzystania procedury include polega na jej użyciu do komponowania dokumentów składających się z pewnych stałych fragmentów. Jeśli wszystkie dokumenty w witrynie WWW składają się z identycznych nagłówków i stopek, a różnią się częścią środkową – wygodnie byłoby zapisać treść powtarzających się fragmentów w osobnych plikach, i składać całość dokumentu np. w następujący sposób:

<HTML>
<HEAD>
 <TITLE>Kompozycja 12</TITLE>
</HEAD>
<BODY>
 <?include(„naglowek.inc”);?> 
 <?include(„strona12.wew”)?>
 <?include(„stopka.inc”);?> 
</BODY>
</HTML>

Funkcje

Przykład definicji i wywołania funkcji:

Function fun1($x, $y)  //nagłówek funkcji fun1
{                      //ciało fukcji
 $x=$x/$y;
 echo($a);}
 
fun1(7, 2);      /*wywołanie funkcji;
                   zmienne $a i $b wewnątrz
                   funkcji otrzymają
                   wartości 7 i 2 */

Nagłówek funkcji zaczyna się od słowa kluczowego Function. Po nim następuje identyfikator funkcji i w nawiasie lista parametrów formalnych oddzielonych przecinkami. Następnie w nawiasach klamrowych należy zamieścić ciąg czynności, jakie funkcja ma wykonać. W celu wywołania funkcji podaje się jej nazwę i w nawiasach listę parametrów aktualnych. Jeżeli nie przekazuje się żadnych parametrów, po identyfikatorze funkcji umieszcza się pusty nawias. Pisanie skryptów zgodnie z przesłankami programowania strukturalnego (na co składa się m.in. modularyzacja i stosowanie funkcji) zwiększa czytelność programu. Jeśli czynności realizowane przez funkcje są wielokrotnie powtarzane – użycie funkcji redukuje rozmiary skryptów.

Zmienne w funkcjach

W poniższym przykładzie wartość zmiennej $a wewnątrz funkcji (lokalnej) nie ma nic wspólnego z wartością zmiennej $a podstawioną przed funkcją.

$a=5;
 
Function fun2() {
 echo($a);
}

Wskutek wykonania funkcji fun2(), w dokumencie pojawi się napis zgodny z przypadkową wartością zmiennej lokalnej $a.

Jeśli zmienna $a ma być zmienną globalną, a więc jeśli ma być widoczna wewnątrz funkcji, należy użyć deklaracji global:

$a=15;
 
Function fun3() {
 global $a;
 echo($a);
}
 
fun3();

W efekcie wykonania powyższego skryptu w dokumencie pojawi się liczba 15.

Jeżeli pierwsze przypisanie wartości do zmiennej następuje wewnątrz funkcji, to za każdym wywołaniem tej funkcji wartość zmiennej jest ustawiana od nowa:

Function fun4() {
 $a=12;
 echo($a);
 $a++;
}
 
fun4();
fun4();

Wykonanie skryptu wygeneruje podwójne pojawienie się identycznego zapisu. Jeżeli zmienna wewnątrz funkcji ma być inicjowana tylko raz i ma zachować swą wartość po zakończeniu działania funkcji użyć dyrektywy static:

Function fun5() {
 static $a=12;
 echo($a);
 $a++;
}
 
fun5();
fun5();

Tym razem w dokumencie pojawi się najpierw liczba 12, potem 13.

Zwracanie wartości

Funkcja może zwrócić wartość umieszczoną po słowie kluczowym return:

Function fun6($a) {
 return 10*$a;
}
 
$x=fun6(2);
echo($x);    // $x ma wartość 20

Użycie funkcji w powyższym skrypcie może mieć zwięźlejszą postać:

echo(fun(2));

Ewentualne instrukcje w funkcji zamieszczone po słowie return nie zostaną wykonane (!).

Obsługa formularzy

Jeśli skrypt ma obsłużyć formularz umieszczony w dokumencie HTML należy go odpowiednio przygotować.

Przykład
<FORM ACTION="skrypt.php" METHOD=POST>
 <INPUT TYPE=TEXT NAME=pole1><BR>     //pierwsze pole edycji
 <INPUT TYPE=TEXT NAME=pole2><BR>     //drugie pole edycji
 <SELECT NAME=lista>                  //lista wyboru
  <OPTION VALUE=1>pozycja A</OPTION>  //element listy
  <OPTION VALUE=2>pozycja B</OPTION>  //element listy
  <OPTION VALUE=3>pozycja C</OPTION>  //element listy
 </SELECT><BR>
 <INPUT TYPE=RADIO NAME=akcept
        VALUE="Tak">Tak<BR>           //pierwsze pole opcyjne
 <INPUT TYPE=RADIO NAME=akcept 
        VALUE="Nie">Nie<BR>           //drugie pole opcyjne
 <INPUT TYPE=CHECKBOX
        NAME=zgoda >Zgoda?<BR>        //pole wyboru
 <TEXTAREA NAME=tekst>
   Dłuższy tekst…
 </TEXTAREA><BR>
 <INPUT TYPE=submit VALUE="Wyślij"><BR> //przycisk “Wyślij”
</FORM>

Parametr ACTION powinien identyfikować dokument ze skryptem obsługującym formularz. Parametr METHOD może mieć wartość POST lub GET. Formularze wysyłane przez GET mają ograniczoną długość, a wysyłane prametry formularza są jawnie widoczne w łańcuchu znaków stanowiącym URL generowanego przez formularz żądania. Metoda POST ukrywa wysyłane parametry i umożliwia wysyłanie praktycznie nieograniczonych ilości danych. Ważne jest zdefiowanie identyfikatorów wszystkich potrzebnych w dalszej obróbce pól formularza. Służy do tego parametr NAME. W skrypcie PHP wartości pól formularza będą dostępne jako zmienne o nazwach zgodnych z nazwami odpowiednich pól formularza. Np.:

echo($pole1."<BR>");  // wyświetlenie wartości 
                      // pierwszego pola formularza
echo($pole2."<BR>");  // wyświetlenie wartości 
                      //drugiego pola formularza
echo($lista."<BR>");  // wyświetlenie wartości VALUE 
                      //dla wybranego elementu z listy
echo($akcept."<BR>");
if ($zgoda=="on") echo("zgoda<BR>");
else echo("niezgoda<BR>");
echo($tekst.”<BR>”);

Dla pól typu CHECKBOX wartością zmiennej będzie "on" jeżeli pole jest zaznaczone, lub zmienna będzie pusta jeżeli pole nie zostało zaznaczone. Dla pola SELECT zmienna będzie miała wartość parametru VALUE zdefiniowanego w znaczniku OPTION dla zaznaczonej pozycji w liście wyboru formularza. Dla pól typu RADIO wartość zmiennej odpowiada wartości parametru VALUE dla zaznaczonej na formularzu opcji.

Wysyłanie poczty

Funkcja mail umożliwia wysłanie wiadomości pocztą elektroniczną. Posiada 4 parametry:

Przykład:
mail("jackrat@el.pcz.czest.pl",
"Wiadmość testowa", 
"Tutaj można wpisać tresć wiadomości.");

Ten przykład wyśle wiadomość na mój adres.

Wysyłanie formularza pocztą

Fragment strony WWW z możliwością wysyłania poczty e-mail:

<FORM ACTION=skrypt.php METHOD=POST>
<INPUT TYPE=TEXT NAME=email><BR>
<INPUT TYPE=TEXT NAME=temat><BR>
<TEXTAREA NAME=wiadomosc>
 Tu wpisz wiadomość
</TEXTAREA><BR>
<INPUT TYPE=SUBMIT VALUE=”WYŚLIJ”>
</FORM>

Skrypt, który wyśle dane pocztą:

mail($email,$temat,$tresc,"Reply-To: $email");

Funkcja mail() zwraca TRUE jeśli udało się wysłać e-mail, w przeciwnym wypadku zwraca FALSE.

Uprawnienia

Skrypt PHP odwołujący się do pliku, musi mieć odpowiednie uprawnienia. Żeby móc ze skryptu zmodyfikować jakiś plik, trzeba nadać prawo zapisu wszystkim użytkownikom. Szczególy zależne są od serwera.

Otwieranie plików

Do otwarcia pliku słuzy funkcja fopen(). Posiada ona 2 parametry; są to: nazwa pliku i identyfikator trybu otwarcia. onastepujących możliwych postaciach: