Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00565 008488 10489552 na godz. na dobę w sumie
PHP. Praktyczne wprowadzenie - książka
PHP. Praktyczne wprowadzenie - książka
Autor: Liczba stron: 248
Wydawca: Helion Język publikacji: polski
ISBN: 83-7361-268-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).

Statyczne strony WWW tworzone w języku HTML nie zawsze spełniają oczekiwania twórców i odbiorców. Coraz częściej ich miejsce zajmują dynamiczne serwisy WWW oparte na bazach danych. Jednym z najpopularniejszych narzędzi do ich tworzenia jest język PHP. Jest to łatwy do opanowania język skryptowy działający po stronie serwera, dystrybuowany na zasadzie open source. Ponieważ ma ogromne możliwości, do tworzenia dynamicznych witryn WWW i aplikacji internetowych używają go setki programistów na całym świecie. Dzięki wiadomościom zawartym w tej książce łatwiej dołączyć do ich grona i napisać samodzielnie mechanizmy, na których opierają się dynamiczne witryny internetowe.

Książka 'PHP. Praktyczne wprowadzenie' ułatwia szybkie i bezproblemowe pokonanie dystansu pomiędzy statycznymi witrynami w języku HTML a dynamicznymi serwisami WWW w języku PHP. Na przykładzie prawdziwego projektu -- budowy dynamicznej witryny WWW -- pokazano, jak używać PHP do tworzenia wszystkich elementów takiej witryny. Autor książki, Urlich Günther, wykorzystując swoje doświadczenie dydaktyczne, przedstawia:

