stron WWW
Piotr Bolek
W artykule jest opisany język PHP – jedno z narzędzi umożliwiających realizację interaktywnych stron internetowych. Podana jest ogólna charakterystyka tego narzędzia oraz kilka prostych przykładów ilustrujących możliwości jakie daje PHP
twórcom serwisów WWW.
1
Charakterystyka PHP
PHP jest językiem skryptowym, który jest przeznaczony do dynamicznego generowania stron HTML. Język ten jest zanurzony w HTML-u, więc w przeciwieństwie do CGI przy korzystaniu z PHP nie ma potrzeby pisania oddzielnych skryptów generujących cały HTML-owy kod strony. Aby skorzystać z PHP piszemy zwykłą stronę w języku HTML i umieszczamy w niej polecenia, które będą wykonane przez interpreter PHP.
Jest więc to nieco podobne do działania skryptów w języku Javascript z tym, że polecenia wykonywane są po stronie serwera WWW (przez specjalny moduł), a nie przez przeglądarkę internetową. Używając PHP mamy podobnie jak w przypadku CGI dostęp do wszelkich informacji i danych związanych z żądaniem HTTP, a więc do wartości wpisanych przez użytkownika pól formularzy, nagłówków HTTP, danych typu cookie.
PHP jest językiem wzorowanym na znanych i powszechnie używanych językach takich jak Java, Perl i C. Dlatego używanie PHP nie powinno być problemem nawet dla niezbyt wprawnych programistów. Zaletą PHP jest możliwość używania wielu bibliotek, które można dołączyć do interpretera PHP. Przede wszystkim z PHP można łatwo korzystać z zasobów z różnych baz danych – od najprostszych – płaskich plików dbm i dBase, do prawdziwych systemów bazodanowych zarówno bezpłatnych jak i komercyjnych: msql, MySQL, Postgres, Sybase, Informix, Oracle. Dzięki możliwości używania interfejsu ODBC możliwe jest nawet sięganie do baz danych działających w systemach Windows. W przypadku używania PHP do integracji baz danych z system WWW zapytania są realizowane w języku SQL.
Używając PHP mamy dostęp do informacji graficznych pojawiających się na stronach WWW. Jako minimum można uzyskać informacje o rozmiarach umieszczanych na stronach WWW plików graficznych (np. pobieranych z baz danych). Po skompilowaniu PHP z interfejsem do biblioteki GD mamy możliwość dynamicznego generowania lub modyfikowania plików GIF.
Dzięki możliwości konsolidacji PHP z bibliotekami ClibPDF oraz PDFlib, możliwe jest także dynamiczne generowanie dokumentów PDF, bez konieczności przechodzenia przez język Postscript i z pominięciem procesu destylacji. Pozwala to efektywnie generować na żądanie dobrej jakości dokumenty nadające się do druku – mogą to Magazyn Linux & Unix nr 10/99
1–1
PHP – dynamiczne generowanie stron WWW
być rachunki lub faktury, raporty z baz danych – np. rozkłady jazdy, zajęć lub terminarze, nadające się do druku wykresy itp.
PHP jest dystrybuowane ze szczegółową dokumentacją w formacie HTML. W sieci można także znaleźć tę dokumentację w innych formatach np. PDF.
2
Instalacja i konfiguracja
Aktualną wersję PHP można znaleźć na stronach WWW poświęconych temu narzędziu: http://www.php.net. W czasie pisania tego artykułu najświeższą dostępną wersją była 3.0.12. Dostępne są już także pakiety beta PHP w wersji 4.
Nowa wersja jest oparta o interpreter o nazwie Zend i jak piszą autorzy jest znacznie wydajniejsza od swoich poprzedników. Przykłady prezentowane w tym artykule były testowane z interpreterami PHP w wersjach 3.0.12 i 4.0b2 (wersja beta) z serwerem WWW Apache v. 1.3.9.
Szybki sposób instalacji PHP jako modułu serwera Apache opisany jest na początku pliku INSTALL w pakiecie dystrybucyjnym PHP. Ułatwieniem może być skorzystanie ze skryptu setup znajdującego się w głównym katalogu źródłowym PHP. Skrypt ten zadaje pytania na temat pożądanej konfiguracji i na koniec wywołuje właściwy skrypt konfiguracyjny configure. Najlepszym rozwiązaniem (głównie ze względu na wydajność) jest skompilowanie PHP jako modułu serwera WWW, możliwe jest jednak także używanie PHP za pośrednictwem interfejsu CGI.
Po instalacji możliwe jest konfigurowanie interpretera PHP za pośrednictwem pliku konfiguracyjnego php3.ini, którego domyślnym katalogiem jest /usr/local/lib/.
Modyfikując zawartość tego pliku można spowodować np., ładowanie „bibliotek”
z kodem PHP (np. definicjami używanych na wszystkich stronach funkcji) przed interpretowaniem zawartości strony WWW. Można także określać sposób prezentacji informacji o błędach na przetwarzanych stronach. Pełny opis poleceń konfiguracyjnych można znaleźć w dokumentacji.
3
Kod PHP w plikach HTML
Istnieją cztery sposoby umieszczania kodu PHP w plikach HTML: 1.
<? echo ("Najprostszy, jako ,,SGML processing instruction’’\n"); ?> 2.
<?php echo("Jawne wskazanie języka\n"); ?>
3.
<script language="php">
echo ("Jako zawartość elementu ,,script’’");
</script>
1–2
Magazyn Linux & Unix nr 10/99
PHP – dynamiczne generowanie stron WWW
4.
<% echo ("Sposób opcjonalny (ASP-style)"); %> Drugi i trzeci sposób są dostępne zawsze. Pierwszy i czwarty muszą być jawnie włączone, w momencie kompilacji, albo przez odpowiedni zapis w pliku konfiguracyjnym. Ostatni sposób jest dostępny począwszy od wersji 3.0.4.
Kolejne instrukcje kodu PHP są rozdzielane średnikami podobnie jak w C czy w perlu. Etykieta zamykająca blok kodu PHP (”?>”) także oznacza koniec instrukcji, więc ostatnia instrukcja w bloku nie musi być zakończona średnikiem, nawet jeśli nie jest to ostatni blok PHP w pliku.
Komentarze w kodzie PHP można tworzyć tak samo jak w języku C++ i w shellu (perlu) czyli jako komentarze blokowe (/* ... */) albo komentarze wierszowe (na prawo od // lub #). Komentarze blokowe nie mogą być zagnieżdżane.
4
Typy danych i zmienne
W PHP dostępne są wszystkie typowe typy danych:
•
liczby całkowite,
•
liczby zmiennoprzecinkowe,
•
ciągi znaków,
•
tablice, które są właściwie z założenia tablicami asocjacyjnymi, ale mogą być używane jako zwykłe tablice czy listy,
•
obiekty.
Zmienne są oznaczane podobnie jak w perlu – zawsze zaczynają się od znaku $
(uwaga użytkownicy perla – także tablice używane w kontekście listowym). Podobnie jak w innych językach skryptowych zmienne nie muszą być deklarowane, a ich typ może zmieniać się dynamicznie w zależności od kontekstu:
<?php
$b[] = $a~= 10;
# liczba całkowita:
10
$b[] = $a~.= "abc";
# ciąg znaków:
"10abc"
$b[] = $a~+= .1;
# liczba rzeczywista:
10.1
$b[] = $a~-= "4 słonie"; # liczba rzeczywista:
6.1
$b[] = $a~.= "Bzz";
# ciąg znaków:
"6.1Bzz"
$b[] = $a~+= "12 miesięcy"; # liczba całkowita:
18
?>
<table border=1 width=300 cellpadding=2>
<tr><th>Indeks<th>Wartość<th>Typ
<?php
while (list($key, $val) = each($b)) {
echo "<tr><td> $key <td> $val <td>" . gettype($val);
}
?>
</table>
Magazyn Linux & Unix nr 10/99
1–3
PHP – dynamiczne generowanie stron WWW
W powyższym przykładzie modyfikujemy zmienną $a, a jej kolejne wartości zapamiętujemy w tablicy $b (przypisanie do tablicy, bez podania indeksu powoduje dodawanie elementu na koniec tablicy z automatycznym zwiększeniem indeksu).
W komentarzu zaznaczony jest typ, jaki aktualnie ma zmienna oraz jej wartość.
Na koniec w pętli while wypisywane są kolejne zapamiętane wartości oraz ich typ. Wynik jest następujący (oczywiście jest to fragment zawartości strony WWW
prezentowanej w przeglądarce Netscape):
Na tym prostym przykładzie możemy zobaczyć także, jak łatwo jest łączyć efekt działania interpretera PHP z elementami strony HTML-owej. Zawartość tablicy $b umieszczamy tutaj w tabeli, której nagłówek jest zapisany jako fragment zwykłego kodu HTML-owego, a zawartość (kolejne wiersze i kolumny) jest wygenerowana dynamicznie.
5
Dostęp do danych „zewnętrznych”
Jako zmienne PHP dostępne są także wartości pochodzące spoza interpretera, takie jak wartości wpisane w pola formularzy, wartości zapamiętane jako cookie oraz wartości otrzymane w wyniku kliknięcia w pole formularzowe typu image. Wszystkie wymienione dane są automatycznie umieszczane jako wartości zmiennych PHP.
W przypadku formularzy możliwe jest automatyczne wpisywanie danych do tablic, co może być wygodne przy późniejszym przetwarzaniu danych. Oto przykład:
<form action="array.php3" method="post">
<table><tr><td>
Imię: <td> <input type="text" name="dane[imie]">
<td rowspan=3>
Języki: <br>
<select multiple name="jezyki[]">
<option value="pl">Polski
<option value="ru">Rosyjski
<option value="en">Angielski
<option value="fr">Francuski
<option value="ge">Niemiecki
</select>
<tr><td>
Nazwisko: <td> <input type="text" name="dane[nazwisko]">
<tr><td>
E-mail: <td> <input type="text" name="dane[email]"> 1–4
Magazyn Linux & Unix nr 10/99
PHP – dynamiczne generowanie stron WWW
<tr><td>
</table>
<input type="submit">
</form>
Powyższy fragment strony jest definicją prostego formularza. Są w nim zdefiniowane trzy pola tekstowe i jedno pole wyboru, z możliwością zaznaczenia wielu wartości.
Wszystkie wartości wprowadzone lub wybrane przez użytkownika są zapamiętywane w dwóch tabelach: dane – zapisanie poszczególnych pól do odpowiednich elementów tablicy asocjacyjnej oraz jezyki – tablica, która jest wykorzystana jako lista wartości. Przykładowy skrypt przetwarzający dane oraz wynik jego działania jest przedstawiony poniżej (znającym perla znajomy wyda się zapewne ostatni wiersz przykładu):
<h1>Dane</h1>
<?php
while (list($key, $val) = each($dane)) {
echo "$key => $val<br>";
}?>
<h1>Języki</h1>
<?php
print(join(", ", $jezyki));?>
6
Przykład – dostęp do bazy
danych
Na koniec przedstawiony będzie prosty przykład zastosowania PHP pokazujący jak można wykorzystać to narzędzie do realizacji webowego interfejsu do bazy danych.
Przykład jest skrajnie uproszczony, ale pokazuje sposób realizacji dostępu do funkcji Magazyn Linux & Unix nr 10/99
1–5
PHP – dynamiczne generowanie stron WWW
bazodanowych z poziomu PHP. Nasz przykładowa baza danych to MySQL, w której mamy jedną prostą tabelę zawierającą cztery pola (id, imie, nazwisko, email).
Pierwsze pole jest kluczem głównym tabeli, który jest automatycznie zwiększany przy każdej operacji dodania wiersza do tabeli (specyfika MySQL).
Formularz wejściowy jest uproszczoną wersją formularza z poprzedniego przykładu:
<form action="save.php3" method="post">
<table>
<tr><td> Imię: <td> <input type="text" name="dane[imie]">
<tr><td> Nazwisko: <td> <input type="text" name="dane[nazwisko]">
<tr><td> E-mail: <td> <input type="text" name="dane[email]">
</table>
<input type="submit">
</form>
Strona, która jest wywołana po wciśnięciu przycisku Submit może być następująca:
<?php
list($i,$n,$e)=array($dane["imie"], $dane["nazwisko"], $dane["email"]); $conn=mysql_pconnect("localhost","piotrek"); mysql_db_query("phptest", "insert dane (imie,nazwisko,email) values (’$i’, ’$n’, ’$e’)", $conn);
if (mysql_affected_rows($conn)==1) {
print "Zapisane dane:<br>Imię: <b>$i</b><br> Nazwisko: <b>$n</b><br>
E-mail: <b>$e</b><br>";
} else {
print "Były problemy...";
}
?>
<a~href="input.html">Powrót do formularza</a> W pierwszym wierszu kodu PHP obsługującego formularz, kopiujemy zawartość danych z formularza, do zmiennych $i, $n i $e – zabiegu tego dokonujemy wyłącznie w celu uproszczenia zapisu dalszej części kodu. Kolejne dwie instrukcje powodują połączenie się z serwerem MySQL oraz przekazanie mu zapytania w języku SQL, powodującego zapisanie nowego wiersza w tabeli. Po sprawdzeniu, że wiersz został
zapisany, na stronie wyświetlone są zapisane dane, albo w razie problemów stosowny komunikat.
Po wpisaniu kilku wierszy do bazy danych chcielibyśmy oczywiście przejrzeć jej zawartość. W tym celu możemy wykorzystać kolejny prosty skrypt PHP:
<table width="400" border="1">
<tr><th>Lp.<th>Imię<th>Nazwisko<th>E-mail</tr>
<?php
$conn=mysql_pconnect("localhost","piotrek"); $res=mysql_db_query("phptest","select * from dane order by id"); while($data=mysql_fetch_row($res)) {
print "<tr><td>";
1–6
Magazyn Linux & Unix nr 10/99
PHP – dynamiczne generowanie stron WWW
print join ("<td>", array($data[0],$data[1],$data[2],
"<a~href=’mailto:$data[3]’>$data[3]</a>"));
}
?>
</table>
W tym skrypcie możemy zobaczyć jeden ze sposobów pobierania danych z bazy danych w PHP. Tutaj kolejne wiersze są wczytywane do tablicy ($data). Podobnie jak w jednym z poprzednich przykładów dane są prezentowane w tablicy HTML-owej.
Dostęp do innych baz danych z PHP jest bardzo podobny. Dla przykładu poniżej jest pokazany skrypt pokazujący zawartość tej samej prostej tabeli zapamiętanej w systemie PostgreSQL.
<table width="400" border="1">
<tr><th>Lp.<th>Imię<th>Nazwisko<th>E-mail</tr>
<?php
$conn=pg_pConnect("", "", "", "", "phptest"); $res=pg_Exec($conn,"select * from dane order by id"); while($i<pg_NumRows($res)) {
$data=pg_fetch_row($res,$i++);
print "<tr><td>";
print join ("<td>", array($data[0],$data[1],$data[2],
"<a~href=’mailto:$data[3]’>$data[3]</a>"));
}
?>
</table>
Różnice są jak widać niemal kosmetyczne. Jak widać nie da się jednak niestety łatwo zrealizować uniwersalnych skryptów mogących służyć do komunikacji z różnymi bazami danych, bez konieczności pisania oddzielnego kodu dla każdego systemu baz danych. W takim przypadku można by spróbować wykorzystać obiektowe możliwości języka, albo zmienić narzędzie i zrealizować interfejs w perlu z wykorzystaniem pakietu DBI, ale to są już tematy na zupełnie inne artykuły.
Magazyn Linux & Unix nr 10/99
1–7