Nauczenie się zasad programowania w PHP to pierwszy krok do realizacji własnych projektów dynamicznych witryn WWW.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl PHP. Praktyczne wprowadzenie Autor: Ulrich Günther T³umaczenie: Piotr Bryja ISBN: 83-7361-268-8 Tytu³ orygina³u: PHP Ein praktischer Einstieg Format: B5, stron: 248 Statyczne strony WWW tworzone w jêzyku HTML nie zawsze spe³niaj¹ oczekiwania twórców i odbiorców. Coraz czêġciej ich miejsce zajmuj¹ dynamiczne serwisy WWW oparte na bazach danych. Jednym z najpopularniejszych narzêdzi do ich tworzenia jest jêzyk PHP. Jest to ³atwy do opanowania jêzyk skryptowy dzia³aj¹cy po stronie serwera, dystrybuowany na zasadzie open source. Poniewa¿ ma ogromne mo¿liwoġci, do tworzenia dynamicznych witryn WWW i aplikacji internetowych u¿ywaj¹ go setki programistów na ca³ym ġwiecie. Dziêki wiadomoġciom zawartym w tej ksi¹¿ce ³atwiej do³¹czyæ do ich grona i napisaæ samodzielnie mechanizmy, na których opieraj¹ siê dynamiczne witryny internetowe. Ksi¹¿ka „PHP. Praktyczne wprowadzenie” u³atwia szybkie i bezproblemowe pokonanie dystansu pomiêdzy statycznymi witrynami w jêzyku HTML a dynamicznymi serwisami WWW w jêzyku PHP. Na przyk³adzie prawdziwego projektu — budowy dynamicznej witryny WWW — pokazano, jak u¿ywaæ PHP do tworzenia wszystkich elementów takiej witryny. Autor ksi¹¿ki, Urlich Günther, wykorzystuj¹c swoje doġwiadczenie dydaktyczne, przedstawia: • Informacje o technologiach stosowanych do tworzenia witryn WWW • Podstawowe zasady programowania w jêzyku PHP • Tworzenie interaktywnych formularzy • Stosowanie funkcji i obiektów • Tworzenie mechanizmów korzystaj¹cych z baz danych • Dynamiczne generowanie elementów graficznych • Techniki wykrywania i usuwania b³êdów w skryptach Nauczenie siê zasad programowania w PHP to pierwszy krok do realizacji w³asnych projektów dynamicznych witryn WWW. Spis treści Słowo wstępne...................................................n...................................................n............5 Rozdział 1. A może PHP? ...................................................n...........................................7 Przewodnik po książce ...................................................k...................................................k.... .................8 Pożyteczne narzędzia...................................................k...................................................k..... ...................9 Rozdział 2. Podstawy techniczne ...................................................n............................15 Protokół HTTP (HyperText Transfer Protocol) ...................................................k.............................15 Dokumenty statyczne i dynamiczne ...................................................k...............................................25 Technologie wykonywania po stronie serwera ...................................................k.............................28 Zalety PHP...................................................k...................................................k............... .........................32 Rozdział 3. Podstawy HTML ...................................................n...................................35 Praktyczne wprowadzenie do HTML ...................................................k.............................................35 Strona główna witryny poświęconej zagrożonym ptakom z Nowej Zelandii ............................40 Rozdział 4. Wstęp do programowania: proste skrypty PHP ................................53 Skrypt PHP wyświetlający datę ...................................................k.......................................................53 Formularze dla danych wprowadzanych przez użytkownika ...................................................k...58 Przetwarzanie danych z formularza w skryptach PHP ...................................................k...............66 Skrypty PHP combo i include ...................................................k..........................................................87 Rozdział 5. Efektywne programowanie z wykorzystaniem funkcji i obiektów......95 Programowanie oparte na funkcjach...................................................k...............................................95 Plany rozbudowy witryny ...................................................k...................................................k.. ...........99 Programowanie obiektowe ...................................................k...................................................k.. ..........99 4 Spis treści Deklaracja klas dla strony WWW ...................................................k..................................................104 Technika zaawansowana: obiektowe combo datek ...................................................k....................123 Rozdział 6. PHP i bazy danych ...................................................n.............................131 Czym jest baza danych?.................................k...................................................k..................... .............131 Podstawowe informacje o bazach danych dla zastosowań opartych na PHP...........................134 Dostęp do baz danych z poziomu skryptu PHP ...................................................k.........................147 Dostęp do bazy danych a obiekty...................................................k..................................................149 Rozdział 7. PHP — ponowne zastosowanie obiektów ........................................169 Strona startowa dla skarbnika ...................................................k........................................................169 Edycja danych o datkach...................................................k...................................................k.. ............171 Lista datków ...................................................k...................................................k............. ......................179 Grafika w PHP ...................................................k...................................................k............ ...................186 Wskaźnik statusu kwoty datków...................................................k...................................................190 Rozdział 8. Inne pożyteczne techniki programowania.........................................197 Wysyłanie poczty elektronicznej...................................................k....................................................197 Microsoft Office a PHP ...................................................k...................................................k... ..............202 Liczby i matematyka w PHP ...................................................k...................................................k.......203 Spójność bazy danych ...................................................k...................................................k..... ..............208 Stosowanie zewnętrznych funkcji...................................................k..................................................212 Kilka słów na temat bezpieczeństwa...................................................k.............................................214 Poszukiwanie błędów podczas programowania...................................................k.........................219 Dodatek A Instalacja i konfiguracja oprogramowania .......................................225 Instalujemy serwer Apache i PHP ...................................................k.................................................225 Instalacja MySQL ...................................................k...................................................k......... ..................230 Instalacja aplikacji phpMyAdmin ...................................................k..................................................232 Dodatek B Zasoby sieci...................................................n...........................................233 Zasoby sieci na temat PHP...................................................k...................................................k...........233 Oprogramowanie...................................................k...................................................k........... ................234 Literatura uzupełniająca z serii O’Reilly...................................................k.......................................236 Skorowidz...................................................n...................................................n................237 Wstęp do programowania: proste skrypty PHP W rozdziale 2. Czytelnik spotkał się już z nazwą PHP. Wspomniano już, że skrypt PHP jest plikiem, który jest przechowywany na serwerze WWW. Przeglądarka może zażądać jego przysłania przez internet za pomocą zapytania HeTTP. Należy pamiętać, że dokument PHP składa się z kodu HTML ze specjalnymi znacznikami, zawierającymi kod PHP. Serwer przed wysłaniem pliku do przeglądarki przeszukuje dokument w poszukiwaniu tych znaczników. Znajdujący się pomiędzy nimi kod PHP (czyli zbiór poleceń PHP) jest przez serwer natychmiast wykonywany. Otrzymane z wy- konania kodu PHP dane wyjściowe są wstawiane w miejsce znaczników PHP w wyko- nywanym pliku. Bezpośrednio po przetworzeniu przez serwer danego pliku zostaje one wysłany jako od- powiedź do przeglądarki (HTTP response). Odpowiedź jest następnie odpowiednio inter- pretowana przez przeglądarkę, na ogół jako kod HTML strony WWW. Skrypt PHP wyświetlający datę Omówiony proces można zaprezentować za pomocą skryptu, który — tak jak inne pli- ki, stanowiące przykłady do niniejszej książki — znajduje się na serwerze wydawnictwa Helion (ftp://ftp.helion.pl/przyklady/phppwp.zip). Plik z kodem poniższego przykładu nosi na- zwę data.php: Listing 4.1. Kod pliku data.php ?php // Ten prosty skrypt wyświetla bieżącą datę i gordzinę. $dataiczas = getdate(); $rok = $dataiczas[ year ]; 54 Rozdział 4. Wstęp do programowania: proste skrypty PHP $miesiac = $dataiczas[ mon ]; $dzien = $dataiczas[ mday ]; $godziny = $dataiczas[ hours ]; $minuty = $dataiczas[ minutes ]; $sekundy = $dataiczas[ seconds ]; ? html head title Dzisiaj jest ?php echo $dzien. . .$miesiac. . annro domini .$rok; ? /title /head body h1 Na tym serwerze jest godzina ?php echo $godziny. : .$minuty. : .$sekundy; ? /h1 /body /html Po uruchomieniu tego pliku w przeglądarce, czyli po wpisaniu odpowiedniego adresu URL w polu adresowym przeglądarki, zostanie wyświetlona strona WWW, w tytule której można przeczytać bieżącą datę. W głównym oknie przeglądarki, obok tekstu zapisanego w formacie charakterystycznym dla nagłówka pierwszego stopnia, zostanie wyświetlona aktualna godzina (zobacz rysunek 4.1). Rysunek 4.1. Dane wyjściowe pliku data.php w oknie 1przeglądarki Dobrze byłoby zapoznać się z procesem, który zachodzi przed wyświetleniem opisywanej strony: serwer otrzymuje od przeglądarki żądanie przesłania dokumentu data.php i po rozszerzeniu (.php) rozpoznaje, że danym plikiem jest plik PHP. Ładuje zatem plik ze swojego dysku twardego do pamięci i przetwarza go w interpreterze PHP. Jak już wspo- mniano, wykonywane są te fragmenty pliku, które znajdują się między znacznikami ?php i ? . Stanowią one właściwy kod programu. Pierwsza część programu, która jest wykonywana wiersz po wierszu, składa się (obok znaczników i komentarza) z poniższych poleceń, z których każde jest zakończone zna- kiem średnika. $dataiczas = getdate(); $rok = $dataiczas[ year ]; $miesiac = $dataiczas[ mon ]; $dzien = $dataiczas[ mday ]; $godziny = $dataiczas[ hours ]; $minuty = $dataiczas[ minutes ]; $sekundy = $dataiczas[ seconds ]; Skrypt PHP wyświetlający datę 55 Czytelnikowi, który jeszcze nigdy nie pisał programów, powyższe wiersze kodu mogą się wydać podobne do równań poznanych na lekcjach matematyki. W równaniach także występowały liczne zmienne. Wiadomo również, że wyrażenie znajdujące się po lewej stronie znaku równości równało się wyrażeniu znajdującemu się po jego prawej stronie. A zmienną nazywa się symbol, mogący przyjmować różne weartości. Jednak mimo że wiersze kodu PHP wyglądają jak równania, wcale nimi nie są. Jest to tak zwany operator przypisania wartości. A jego działanie jest całkiem proste. PHP może obliczać lub. konstruować prawą stronę operatora przypisującego wartość. Wynikiem tych obliczeń, opracowań lub procesu konstruowania jest konkretna wartość lub złożona struktura danych. Po lewej stronie znaku równości standardowo znajduje się zmienna. W kodzie PHP jest ona rozpoznawana po rozpoczynającym ją znaku dolara $ (patrz: ramka Zmienne). Może przyjmować lub przechowywać pojedyncze wartości lub też skomplikowane struktury danych. Operator przypisuje danej zmiennej konkretną wartość lub strukturę danych, któ- re odpowiadają wyrażeniu znajdującemu się po prawej stronie znaku równości. Zmienna przechowuje tę wartość lub strukturę danych do momentu przypisania jej nowej wartości (lub struktury danych) albo do zakończenia wykonywania skryptu. W opisywanym przykładzie pierwsze polecenie wykonuje operację wywołania tzw. funk- cji. W tym przypadku jest to funkcja getdate(), będąca jedną z wielu funkcji wbudowa- nych w PHP. Funkcje zostaną dokładniej omówione nieco później. W tym momencie wystarczy zapamiętać, że funkcja w kodzie PHP — po jej wykonaniu — zawsze zastę- powana jest zwracaną przez nią wartością. Funkcja getdate() zwraca tzw. tablicę asocjacyjną (array) do interpretera PHP. Tablica tego typu jest przykładem nieco bardziej kompleksowej struktury danych. Za chwilę opiszemy ją nieco dokładniej. W prezentowanym poleceniu przypisującym wartość naj- pierw zapisano tablicę w zmiennej PHP $dataiczas. W ten sposób zmienna $dataiczas sama staje się tablicą asocjacyjną. Tablica asocjacyjna przechowuje wartości danych każdorazowo pod tzw. kluczem (key). Dzięki większej liczbie kluczy można w jednej tablicy (a zatem w jednej zmiennej) prze- chowywać dowolną ilość danych. Klucz może składać się z dowolnego ciągu znaków (string). W opisywanym przypadku funkcja getdate() sprawia, że pod kluczem hours jest przechowywana liczba oznaczająca aktualną godzinę, a pod kluczem mday — dany dzień miesiąca (np. 23). W zasadzie sprawa jest prostae, czyż nie? Być może Czytelnik zastanawia się, w jaki jednak sposób wydobyć konkretne wartości z tablicy asocjacyjnej? O tym za chwilę. Dla wygody interesujące wartości tablicy zapisuje się w pojedynczych zmiennych ($rok, $miesiac itd.). Dzięki temu nie trzeba później odwoływać się do asocjacyjnej składni tablicy. 56 Rozdział 4. Wstęp do programowania: proste skrypty PHP Polecenia, które powodują przekopiowanie wartości tablicy do pojedynczych zmiennych, ilustrują odpowiednią składnię tablicy, np. w poleceneiu: $rok = $dataiczas[ year ]; W ten sposób można wydobyć z tablicy $dataiczas informację o roku: należy umieścić wartość ze zbioru klucza (w naszym przypadku jest to ciąg znaków year ) w nawiasie kwadratowym, bezpośrednio po nazwie tablicy. Wyrażenie to zostaje przez PHP rozpo- znane jako element tablicy, który został zapisany pod odpowiednią warteością klucza. Zmienne Definiowanie zmiennych w PHP jest bardzo proste. Są one łatwo rozpoznawalne. Nazwa zmiennej rozpoczyna się zawsze znakiem dolara $, drugim znakiem może być litera lub znak podkreślenia (underscore). Nie należy używać znaków diakrytycz- nych. W dalszej kolejności może występować dowolna kombinacja liter i cyfr od 0 do 9. Oto przykłady kilku dozwolonych w PHP nazw zmiennyceh: $kiwi $_kiwi $_0 $a $kiwi2 $a_b_c $a1 Autor zaleca, aby nazwy zmiennych rozpoczynać od litery. Pozwala to na łatwe od- różnienie ich od nazw zmiennych, które zostały z góry zdefiniowane w PHP — takie zmienne rozpoczynają się bowiem od znaku podkreśleniae. Zmiennym mogą zostać przypisane różne wartości, przy czym nie ma znaczenia, czy jest to wartość liczbowa, czy ciąg znaków (string). Zmienna $skladnik1 = 3; oraz: $skladnik1 = 3 są sobie równoważne. Należy jednakże uważać podczas wykorzystywania zmiennych w wyrażeniach matematycznych, np. w przypadku operacji edodawania: $skladnik1 = 3; $skladnik2 = 4 ; $suma = $skladnik1 + $sklardnik2; Powyższe wyrażenie zostanie wykonane poprawnie ($suma otrzyma wartość 7), jed- nak tak nie będzie w przypadku: $skladnik1 = 3; $skladnik2 = cztery ; $suma = $skladnik1 r+ $skladnik2; Natomiast możliwe jest łączenie ciągów znaków za pomoceą operatora kropki (.): $wierzcholki = 3; $liczba_kapelusz_wierzcholki = Mój kapelusz ma .$wierzchrolki. wierzchołki! ; W ten sposób zmiennej $liczba_kapelusz_wierzcholki zostaje przypisana wartość Mój kapelusz ma 3 wierzchołki! . Skrypt PHP wyświetlający datę 57 Dane wyjściowe jako złożony ciąg znaków Czytelnik już wie, jak utworzyć tablicę, w jaki sposób ją skopiować oraz w jaki sposób niektóre z jej elementów zapisać w pojedynczych zmiennych. Cały ten proces zachodzi podczas wykonywania kodu i jest niewidoczny dla użytkownika. Pierwszy fragment kodu PHP nie powodował tworzenia żadnych danych wyjściowych, zatem nie zostanie uwzględniony w danych wyjściowych wysyłanych do przeglądarki klienta. Dopiero po wykonaniu pierwszej części plik PHP generuje nieco kodu HTML: znaczniki html , he- ad i title , jak również nieco tekstu. Zostaną one później wysłane do przeglądarki bez żadnych zmian. Następnym znacznikiem w omawianym pliku jest: ?php echo $dzien. . .$miesiac. . anno domini .$rok; ? r Znacznik ten zawiera tylko jedno polecenie PHP, ale jego działanie jest bardzo szerokie. Polecenie echo powoduje wysłanie do przeglądarki ciągu znaków (string), który może się składać z: 1. jednej zmiennej. Przykładowo, ciąg znaków może stanoewić zarówno $dzien, $miesiac , jak i $rok; 2. jawnego ciągu znaków, który w celu odróżnienia od pozoestałego kodu PHP jest otoczony znakami apostrofu lub cudzysłowu: anno domini lub: anno domini Obie wersje są poprawne. 3. wartości zwracanej przez funkcję; 4. kombinacji ciągów znaków trzech uprzednio wymienionych tyepów, przy czym dwa sąsiednie ciągi są za każdym razem łączone za pomeocą operatora kropki. Łatwo zgadnąć, jaka wartość tutaj występuje: oczywiście jest to złożony ciąg znaków, skła- dający się z podciągów: $dzien, . , $miesiac, anno domini i $rok. Wartości zmiennych są znane z pierwszego fragmentu omawianego kodu PHP. Gdyby $dzien miał wartość 23, $miesiac wartość 2 a $rok wartość 2003, polecenie echo wsta- wiłoby w tym miejscu — zamiast znacznika PHP — do pliku ciąg znaków 23.2. anno domini 2003 . Łatwo się domyślić, co się teraz stanie. W ramach ćwiczenia można przeanalizować kod trzeciego znacznika PHP w pliku data.php. Nie powinno tam być nieznanych Czytelnikowi elementów. 58 Rozdział 4. Wstęp do programowania: proste skrypty PHP Co widzi przeglądarka Warto wreszcie przekonać się, jakie dane ostatecznie serwer wysyła do przeglądarki. Listing 4.2. Typowe dane wyjściowe HTML z pliku data.p1hp html head title Dzisiaj jest 23.2. anno domini 2003 /title /head body h1 Na tym serwerze jest godzina 14:22:37 /h1 /body /html Jak można zauważyć, w danych przesyłanych do przeglądarki nie ma kodu PHP. I tak powinno być, gdyż przeglądarka nie służy do interpracji PHP. Kodem, który pozostał jest czysty HTML — najzupełniej zrozumiały dla przeglądearki. Jeśli Czytelnik wypróbuje powyższy przykładowy kod w praktyce, szybko zauważy mały wizualny mankament: brakuje wygodnego wyświetlania wartości minut i sekund w formacie dwucyfrowym. W końcowej części podrozdziału Przetwarzanie danych z for- mularza w skryptach PHP umieszczono w ramce Zrób to sam! małe ćwiczenie, dzięki któ- remu można rozwiązać ten problem. Formularze dla danych wprowadzanych przez użytkownika Główną przyczyną popularności języków skryptowych, takich jak PHP, jest fakt, że ser- wer może odpowiednio reagować na dane wprowadzone przez użytkownika przeglądar- ki, np. na zamówienie złożone z internetowym sklepie wysyłkowym. Najpierw użytkow- nik musi wypełnić formularz wyświetlany w oknie przeglądarki. Dane z tego formularza są wysyłane do serwera. Przeglądarka żąda zazwyczaj wysłania takiego formularza przez serwer. Mimo iż formularze HTML nie są elementem języka PHP, zostały jednak pomy- ślane głównie dla zastosowań związanych z językami skreyptowymi. Teraz należy powrócić do projektu, którego wątek będzie przewijał się przez całą książ- kę. Stronę główną tej witryny Czytelnik już poznał. Po kliknięciu odnośnika Chcę złożyć datek użytkownik będzie oczekiwał wyświetlenia strony, na której będzie mógł podać swoje dane osobowe i szczegóły dotyczące darowizny — zaetem formularza. Na rysunku 4.2 pokazano formularz służący do składaniae darowizny. Formularze dla danych wprowadzanych przez użytkownika 59 Rysunek 4.2. Wygląd formularza służącego do składania d1arowizny Na powyższym rysunku widać pewne elementy formularza, z których cześć może być już znana użytkownikom internetu: pole edycyjne (do wpisywania imienia darczyńcy), pole tekstowe (w celu wpisania adresu), rozwijana lista wyboru wysokości darowizny, pole wyboru pliku, umożliwiające dołączanie zdjęcia szlachetnego darczyńcy, pole prze- łącznika typu radio, służące do określania rodzaju karty kredytowej. Zapewniono również dwa pola edycyjne przeznaczone do wpisywania numeru karty kredytowej i daty jej ważności. Wreszcie za pomocą pola wyboru darczyńca może wyrazić zgodę na publika- cję swojego imienia i nazwiska. Po załadowaniu formularza do przeglądarki można zobaczyć, że jego twórca z góry zało- żył wyrażenie takiej zgody — zatem darczyńcy chcący pozostać anonimowi muszą aktyw- nie wyrazić sprzeciw przez odznaczenie omawianego pola wyboru. W celu umożliwienia sfinalizowania operacji umieszczono także przycisk zatwierdzania z napisem Wyślij datek. Kod formularza darowizny Czytelnik zapewne chciałby się przekonać, w jaki sposób utworzono opisywaną stronę w języku PHP i co też jeszcze ciekawego można znaleźć we jej kodzie. 60 Rozdział 4. Wstęp do programowania: proste skrypty PHP Listing 4.3. Kod strony formularz_datek.php html head meta http-equiv= content-type content= text/html; charset=iso8859-2 title Formularz darowizny dla zagrożonych ptaków r/title /head body form name= datek action= datek.php method= post enctype= multipart/form-data input type= hidden name= godzina value= ?php echo time();? h1 Formularz darowizny /h1 Cieszymy się, że chcesz złożyć datek! Prosimy o podranie swojego imienia, adresu, wysokości darowizny i dane kartry kredytowej. Następnie kliknij Wyślij datek . p b Imię: /b input type= text name= imiedarczyncy srize= 80 p b Adres: /b br textarea name= adres rows= 4 cols= 40 align= top r/textarea p b Wysokość darowizny: /b select name= kwota ?php for($i = 5; $i 101; $i = $i + 5) { echo option value= .$i. .$i. PLN ; } ? /select nbsp; b Zdjęcie darczyńcy /b (opcja): input name= zdjecierdarczyncy type= file p b Rodzaj karty kredytowej: /b input type= radio name= kk_rodzaj value= Visa Visa nbsp; input type= radio name= kk_rodzaj value= Mastercard Mastercard nbsp; input type= radio name= kk_rodzaj valuer= American Express American Express p b Numer karty kredytowej: /b input type= text narme= kk_numer size= 20 maxlength= 20 nbsp; b Data ważności karty: /b input type= text namer= kk_data size= 4 maxlength= 4 p b Kliknij tutaj, jeśli zgadzasz się na upubliczniernie Twojego imienia: /b input type= checkbox name= publiczny checked p input type= submit value= Wyślij datek! /form /body /html Nagłówek pliku nie powinien zawierać żadnych niespodzianek. Do znacznika body wszystko powinno być znajome. Natomiast zaraz po nim erozpoczyna się kod formularza. Jak formularz staje się formularzem: znacznik forme Aby utworzyć prawdziwy formularz, trzeba otoczyć znacznikiem form wszystkie ele- menty służące do wprowadzania danych. Dla jednego formularza może istnieć tylko jeden Formularze dla danych wprowadzanych przez użytkownika 61 taki znacznik, może on również zawierać inne elementy strony (przykładowo, nagłówek i tekst opisu). Jednak równie dobrze można by umieścić znacznik h1 poza obrębem znacznika form . Atrybuty znacznika form określają nazwę formularza (jest to właściwość, którą można wykorzystać później tworząc połączenie z Javascript, co peozwala na dodatkowe rozszerzenie funkcjonalności formularza), do jakiego dokumentu skryptowego mają zostać przesłane dane z wypełnionego formularza i czy do tego celu zostanie wykorzystane żądanie HTTP typu GET czy POST. Z uwagi na możliwość przesłania do serwera pliku graficznego (zdję- cia darczyńcy), należy ustawić atrybut enctype na multipart/form-data. Element ukryty Następnym elementem jest nieco dziwna konstrukcja, z którą Czytelnik mógł się nie spo- tkać do tej pory. input type= hidden name= godzina value= ?php echo time();? Jest to pole tekstowe typu hidden (ukryte) — pozostaje celowo niewidoczne w oknie przeglądarki. W opisywanym przykładzie zostanie wykorzystane do zapamiętania czasu wyświetlania formularza. W tym celu można wykorzystać funkcję PHP time(), podają- cą liczbę sekund, które upłynęły od dnia 1 stycznia 1970, godziny 00:00:00 GTM. Wartość jest zapisywana w atrybucie value i zostanie przesłana do serwera pod nazwą godzina. Elementy ukryte są bardzo często używane w praktyce, ponieważ umożliwiają serwerowi przechowanie części danych w przeglądarce podczas wypełniania formularza przez użyt- kownika i ich ponowne odczytanie po otrzymaniu danych z przesłanego do przetworze- nia formularza. Dzięki temu można rozłożyć proces wpisywania danych na kilka formu- larzy i dopisywać do kolejnego formularza dane już przesłane przez użytkownika. Elementy ukryte można wykorzystać również do identyfikacji i autoryzacji użytkownika, czy też do badania jego zachowań. Przykładowo, można by się dowiedzieć, ile przecięt- nie czasu potrzebuje użytkownik na wypełnienie formularza. Być może warto by także wiedzieć, czy darczyńcy ofiarujący większe sumy potrzebują więcej czasu na podjęcie takiej decyzji. Sygnatura czasu może być pomocna również przy aktualizacji oprogramo- wania, tak aby starsze formularze były przez skrypt teraktowane inaczej. Jednakże stosowanie pól ukrytych do identyfikacji użytkownika może stać się przyczyną zagrożenia bezpieczeństwa — ten problem omówimy bardzieje szczegółowo w rozdziale 7. W opisywanym przykładzie element ukryty służy właściwie tylko do tego, aby go poka- zać: w zasadzie jest to zwykły element tekstowy, posiadający z góry ustaloną i niezmienną wartość. Gdy dane z tego elementu (nazwa i wartość) trafią do serwera, będą interpreto- wane tak samo jak inne elementy tekstowe. 62 Rozdział 4. Wstęp do programowania: proste skrypty PHP Pole tekstowe Kolejnym elementem formularza w analizowanym przykładzie jest pole tekstowe służące do wprowadzania danych: input type= text name= imiedarczyncy size= 80 Użytkownik powinien samodzielnie wpisać wartość tego pola, zatem nie została określona domyślna wartość atrybutu value. Ustalono jednak szerokość pola tekstowego wyra- żoną jako liczba znaków — można tego dokonać podając wartość atrybutu size. Warto zapamiętać, że atrybut size określa wielkość pola tekstowego, jaka zostanie wyświetlona w przeglądarce. Nie powoduje to żadnych ograniczeń związanych z długością wpro- wadzanego tekstu, którym może być, przykładowo, imię darczyńcy, składające się np. z 80 znaków. Aby zapewnić możliwość wprowadzania danych wielowierszowych, należy posłużyć się polem textarea . Element ten różni się nieco od zwykłego znacznika input : textarea name= adres rows= 4 cols= 40 align= top /textarrea Podobnie jak input , także textarea dysponuje nazwą, która razem z wprowadzo- nym tekstem jest wysyłana do serwera. Wielkość pola jest określana za pomocą atrybutów rows (rzędy) i cols (kolumny). Element nie posiada atrybutu value. Natomiast tekst domyślny wpisuje się między znacznikiem otwierającym a zamykającym, np. textarea name= adres rows= 4 cols= 40 align= top Tutaj proszę wpisać swój adres. /textarea Lista rozwijana select Kolejnym elementem formularza jest lista rozwijana select . W statycznym dokumencie HTML kod tego elementu wyglądałby następująco: select name= kwota option value= 5 5 PLN option value= 10 10 PLN ... option value= 100 100 PLN /select W prezentowanym przypadku znacznik select określa tylko nazwę, wraz z którą wybrana wartość zostanie wysłana do serwera w celu przetworzenia. Wewnątrz znaczni- ka select znajdują się znaczniki option . Atrybut value znacznika option okre- śla wartość, która zostanie wysłana do serwera, jeśli użytkownik wybierze daną opcję. Tekst występujący po znaczniku option jest tekstem, który zostanie wyświetlony na liście możliwych do wyboru wartości obok danej opcji. Chcąc ustawić pewną opcję jako domyślną, w odpowiednim znaczniku option należy umieścić atrybut selected bez przypisywania mu żadnej wartości, np.: option value= 50 selected . Formularze dla danych wprowadzanych przez użytkownika 63 Generowanie znaczników option w PHP za pomocą pętlie for W opisywanym przykładzie zastosowanie PHP pozwala na ograniczenie ilości wpisywa- nego kodu. Warto przeanalizować fragment pliku formularz_datki.php zaprezentowany na listingu 4.1. Listing 4.4. Automatyczne generowanie listy wyboru w 1pliku formularz_datki.php select name= kwota ?php for($i = 5; $i 101; $i = $i + 5) { echo option value= .$i. .$i. PLN ; } ? /select Konstrukcją ułatwiającą pracę jest tzw. pętla for. Programiści używają jej w przypadku, gdy jakiś proces ma zostać wykonany wielokrotnie a liczba cyklów (zwanych iteracjami) jest z góry określona. W naszym przypadku procesem tym jest wyświetlenie znacznika option dla wszystkich kwot pomiędzy 5 a 100 zł, ze skokiem co 5 zł. Można tego dokonać za pomocą instrukcji przetwarzania pętli for. Instrukcje przetwarzania znajdują się w okrągłych nawiasach, bezpośrednio po poleceniu for: ($i = 5; $i 101; $i = $i + 5). W opisywanym bloku można wyróżnić trzy, rozdzielone znakami średnieka, części składowe. Pierwsza z nich zawiera (w niektórych przypadkach oddzielone znakami przecinka) in- strukcje, które mają zostać wykonane przed pierwszym przebiegiem pętli. Oznacza to, że pierwsza część bloku kodu służy do ustalenia warunków wstępnych (inicjalizacja). W opi- sywanym przykładzie zmienna $i otrzymuje wartość 5 i reprezentuje te kwoty, które zostaną przypisane do danych opcji. Programiści nazywają zmienną $i zmienną iteracyj- ną pętli for. Druga część opisywanego fragmentu kodu zawiera warunek, który musi zostać spełnio- ny na początku każdego cyklu, aby pętla mogła zostać ponownie wykonana. Założono, że wartość zmiennej $i nie może przekroczyć 100, zatem warunkiem wykonania następ- nej iteracji jest, że $i ma być mniejsze niż 101. W przeciwnym razie pętla nie zostanie wykonana. Trzecia część instrukcji przetwarzania pętli zostaje wykonana przed zakończeniem każ- dego cyklu i ma na celu sprawdzenie warunku zawartego w drugiej części. Ten blok ko- du składa się z instrukcji, które przeważnie służą do zmiany wartości zmiennej iteracyj- nej. W opisywanym przykładzie jest podobnie: kwota zawarta w zmiennej iteracyjnej $i jest każdorazowo powiększana o 5. W tym celu dodaje się 5 do poprzedniej wartości $i a wynik ponownie zapisuje się w zmiennej $i. Polecenia, które mają zostać wykonane w każdej iteracji, można umieścić w trzeciej czę- ści polecenia w nawiasie okrągłym. Przyjęło się jednak umieszczać je w nawiasie klam- rowym. Polecenia te są wykonywane zaraz po instrukcjach zawartych w nawiasie okrągłym. 64 Rozdział 4. Wstęp do programowania: proste skrypty PHP W prezentowanym przypadku jest to tylko jedno poleceenie, które zajmuje dwa wiersze — jest to możliwe, gdyż ciągi znaków w PHP mogą być dłuższe niż jeden wiersz. echo option value= .$i. .$i. PLN ; Zrozumienie części składowych polecenia echo nie powinno sprawić Czytelnikowi proble- mów. Ciąg znaków, który zostanie wyświetlony na stroenie, składa się z pięciu podciągów: echo option value= $i $i PLN ; Elementem jeszcze nieznanym Czytelnikowi może być konstrukcja . Jest to tzw. sekwencja unikowa (ang. escape sequence), którą tworzy się za pomocą znaku lewego ukośnika. Rola sekwencji unikowych jest bardzo prosta do zrozumienia: ciąg znaków jest ograniczany z obu stron za pomocą cudzysłowu, zatem drugi znak cudzysłowu występujący w ciągu znaków jest interpretowany jako znak zamykający ten ciąg. W ten sposób, jeśli elemen- tem danego ciągu znaków jest cudzysłów, należy go oznaczyć, tak aby nie został zinter- pretowany jako zakończenie danego ciągu znaków. W tym celu przed takim cudzysłowem wstawia się znak lewego ukośnika — stanowi to informację, że dany znak należy do właściwego ciągu znaków. Drugi i czwarty z powyższych ciągów znaków są kopią zmiennej $i. Należy zwrócić uwagę na to, że w instrukcjach przetwarzania pętli zapisano w zmiennej $i najpierw wartość numeryczną, którą następnie wykorzystano jako ciąg znaków. To niewidoczne przejście z wartości numerycznej do odpowiadającego jej ciągu znaków (tzw. niejawna konwersja typu zmiennych) jest jedną z bardzo wartościowych cech PHP.e W piątym ciągu znaków znajdują się dwa elementy wymagające krótkiego komentarza: PLN jest zwykłym tekstem, oznaczającym polską walutę, natomiast oznacza koniec wiersza. Zabieg ten nie ma wprawdzie wpływu na poprawność działania kodu, jednak- że znacznie ułatwia wyszukiwanie ewentualnych błędów w kodzie źródłowym strony. Gdyby kod wszystkich opcji został zapisany w jednym wierszu, to po wybraniu w oknie przeglądarki opcji Pokaż źródło szybkie odnalezienie właściwej opcji wśród dwudziestu byłoby utrudnione. Przesyłanie pliku do serwera Następnym po elemencie select jest pole, umożliwiające użytkownikowi przesłanie (ang. upload) swojego zdjęcia do serwera. Właściwie wszystko jest eoczywiste: input name= zdjeciedarczyncy type= file Ważnym jest pamiętanie o pewnym szczególe. Jak już wcześniej wspomniano, aby umoż- liwić przekazywanie plików do serwera za pomocą formularza, należy ustalić wartość atrybutu enctype znacznika form na multipart/form-data. Komplikuje to nieco obsługę pliku graficznego po stronie serwera. Problemem tym zaejmiemy się jednak później. Formularze dla danych wprowadzanych przez użytkownika 65 Przycisk opcji Kolejnym krokiem jest określenie przez użytkownika typu karty kredytowej. Można by to zrobić za pomocą znacznika select , tak jak to miało miejsce w przypadku wska- zania kwoty darowizny. Alternatywnym rozwiązaniem jest zastosowany tutaj przycisk opcji (tzw. przycisk typu radio — radio button): Listing 4.5. Przyciski opcji w pliku formularz_datki.p1hp input type= radio name= kk_rodzaj value= Visa Visa nbsp; input type= radio name= kk_rodzaj value= Mastercard rMastercard nbsp; input type= radio name= kk_rodzaj value= American Exprress American Express Przyciski opcji swoją angielską nazwę zawdzięczają przyciskom, które są znane ze starych odbiorników radiowych: po wciśnięciu przycisku należącego do danej grupy każdy uprzed- nio wciśnięty powraca do pozycji wyjściowej. W przypadku przycisków opcji jest iden- tycznie: po kliknięciu jednego z nich następuje jego zaznaczenie z równoczesnym odzna- czaniem wszystkich pozostałych należących do tej samej grupy. Każdy z przycisków w danej grupie jest samodzielnym elementem oznaczonym osobnym znacznikiem input . Łączenie znaczników w grupy odbywa się za pomocą atrybutu name: przyciski mające tą samą nazwę należą do jednej grupy. W opisywanym przypad- ku są to trzy przyciski, przypisane do grupy kk_rodzaj. Atrybut value służy do okre- ślania wartości, która po zaznaczeniu danego przycisku zostanie wysłana do serwera jako element wypełnionego formularza. Znak nbsp; (niełamliwa spacja) pozwala na zacho- wanie pewnego minimalnego odstępu pomiędzy przyciskami opcji. Kolejny element służący do wprowadzania danych, pole sełużące do wpisywania numeru karty kredytowej, powinien być jasny dla Czytelnika. Omówić tutaj należy jedynie atry- but maxlength, określający maksymalną liczbę znaków, jaką użytkownik może wpisać w pole. Parametr ten stanowi jednak tylko wskazówkę dla przeglądarki — nie należy się spodziewać, że w skrypcie ostatecznie przetwarzającym formularz pod nazwą kk_numer zostanie zwrócony rzeczywiście ciąg składający się z maksymalnie 20 znaków. Podobnie ma się sprawa z elementem służącym do podawania tereminu ważności karty. Pole wyboru — być albo nie być? Ostatni element omawianego formularza ma kształt kratki i służy do określenia, czy dar- czyńca decyduje się na publikację swojego imienia. Jest to pole wyboru, tzw. checkbox: input type= checkbox name= publiczny checked Pola wyboru są samodzielnymi elementami, których w przeciwieństwie do przycisków opcji nie łączy się w grupy. Natomiast oba elementy umożliwiają wysyłanie do serwera pewnych wartości za pomocą atrybutu value. Jeśli pole wyboru nie zostanie zaznaczo- ne, żadna wartość nie jest wysyłana. Atrybut value może zostać pominięty — jeśli pole zostało zaznaczone, przeglądarka przesyła ciąg znaków eon. 66 Rozdział 4. Wstęp do programowania: proste skrypty PHP Atrybut checked sprawia, że pole wyboru przy ładowaniu formularza zostaje od razu zaznaczone. Ostatnim elementem formularza jest przycisk submit. Kliknięcie tego przycisku powoduje wysłanie formularza do serwera w celu przetworzenia: input type= submit value= Wyślij datek! Atrybut value w tym przypadku oznacza opis przycisku. To właściwie prawie wszystkie ważne elementy formularzy udostępniane przez język HTML i umożliwiające wprowadzanie danych. Tabela 4.1 zawiera zestawienie ich najważ- niejszych cech. W ten sposób można przygotować formularz służący do przesyłania danych do serwera. Warto teraz zapoznać się ze sposobem przetwarzania takich przesłanych danych przez serwer. Zrób to sam! Wcześniej omówione elementy formularza umożliwiają rozbudowę prezentowanego formularza, np. o pole tekstowe, przeznaczone do wpisywania nazwiska, znajdujące- go się na karcie kredytowej. Poza tym można zachęcić ofiarodawcę do składania wielokrotnych datków, umieszczając na formularzu listę wyboru, pozwalającą dar- czyńcy na określenie częstotliwości składania datków: tylko raz (co 0 dni), co tydzień (co 7 dni), co miesiąc (co 30 dni), co kwartał (co 90 dni) lub coe rok (co 365 dni). Rozwiązanie tego problemu można znaleźć (podobnie jak w przypadku innych pli- ków opisywanych w tym rozdziale) w dostępnym on-line pliku formularz_datki_rozsze- rzony.php. Przetwarzanie danych z formularza w skryptach PHP Po wypełnieniu formularza przez użytkownika i po kliknięciu przycisku zatwierdzania (submit) wprowadzone dane są przesłane do skryptu podanego w atrybucie action znacz- nika form. Wartość atrybutu action jest interpretowana przez przeglądarkę jako adres URL (adres sieci WWW). W razie niepodania żadnego protokołu i adresu serwera, tak jak zachodzi w przypadku opisywanego pliku, domyślnie jest wykorzystywany proto- kół HTTP a skrypt PHP jest poszukiwany na tym samym serwerze, na którym znajduje się dokument zawierający formularz. Przetwarzanie danych z formularza w skryptach PHP 67 Tabela 4.1. Ważniejsze znaczniki HTML służące do tworzeni1a formularza Znacznik input type= text Ważniejsze atrybuty Znaczenie Uwagi name, id, value, size, maxlength jednowierszowy element służący do wprowadzania tekstu input type= hidden name, id, value pole ukryte textarea name, id, rows, cols pole tekstowe select name, id lista wyboru option value, selected input type= file name, id pojedyncze opcje wyboru, elementy listy wyboru pole wyboru pliku przeznaczonego do przesłania do serwera input type= radio name, id, value, checked przełącznik input type= checkbox name, id, value, checked pole wyboru input type= submit value przycisk wysyłający formularz Wartość zostaje ustalona za pomocą atrybutu value przez serwer lub Javascript. Wartość domyślna jest ustawiana między znacznikiem otwierającym a zamykającym. Zawiera znacznik option z poszczególnymi opcjami wyboru. Wyświetlana w oknie wartość jest podawana po znaczniku. Nie można ustalić wartości domyślnej; znacznik form wymaga podania enctype= multipart /form-data . Przełączniki (radio buttons) są grupowane za pomocą wspólnego dla wszystkich elementów atrybutu name. W przypadku niezaznaczonego pola wyboru do serwera nie jest wysyłana żadna wartość. atrybut value służy do opisania przycisku. 68 Rozdział 4. Wstęp do programowania: proste skrypty PHP Formularz z obcego źródła — uwaga, pułapka! Dzięki stosowaniu formatu URL w atrybucie action można wysyłać dane do skryptu, który znajduje się na innym serwerze. W niektórych przypadkach jest to bardzo pożądane — przykładowo, można umieścić na swojej stronie formularz znanej wyszukiwarki, który po wypełnieniu przez użytkownika zostanie do niej weysłany. Istnieje jednak pewien problem, o którym powinien pamiętać każdy programista PHP (lub ASP, JSP, CGI itd.): nie można zagwarantować, że otrzymane przez skrypt dane bę- dą pochodziły z prawidłowego formularza. Tym samym istnieje ryzyko zagrożenia bez- pieczeństwa serwera. Nie można zakładać, że wszyscy odwiedzający daną witrynę użytkownicy internetu mają dobre intencje. Programiści często zapominają o hakerach, chcących pozyskać numery kart kredytowych ofiarodawców lub wykorzystać dany serwer jako platformę do rozpro- szonego ataku typu „denial-of-service” na inne serwery. Użytkownikami internetu są różne osoby o bardzo różnych motywach działania, zatem zawsze przy pisaniu skryp- tów należy zachować ostrożność. Skrypt, który przyjął nieprawidłowe dane, może zachować się w sposób odmienny od ży- czeń swojego twórcy, na przykład może: • wypełnić bazę danych sprzecznymi danymi i ją zniszczyć; • pozwolić osobom nieupoważnionym na uzyskanie dostępue do bazy, na odczytanie, zmianę lub usunięcie danych. Cały ten proceder jest włeaściwie niewidoczny; • rozsyłać — wykorzystując dany serwer — pocztę elektroneiczną, zawierającą dane systemowe lub inne poufne pliki czy dane; • uruchamiać na serwerze programy lub — w pewnych okolicznoeściach —instalować nowe; • zastąpić całkowicie lub częściowo daną stronę WWW nowymie, wybranymi przez hakera treściami; • unieruchomić serwer; • zamknąć właścicielowi witryny dostęp do własnych danych. Nie są to problemy typowe jedynie dla PHP. Dotyczą bowiem wszystkich technologii WWW, które opierają się na interakcji danych wprowadzanych przez użytkownika z procesami przebiegającymi w serwerze. Podobne zagrożenia dotyczą także CGI, Active Server Pages, Java Server Pages, mod_perl, serwletów itd. Liczba serwerów, których zabezpieczenia zostały złamane dzięki wykorzystaniu luk w skry- ptach, jest znaczna. Wiele z tych ataków dotyczy technologii CGI, gdyż niektóre jej dys- trybucje posiadają pewne luki w systemie zabezpieczeń. Nawet niezbyt uzdolniony ha- ker wyszuka adresy internetowe i serwery zawierające te (często niestosowane przez właściwych użytkowników) skrypty. To samo dotyczy licznych skryptów, które są ofe- rowane bezpłatnie do pobrania. Przetwarzanie danych z formularza w skryptach PHP 69 Jak powstają takie luki w zabezpieczeniach systemów, których nie wykrywają nawet spe- cjaliści? Istnieją dwie przyczyny takiego stanu rzeczy: Po pierwsze, głównym celem pro- gramisty jest uruchomienie nowego programu. Dlatego przeważnie zwraca uwagę tylko na to, aby program poprawnie wykonywał to, do czego został stworzony. Kwestia, że pro- gram nie powinien pracować w nieprzewidziany sposób pozostaje drugoplanowa. Dru- gim powodem jest duży stopień skomplikowania nowoczesnych języków programowa- nia: niektóre polecenia mogą w pewnych trudnych do określenia sytuacjach powodować zupełnie inne zachowanie systemu, niż życzyłby sobie teego programista. Nie należy się jednak zniechęcać do samodzielnego programowania w PHP. Wprost prze- ciwnie: pamiętając o tym ostrzeżeniu, będzie można zadawać pytania dotyczące bezpie- czeństwa i zwracać uwagę na zagrożenia i stosować środki zapobiegawcze. Należy sta- rać się unikać typowych błędów, często popełnianych przez początkujących programistów i tworzyć właściwie zabezpieczone skrypty. Warto wspomnieć, że kolekcję często powtarzających się pytań dotyczących bezpieczeń- stwa serwerów i skryptów można znaleźć w WWW-Security FAQ autorstwa Lincolna Steina i Johna Stewarta pod adresem http://www.w3.org/Security/faq/www-security-faq.html. Przesyłanie danych do skryptu i ich kontrola Użytkownik wypełnił zatem formularz i wysłał go z przeglądarki do serwera. W normal- nym przypadku powinny teraz nastąpić dwa zdarzenia: przesłane dane powinny zostać zapisane w bazie danych a do przeglądarki powinien zostać odesłany komunikat, prze- znaczony dla użytkownika i potwierdzający dokonanie ewpisu. Niezależnie od tego, czy dane pochodzące z formularza zostaną zapisane w bazie danych, czy też zostaną wykorzystane do wygenerowania strony WWW, trzeba je mieć do dys- pozycji. Sposób zapisywania danych w bazie danych zostanie omówiony w rozdziale 6. Najpierw Czytelnik się dowie, w jaki sposób na poziomie skryptu uzyskać dostęp do danych przesłanych przez przeglądarkę, sprawdzić ich prawidłowość oraz jak wysłać do użytkownika komunikat zwrotny dotyczący wpisanych przez niego danych lub informu- jący o błędnych wpisach. Na rysunku 4.3 pokazano przykładowy komunikat zwrotny wysłany przez omawiany skrypt do (fikcyjnego) użytkownika formularza służącego do składania datków. Teraz należy omówić kod zawarty w pliku datek.php. Listing 4.6. Kod programu przetwarzającego dane z for1mularza w pliku datek.php ?php // Ten skrypt przyjmuje dane z formularza. // Dane są sprawdzane i następuje wyświetlenie potwrierdzenia dla użytkownika. $hack = false; // ta zmienna typu boolean wskrazuje, czy // nie mamy do czynienia z drziałaniem hakera // Czytanie danych z $_POST 70 Rozdział 4. Wstęp do programowania: proste skrypty PHP Rysunek 4.3. Potwierdzenie wysłane przez skrypt datek1.php $imiedarczyncy = $_POST[ imiedarczyncy ]; $adres = $_POST[ adres ]; $kwota = $_POST[ kwota ]; $kk_rodzaj = $_POST[ kk_rodzaj ]; $kk_numer = $_POST[ kk_numer ]; $kk_data = $_POST[ kk_data ]; $publiczny = $_POST[ publiczny ]; $godzina = $_POST[ godzina ]; // Weryfikacja danych // $imiedarczyncy może być dowolnym ciągiem znaków // nie może być tylko ciągiem pustym if ($imiedarczyncy == ) { $hack = true; $pole = Imię ; } // $adres może być również dowolnym niepustym ciągiem rznaków if ($adres == ) { $hack = true; $pole = Adres ; } // Kwota musi być liczbą całkowitą z zakresu 5 - 100 if (!preg_match( /^d*[05]$/ , $kwota)) { // nie jest liczbą całrkowitą? $hack = true; $pole = Kwota ; } if (($kwota 5) || ($kwota 100)) { $hack = true; $pole = Kwota ; } // Akceptowane karty to Visa, Mastercard, American Exprress switch ($kk_rodzaj) { case Visa : break; case Mastercard : break; Przetwarzanie danych z formularza w skryptach PHP 71 case American Express : break; default: $hack = true; $pole = Rodzaj karty rkredytowej ; } // Numer karty powinien składać się z czterech grup, // z których każda powinna składać się z 4 cyfr // Grupy powinny być połączone spacją, łącznikiem lub nrapisane w jednym ciągu if (!preg_match( /^(d{4}[s-]?){4}$/ , $kk_numer)) { $hack = true; $pole = Numer karty ; } // Termin ważności karty powinien składać się z 4 cyrfr, // przy czym pierwsze dwie powinny pochodzić z przredziału od 1 do 12 // a trzecia musi równać się 0 (chyba że termin ważnośrci karty // upływa po roku 2009 // Czwarta cyfra musi pochodzić z przedziału 2 - 9 if (!preg_match( /^(d{2})0[2-9]$/ , $kk_data, $match)) { $hack = true; $pole = Termin ważności karty ; } else { if (($match[1] 1) || ($match[1] 12)) { $hack = true; $pole = Termin ważności karrty ; } } // Pole wyboru może być albo puste, albo zaznaczone r(wartość on ). if (($publiczny != ) ($publiczny!= on )) { $hack = true; $pole = Publikacja danych ofiarodarwcy ; } // Czas wypełnienia formularza musi być liczbą całkowitrą if (!preg_match( /^d+$/ , $godzina)) { $hack = true; $pole = Czas wypełnienia formularzar ; } // Czy załączono zdjęcie? if ($_FILES[ zdjeciedarczyncy ][ size ] 0) { $zdjecie = true; preg_match( /(.w+)$/ , $_FILES[ zdjeciedarczyncy ][ name ],$match); $typ = $match[1]; // akceptujemy tylko rozszerzenia plików grafircznych if (in_array( strtolower($typ), array( .gif , .bmp , .jpg , .png , .jpeg ))) { $nazwapliku = uniqid( ).$typ; $sciezka = preg_replace( //[^/]+$/ , , $_SERVER[ SCRIPT_FILENAME ]) . /Obrazki/ ; copy($_FILES[ zdjeciedarczyncy ][ tmp_name ], $sciezka.$nazwapliku); } } else { $zdjecie = false; } // Przy nieprawidłowych danych zwróć komunikat o błędzrie: if ($hack) { ? html body h1 Błędne dane /h1 72 Rozdział 4. Wstęp do programowania: proste skrypty PHP Twój wpis w polu b ?php echo $pole; ? /b jest niepoprawny. /body /html ?php exit(); // zakończ skrypt! } // W tym miejscu dołączymy później kod wpisujący dane do barzy danych // Wyświetlenie potwierdzenia: ? html body h1 Drogi(a) ?php echo $imiedarczyncy; ? /h1 Serdeczne podziękowania za Twój datek w kwocie r ?php echo $kwota ? PLN. Potwierdzenie złożenia darowizny zostanie wysłarne na Twój adres p b ?php echo preg_replace( / ? / , br ,$adres); ? r /b p . p Kwota datku zostanie potrącona z Twojej karty br ?php echo $kk_rodzaj; ? /b numer: p b ?php echo $kk_numer; ? /b z terminem ważnościr do b ?php echo $kk_data; ? /b . p ?php if ($zdjecie) { ? Twoje zdjęcie zobaczysz poniżej: br img src= ?php echo Obrazki/ .$nazwaplriku; ? p ?php } ? Przyjmujemy do wiadomości, że Twoje dane ?php if ($publiczny == ) { echo nie ; } ? mogą zostać opublikowane... p Na wypełnienie formularza potrzebowałeś ?php echo (time() - $godzina); ? sekund. /body /html Jak widać, kod programu jest stosunkowo obszerny. Z tego też powodu będziemy omawiać go stopniowo. Pierwszą wykonaną czynnością jest zdefiniowanie zmiennej $hack, której przypisano boolowską wartość logiczną false. W ten sposób ustalono, że na początku wykonywania skryptu nie ma przesłanek, aby stwierdzić (umyślne lub nieumyślne) wpro- wadzenie przez użytkownika nieprawidłowych danych. Bezpośrednio po wykryciu błęd- nych wpisów wartość zmiennej $hack zostanie zmieniona na true, aby w ten sposób wskazać pojawienie się problemu. Jeśli po sprawdzeniu wszystkich danych pochodzą- cych z formularza zmienna $hack nadal będzie posiadała wartość false, będzie to ozna- czać, że nie wystąpił żaden rozpoznawalny błąd. Proste dane formularza, które przesłano do skryptu za pomocą zapytania HTTP metodą POST, znajdują się w globalnej tablicy asocjacyjnej noszącej nazwę $_POST. Tablica ta jest udostępniana przez PHP automatycznie1. W pierwszym kroku należy skopiować zapisane w niej dane do zmiennych, które cechuje większa łatwość eobsługi: 1 Wersje PHP poniżej 4.10 nie posiadają jeszcze $_POST. Osoby używające PHP w wersji o nume- rze niższym niż 4.10 mogą korzystać z ekwiwalentnej tablicy noszącej nazwę $HTTP_POST_VARS, która jednak jest dostępna przy odpowiedniej (domyślnej) konfiguracji (track_vars on w pliku konfiguracyjnym php.ini). Przetwarzanie danych z formularza w skryptach PHP 73 $imiedarczyncy = $_POST[ imiedarczyncy ]; $adres = $_POST[ adres ]; $kwota = $_POST[ kwota ]; $kk_rodzaj = $_POST[ kk_rodzaj ]; $kk_numer = $_POST[ kk_numer ]; $kk_data = $_POST[ kk_data ]; $publiczny = $_POST[ publiczny ]; $godzina = $_POST[ godzina ]; Wartości kluczy tablicy asocjacyjnej odpowiadają tutaj nazwom elementów służących do wprowadzania danych formularza. Nazwy te zdefiniowano eatrybutem name. Być może Czytelnik zauważył brak danych dotyczących fakultatywnego pliku ze zdjęciem. Otóż pliki, które zostały wysłane do serwera, są obsługiwane przez PHP nieco inaczej. Dokładniejsze informacje na ten temat zostaną podane nieco później. Najpierw warto przyjrzeć się nieco bliżej danym wejściowym. Ma to swoje dobre uzasadnienie: po pierw- sze, umożliwi to wysłanie do użytkownika odpowiedniego komunikatu w przypadku odnalezienia błędnego wpisu, po drugie, utrudni to działanie potencjalnym hakerom, ponieważ nieprawidłowe wpisy zostaną wychwycone i odrezucone. Kontrola imienia i nazwiska Dokładna kontrola danych wejściowych zależy w głównej mierze od oczekiwań programi- sty. W niektórych przypadkach jest to bardzo proste, np. ponieważ istnieje tak wiele do- zwolonych wpisów, że można dopuścić prawie wszystkie. W przypadku imion i adresów dane mogą zawierać właściwie dowolne znaki. Dlatego należy się tylko upewnić, że prze- słany ciąg znaków, który powinien zawierać imię i nazewisko darczyńcy, nie jest pusty: if ($imiedarczyncy == ) { $hack = true; $pole = Imię ; } Takiej samej kontroli należy poddać także adres. Konstrukcją użytą podczas kontroli jest tzw. instrukcja warunkowa if. W PHP składa się ona z zarezerwowanego słowa if, wa- runku (umieszczanego w nawiasie okrągłym) oraz jednego lub wielu poleceń w nawia- sie klamrowym. Jeśli warunek zostanie spełniony, nastąpi wykonanie poleceń umieszczo- nych w nawiasie klamrowym. W przeciwnym przypadku PHP je pominie. W opisywanym konkretnym przypadku oznacza to, że aby warunek został spełniony, wartość zmiennej $imiedarczyncy (a zatem dane wysłane do serwera z elementu formu- larza o nazwie imiedarczyncy) musiałaby być równa pustemu ciągowi znaków, który jest reprezentowany za pomocą dwóch apostrofów ( ) lub dwóch znaków ( ) cudzy- słowu. Należy zwrócić uwagę, że w PHP równość dwóch wyrażeń jest wyrażana za pomocą podwójnego znaku równości (==), w przeciwieństwie do operacji przypisywania wartości, która jest reprezentowana przez pojedynczy znak równości (=). Przykład pole- cenia przypisującego wartość pokazano w powyższym fragmencie kodu, jest to polecenie umieszczone w nawiasie klamrowym ({}). 74 Rozdział 4. Wstęp do programowania: proste skrypty PHP Warunki i operatory porównania Pierwszy przypadek zastosowania warunku opisano podeczas omawiania pętli for w poprzednim podrozdziale. Tam także znalazł się warunek, którego spełnienie de- cydowało o ponownym wykonaniu pętli. W PHP warunki mogą występować w do- wolnych miejscach, nie tylko w instrukcjach if i for. Należy zatem zapoznać się ze sposobem formułowania warunków. Warunkiem na- zywa się takie wyrażenie, którego wartość jest oceniana przez PHP albo jako true (prawda), albo jako false (fałsz). Poza tym jako false PHP interpretuje puste ciągi znaków, wartości numeryczne 0, jak również puste tablice. Wszystkie inne liczby, ciągi znaków i tablice są oceniane jako true. Ponieważ zarówno wartości true, jak i false mogą być przechowywane w zmien- nych PHP, warunek może składać się tylko z samej zmiennej. W kolejnym wierszu zawsze zostanie wyświetlony komunikat „Witam”: $x = true; if ($x) { echo Witam! ; } Wartości te mogą zostać również zwrócone przez funkcję, tak więc cała funkcja mo- że także reprezentować warunek. Przykładem może być np. funkcja preg_match(), którą Czytelnik pozna w dalszej części tego rozdziału.e Bardzo często spotykany jest trzeci rodzaj warunków: porównania. W prezentowa- nym przypadku (np. podczas kontroli imienia ofiarodawcy), porównuje się pewne wyrażenie (przesłane imię i nazwisko ofiarodawcy) z innym wyrażeniem (pusty ciąg znaków ). W tym celu użyto operatora ==. Istnieją jednak jeszcze inne ope- ratory, które można zastosować do tego typu porównań. Pierwszy zaprezentowano już podczas omawiania kodu formularza: był to operatore „mniejszy niż” ( ). Poniżej znajduje się zestawienie kilku innych operateorów porównań. Operator Nazwa Znaczenie (z przykładowymi zmiennymi) != = = nierówny mniejszy niż większy niż $a != $b jest true, wtedy gdy wartość zmiennej $a nie jest równa wartości zmiennej $b. $a $b jest true, wtedy gdy wartość zmiennej $a jest mniejsza niż wartość zmiennej $b. $a $b jest true, wtedy gdy wartość zmiennej $a jest większa niż wartość zmiennej $b. mniejszy lub równy $a = $b jest true, wtedy gdy wartość zmiennej $a jest mniejsza lub równa wartości zmiennej $b. większy lub równy $a = $b jest true, wtedy gdy wartość zmiennej $a jest większa lub równa wartości zmiennej $b. Przetwarzanie danych z formularza w skryptach PHP 75 Powyższe operatory można stosować zarówno w odniesieniu do wartości numerycz- nych, jak i ciągów znaków. Wydawałoby się, że w przypadku operatora „nierówny” można to jeszcze wyobrazić, jednak w przypadku pozostałych operatorów sytuacja wydaje się być niejasna. Tymczasem ciągi znaków są zamieniane na liczby, które składają się z kodów numerycznych odpowiadających danym znakom. Praktyczne zastosowanie tego zagadnienia wygląda jednak znacznie prościej: za pomocą opera- torów można sortować ciągi znaków w porządku alfabetyczenym. Ciąg znaków $a jest zamieniany na mniejszą wartość niż ciąg $b, zatem $a w alfabetycznym porządku pojawia się przed $b. Ważna jest tutaj m.in. wielkość znaków. Poniższe wyrażenia są w PHP prawdziwe: duży mały , Duży duży , Noga Nóżka . Kontrola liczb całkowitych Aby sprawdzić kwotę darowizny, trzeba się cofnąć nieco wstecz. Także tutaj stosuje się instrukcję if, jednak należy się upewnić, że w przypadku danych wysłanych jako ciąg znaków rzeczywiście przesłano wartość równą liczbie całkowitej, która jest podzielna przez 5. Ponadto trzeba się upewnić, że liczba ta znajduje się w przedziale 5 – 100. Aby sprawdzić, że daną liczbą jest liczba całkowita podzielna przez 5, można zastosować tzw. wyrażenie regularne. Listing 4.7. Kontrola kwoty darowizny za pomocą wyra1żenia regularnego w pliku datek.php if (!preg_match( /^d*[05]$/ , $kwota)) { // nie jest liczbą całkorwitą? $hack = true; $pole = Kwota ; } Warto przyjrzeć się nieco bliżej tej zaszyfrowanej konstrukcji. Warunek instrukcji if brzmi następująco: !preg_match( /^d*[05]$/ , $kwota). Wykrzyknik znajdujący się na początku pełni funkcję znaku negacji. Oznacza to, że całe wyrażenie będzie miało wartość true, jeśli wyrażenie znajdujące się po znaku wykrzyknika będzie miało wartość false i odwrotnie. preg_match() jest funkcją wbudowaną w PHP, umożliwiającą porównywa- nie wzorców za pomocą wyrażeń regularnych kompatybilnych z Perl. Ten tajemniczo wyglądający ciąg znaków, stanowiący pierwszy argument funkcji preg_match(), jest ta- kim właśnie wyrażeniem regularnym. Wyrażenia regularne są stosowane do identyfikacji wzorców ciągów znaków w innych ciągach znaków. W opisywanym przypadku trzeba rozpoznać, czy ciąg znaków przeka- zany do zmiennej $kwota składa się wyłącznie z cyfr. Jak już wspomniano, wyrażenia regularne w funkcjach typu preg_ mają tę samą składnię jak te w języku Perl (język ten często jest stosowany w skryptach CGI). Omówienie kompletnej składni wyrażeń regularnych w Perlu znacznie wykracza poza ramy niniejszej książki. Dobrze napisany i przystępny podręcznik omawiający wyraże- nia regularne w Perlu można znaleźć w ofercie wydawnictwa O’Reilly Perl. Wprowadze- nie autorstwa Randala L. Schwartz i Toma Phoenix (w Polsce wydana przez wydawnictwo Helion). Wiele tego typu podręczników dostępnych jest również w internecie. Programista 76 Rozdział 4. Wstęp do programowania: proste skrypty PHP aplikacji internetowych musi być przyzwyczajony do stosowania wyrażeń regularnych i powinien dobrze znać ich składnię, ponieważ w ten sposób można stosunkowo prosto wykonywać kompleksowe operacje na ciągach znaków. Dla celów niniejszej książki wy- starczy, że Czytelnik zrozumie wyrażenia z prezentoewanego skryptu. Wszystkie wyrażenia regularne w Perlu (a co za tym idzie, również w funkcjach typu preg_...) rozpoczynają się i kończą identycznymi znakami granicznymi (są tzw. ogra- niczniki, ang. delimiter). W większości przypadków programiści Perla i PHP stosują uko- śnik lewy (/) lub znak #. W omawianym przypadku trzeba się dowiedzieć, czy ciąg zna- ków składa się wyłącznie z cyfr. Zatem cały ciąg, od samego początku, musi odpowiadać podanemu wzorcowi, co wyraża się znakiem ^ umieszczonym na jego początku. W wy- rażeniach regularnych cyfry są reprezentowane przez /d. Gwiazdka (*) oznacza, że po- przedzający ją znak może wystąpić jeden lub więcej razy. W opisywanym przypadku jest to wiele cyfr lub też żadna. Następnie trzeba żądać znaku, który będzie równoważ- ny jednemu ze znaków umieszczonych w nawiasie kwadratowym, tzn. 0 lub 5. Znak ten ma znajdować się równocześnie na końcu ciągu znaków. Aby to wymusić, wyrażenie regularne należy zakończyć znakiem dolara ($). Oznacza on, że w tym miejscu wzorca powinien znajdować się koniec ciągu znaków. W ten sposób można się upewnić, że prze
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP. Praktyczne wprowadzenie
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: