Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00510 010254 11030898 na godz. na dobę w sumie
PHP5. Tworzenie stron WWW. Ćwiczenia praktyczne. Wydanie II - książka
PHP5. Tworzenie stron WWW. Ćwiczenia praktyczne. Wydanie II - książka
Autor: Liczba stron: 264
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-0674-2 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).

Kolejne wydanie najpopularniejszego podręcznika PHP

Statyczne witryny WWW to początek kariery każdego webmastera. Jednak język HTML, choć ciągle rozwijany, ma ograniczone możliwości, co powoduje, że aby stworzyć niektóre elementy strony, będziesz musiał sięgnąć po inne technologie. Umieszczenie na stronie WWW interaktywnego menu, forum dyskusyjnego lub księgi gości wymaga zastosowania narzędzi innego rodzaju.

Chcesz wzbogacić swoją witrynę WWW o nowe, interaktywne elementy?
Poznaj język PHP5!

Ten język programowania jest bardzo rozpowszechniony, efektywny, działa na wielu platformach, a co najważniejsze, jest dostępny bezpłatnie. Został zaprojektowany specjalnie do tworzenia aplikacji WWW. Jest też stosunkowo łatwy do opanowania i wygodny w użyciu.

Książka 'PHP5. Tworzenie stron WWW. Ćwiczenia praktyczne. Wydanie II' to kolejne, zaktualizowane i uzupełnione, wydanie popularnego podręcznika przedstawiającego podstawy tworzenia aplikacji WWW. Czytając ją, nauczysz się obsługiwać za pomocą PHP5 formularze umieszczane na stronach WWW, wysyłać i odbierać pliki, zarządzać sesjami i cookies oraz korzystać z danych zgromadzonych w bazie MySQL. Rozdział poświęcony programowaniu obiektowemu został rozbudowany i wzbogacony o nowe przykłady i ćwiczenia. Książka dodatkowo zawiera rozdział o zagrożeniach wynikających ze stosowania PHP5 i sposobach zabezpieczania przed nimi witryn WWW.

Dzięki tej książce podstawy języka PHP opanowało już prawie 20 000 osób. Dołącz do nich!

Wzbogać swój warsztat -- poznaj język PHP5.

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 PHP5. Tworzenie stron WWW. Æwiczenia praktyczne. Wydanie II Autor: Andrzej Kierzkowski ISBN: 83-246-0674-2 Format: A5, stron: 260 Kolejne wydanie najpopularniejszego podrêcznika PHP (cid:129) Tworzenie w³asnych skryptów (cid:129) Programowanie obiektowe (cid:129) Bezpieczeñstwo witryn WWW Statyczne witryny WWW to pocz¹tek kariery ka¿dego webmastera. Jednak jêzyk HTML, choæ ci¹gle rozwijany, ma ograniczone mo¿liwoœci, co powoduje, ¿e aby stworzyæ niektóre elementy strony, bêdziesz musia³ siêgn¹æ po inne technologie. Umieszczenie na stronie WWW interaktywnego menu, forum dyskusyjnego lub ksiêgi goœci wymaga zastosowania narzêdzi innego rodzaju. Chcesz wzbogaciæ swoj¹ witrynê WWW o nowe, interaktywne elementy? Poznaj jêzyk PHP5! Ten jêzyk programowania jest bardzo rozpowszechniony, efektywny, dzia³a na wielu platformach, a co najwa¿niejsze, jest dostêpny bezp³atnie. Zosta³ zaprojektowany specjalnie do tworzenia aplikacji WWW. Jest te¿ stosunkowo ³atwy do opanowania i wygodny w u¿yciu. Ksi¹¿ka „PHP5. Tworzenie stron WWW. Æwiczenia praktyczne. Wydanie II” to kolejne, zaktualizowane i uzupe³nione, wydanie popularnego podrêcznika przedstawiaj¹cego podstawy tworzenia aplikacji WWW. Czytaj¹c j¹, nauczysz siê obs³ugiwaæ za pomoc¹ PHP5 formularze umieszczane na stronach WWW, wysy³aæ i odbieraæ pliki, zarz¹dzaæ sesjami i cookies oraz korzystaæ z danych zgromadzonych w bazie MySQL. Rozdzia³ poœwiêcony programowaniu obiektowemu zosta³ rozbudowany i wzbogacony o nowe przyk³ady i æwiczenia. Ksi¹¿ka dodatkowo zawiera rozdzia³ o zagro¿eniach wynikaj¹cych ze stosowania PHP5 i sposobach zabezpieczania przed nimi witryn WWW. Wydawnictwo Helion ul. Koœciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl (cid:129) Instalowanie i konfiguracja PHP5 (cid:129) Operatory (cid:129) Zmienne (cid:129) Pêtle i konstrukcje warunkowe (cid:129) Przesy³anie danych z formularzy (cid:129) Obs³uga plików i sesji (cid:129) Po³¹czenia z bazami danych (cid:129) Tworzenie grafiki w PHP5 (cid:129) Komponenty witryn WWW (cid:129) Programowanie obiektowe (cid:129) Zabezpieczanie aplikacji WWW Dziêki tej ksi¹¿ce podstawy jêzyka PHP opanowa³o ju¿ prawie 20 000 osób. Do³¹cz do nich! Wzbogaæ swój warsztat — poznaj jêzyk PHP5 Wstęp Rozdział 1. Pierwsze spojrzenie Client-side vs. server-side Witryna PHP Apache, PHP, MySQL — konta w internecie Gotowe skrypty Rozdział 2. Instalacja i konfiguracja Rozdział 3. Podstawy PHP Pierwsze skrypty Zmienne, stałe, operatory Instrukcja warunkowa Pętla for Pętle while i do…while Instrukcja wyboru (switch) Funkcje Złożone struktury danych — tablice zwykłe i tablice asocjacyjne Rozdział 4. Dane — pobieranie, przekazywanie i przechowywanie Pobieranie danych z formularzy Cookies Obsługa plików Sesje Baza danych 5 7 7 13 17 18 21 33 34 37 44 49 53 56 58 76 87 87 101 109 119 128 4 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Rozdział 5. Grafika w PHP Rozdział 6. Trudniejsze zadania webmasterskie Licznik tekstowy Licznik graficzny Księga gości Newsy na stronie Ankieta Ring Galeria zdjęć Analiza dzienników serwera Forum dyskusyjne Rozdział 7. Klasy i obiekty Podstawy modelu obiektowego PHP5 Dziedziczenie i zasięg Obiektowy licznik Biblioteka PEAR Rozdział 8. Bezpieczeństwo w PHP5 Zagrożenia wynikające z włączonej opcji register_globals Ataki typu File Inclusion Ataki typu SQL Injection 147 169 170 179 185 191 201 207 212 215 221 227 228 232 234 240 249 249 251 255 Programy PHP, które napisałeś do tej pory, nie były bardzo rozbudowane i nie szokowały swoimi możliwościami. Nie sta- nowiły też rozwiązania typowych problemów webmasterskich. Pewnie już zauważyłeś, że opierały się na komunikacji jednostronnej: program coś wyliczał i wyświetlał wyniki w przeglądarce. Nie można było mu jednak w żaden sposób przekazać danych ani też zapisać na serwerze wyników działania — w celu wykorzystania ich w przyszło- ści. Nie było też możliwości przekazywania wyników działania z jed- nej strony do drugiej. W tym rozdziale zajmiesz się tymi właśnie za- gadnieniami: pobieraniem danych od użytkownika, pamiętaniem ich zarówno po stronie klienta, jak i serwera oraz przekazywaniem infor- macji pomiędzy stronami. Pobieranie danych z formularzy Podstawowym sposobem pobierania danych od użytkownika na stro- nach WWW są formularze. Zakładam, że mając styczność z HTML-em, zapoznałeś się już z tym tematem. Warto jednak przypomnieć kilka niezbędnych informacji. 8 8 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Formularz na stronie WWW ma następującą postać: FORM ACTION= skrypt.php METHOD=POST !--Tu występują pola formularza -- INPUT TYPE=Submit VALUE= Wyślij /FORM Metodą w formularzu może być także GET (jest to zresztą metoda do- myślna: jeżeli nie wpiszesz w definicji formularza żadnej, zostanie użyta właśnie ta). Metody różnią się między sobą sposobem przeka- zywania danych do serwera. Jeżeli użyjesz metody GET, dane z formu- larza zostaną doklejone do adresu skryptu odbierającego formularz po znaku zapytania. Adres będzie więc miał postać: http://adres.serwera/skrypt.php?pole1=wart1 poleh=warth .. poleN=wartN W przypadku formularzy z dużą liczbą danych taka metoda może być niewygodna. Ma jednak jedną niewątpliwą zaletę: można ją stosować nie tylko do obsługi formularzy, ale po prostu w łączu, które użytkow- nik będzie nawet mógł dodać do zakładek. Metoda POST z kolei przekazuje dane z formularza w inny sposób (po nagłówkach zlecenia HTTP). Danych z formularza nie zobaczysz więc w adresie, ale można ich za to przesłać o wiele więcej. W formularzu możesz używać: pól tekstowych, pól haseł, pól wyboru, przycisków opcji, obszarów tekstowych, menu, pól wyboru pliku do przesłania. Trudno w tym miejscu szczegółowo omawiać wszelkie ele- menty formularzy, dlatego zachęcam do zapoznania się z książką au- torstwa Elizabeth Castro Po prostu HTML 4. Wydanie III, a w szcze- gólności z jej 16. rozdziałem („Formularze”). Pobieranie danych z formularza przez skrypt jest trywialnym zada- niem. Dane wpisane w polach formularza są pamiętane w specjalnych tablicach ($_GET i $_POST), a indeksy, pod którymi są dostępne, noszą takie nazwy, jak pola formularza. Jeżeli formularz zostanie przesłany metodą GET, to wartości wpisane w polach znajdziesz w odpowiednich polach tablicy $_GET. Analogicznie jeżeli metodą przesłania formularza będzie POST, to dane będziesz mógł odczytać z tablicy $_POST. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 8 9 Ć W I C Z E N I E 4.1 Utworzenie prostego formularza Utwórz program, który będzie wyświetlał formularz z jednym polem tekstowym, a po wysłaniu tego formularza wyświetli wpisaną wartość. W zależności od tego, czy zmienna $tekst (tekst będzie nazwą pola w formularzu) przyjmuje jakąś wartość, czy też nie, wyświetlisz albo formularz, albo informację o tym, co zostało w nim wpisane. 4-01.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Formularz /TITLE /HEAD BODY ? // Drukuje formularz i jednocześnie odbiera i wyświetla wpisane w nim dane. if ($_GET[ tekst ]) { // jest wpisana jakaś wartość w formularzu $tekst = $_GET[ tekst ]; print Wpisana wartość to B $tekst /B BR ; print A HREF= 4-01.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-01.php METHOD=GET ; print INPUT TYPE= text NAME= tekst ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Warto sprawdzić, jak działa skrypt, zarówno z wykorzystaniem me- tody GET, jak i POST. Pamiętaj, że poza zmianą metody w formularzu musisz też zmienić nazwę tablicy, z której są odczytywane dane, na $_POST. Zauważ różnicę w adresie po wysłaniu formularza za pomocą jednej i drugiej metody. 9 0 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Wpisz w polu formularza tekst H1 tekst /H1 . Pojawi się niespo- dziewany efekt — wyświetlony tekst zostanie wypisany dużą czcion- ką. Dzieje się tak, ponieważ wpisany tekst wklejasz bezpośrednio do kodu strony. Jeszcze ciekawszy efekt uzyskasz, wpisując tekst script alert(123); /script . Jak widzisz, łatwo stracić kontrolę nad tym, co wyświetla strona, je- żeli wyświetlane na niej dane pochodzą bezpośrednio z formularza. Sprawa nie jest poważna, jeżeli chodzi tylko o stronę wysyłaną poje- dynczemu klientowi po wpisaniu przez niego danych. Można sobie jednak wyobrazić księgę gości z wpisami gromadzonymi w bazie da- nych i wyświetlanymi na żądanie. Jeżeli do bazy będziesz wpisywać nieobrobione dane z formularza, efekty działania odwiedzających (cza- sem zupełnie niepożądane) będą oglądali wszyscy. Z tego powodu powinieneś stosować funkcję „oczyszczającą” wpisywane dane, szcze- gólnie takie, które mogą się pojawić na stronach WWW. Ć W I C Z E N I E 4.2 Bezpieczne wyświetlanie danych Popraw program z ćwiczenia 4.1 tak, by przetwarzał wpisane dane, aby były bez- pieczne w wyświetlaniu. Sprawdź jego działanie na przykładach z poprzedniego ćwi- czenia. W przyszłości zapewne przygotujesz własną funkcję „oczyszczającą” wprowadzane dane. W zależności od ich charakteru, funkcja powin- na wykonywać różne operacje. Na początek wykorzystaj wbudowaną funkcję PHP, która znaczniki HTML-a przetworzy na „bezpieczne” do wyświetlenia. W szczególności zamieni znaki większości i mniejszości na gt; i lt;, co spowoduje, że wpisane znaczniki HTML nie zosta- ną przy ich dołączeniu do strony zinterpretowane, lecz wyświetlone. htmlspecialchars Zamienia znaczniki HTML na kody „bezpieczne” do wyświetlenia na stronach WWW. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 9 1 4-02.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Formularz /TITLE /HEAD BODY ? // Drukuje formularz i jednocześnie odbiera i wyświetla wpisane // w nim dane. Dane są przetworzone funkcją htmlspecialchars. if ($_GET[ tekst ]) { // jest wpisana jakaś wartość w formularzu $tekst = htmlspecialchars ($_GET[ tekst ]); print Wpisana wartość to B $tekst /B BR ; print A HREF= 4-0h.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-0h.php METHOD=GET ; print INPUT TYPE= text NAME= tekst ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Program różni się jednym wierszem przetwarzającym zmienną $tekst: $tekst = htmlspecialchars ($tekst); W przypadku standardowych danych trudno dostrzec różnicę. Jeżeli jednak użyje się któregoś ze stwarzających problemy wpisów z po- przedniego ćwiczenia, można zobaczyć efekt. Dyskusyjną sprawą jest to, w jaki sposób przetwarzać wpisane przez użytkownika dane. W przykładzie z poprzedniego ćwiczenia wpisane przez użytkownika znaczniki zostaną po prostu wyświetlone. W przy- szłości być może zechcesz je po prostu wyeliminować. Ć W I C Z E N I E 4.3 Obliczanie rozwiązań równania kwadratowego Utwórz program, który będzie wyświetlał formularz z możliwością wpisania trzech danych: a, b i c, po czym wyświetli rozwiązanie równania kwadratowego: ax2 + bx + c = 0. 9 2 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Przypomnij sobie ćwiczenie 3.8. Rozwiązanie będzie podobne, ale pozwoli na interaktywne wpisywanie danych przez odwiedzającego stronę. 4-03.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Równanie kwadratowe /TITLE /HEAD BODY ? // Pobiera od użytkownika współczynniki równania, a następnie // oblicza wartości zerowe równania kwadratowego. $a = str_replace ( , , . , $_GET[ a ]); settype ($a, double ); $b = str_replace ( , , . , $_GET[ b ]); settype ($b, double ); $c = str_replace ( , , . , $_GET[ c ]); settype ($c, double ); if ($a || $b || $c) { // wartości w formularzu są ok print ( a = $a, b = $b, c = $c BR ); if ($a) { $delta = $b*$b-4*$a*$c; if ($delta 0) { print ( Równanie nie ma pierwiastków rzeczywistych ); } elseif ($delta == 0) { $x1 = -$b/(h * $a); print ( Równanie ma jeden pierwiastek rzeczywisty: $x1 ); } else { $x1 = (-$b-sqrt($delta)) / (h*$a); $xh = (-$b+sqrt($delta)) / (h*$a); print ( Równanie ma dwa pierwiastki rzeczywiste: $x1 i $xh ); } } elseif ($b) { $x1 = -$c/$b; print ( Równanie ma jeden pierwiastek rzeczywisty: $x1 ); } else { print ( Równanie nie ma pierwiastków rzeczywistych ); } print BR A HREF= 4-03.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-03.php METHOD=GET ; print a: INPUT TYPE= text NAME= a BR ; print b: INPUT TYPE= text NAME= b BR ; print c: INPUT TYPE= text NAME= c BR ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 9 3 W programie wykorzystano funkcję settype, która zamienia (o ile się da) zmienną, będącą jej pierwszym parametrem, na typ określony dru- gim parametrem. Niektóre typy, które można zastosować, to integer, dodole, string oraz array. Zamiana na typ dodole (czyli na liczbę rze- czywistą) nie jest — niestety — doskonała. Funkcja bierze pod uwagę taki początek zmiennej, który odpowiada liczbie rzeczywistej, a jeżeli po nim występuje cokolwiek innego, zostaje opuszczone. Przed wywołaniem funkcji settype została wykorzystana funkcja str_ replace, która w łańcuchu stanowiącym jej trzeci parametr zamienia wszystkie wystąpienia pierwszego parametru na drugi. Uczyniono to po to, by umożliwić użytkownikowi oddzielenie części całkowitej i ułamkowej każdego ze współczynników zarówno znakiem kropki, jak i przecinka (dlatego przecinek zamieniasz na kropkę, która jest standardowym separatorem liczb ułamkowych). Ć W I C Z E N I E 4.4 Pobieranie nazwy i hasła użytkownika Utwórz program, który po podaniu odpowiedniej nazwy użytkownika i jego hasła wyświetli tajną informację. Jeżeli zaś wpisane dane będą nieprawidłowe — infor- mację o błędzie. Dane o użytkownikach i hasłach zapamiętaj jawnie w tablicy asocja- cyjnej. Oczywiście użytkownik nie będzie mógł ich podejrzeć. W przy- szłości możesz zapamiętywać zaszyfrowane informacje w plikach tekstowych lub w bazie danych, jednak na początku takie proste roz- wiązanie wystarczy. 4-04.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Informacja na hasło /TITLE /HEAD BODY ? // Pobiera od użytkownika nazwę i hasło. Jeżeli dane są prawidłowe, // wyświetla tajną informację, a jeżeli nie - informację o błędzie. $hasla = array ( admin = hasloadmina15 , tester = tester15 , marek = 1wgd7w3 , henryk = 56sghx ); 9 4 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne if (($_POST[ uzytkownik ]) ($_POST[ haslo ])) { // wartości w formularzu są wpisane if ($hasla[$_POST[ uzytkownik ]] == $_POST[ haslo ]) { print ( Tajna informacja to: B h*h=4 /B ); } else { print ( Wpisano niepoprawne dane o użytkowniku i haśle. BR ); print ( A HREF= 4-04.php Wróć /A i spróbuj ponownie. ); } } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-04.php METHOD=POST ; print TABLE TR TD użytkownik: /TD TD INPUT TYPE= text ; print NAME= uzytkownik VALUE= .$_POST[ uzytkownik ]. /TD /TR ; print TR TD haslo: /TD TD INPUT TYPE= password ; print NAME= haslo /TD /TR /TABLE ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML W formularzu wykorzystano metodę POST, a nie GET. Zrobiłeś tak, aby nie ujawniać hasła użytkownika w adresie. Taka informacja mogłaby przypadkowo zostać ujawniona nieupoważnionym osobom (na przy- kład poprzez zapamiętanie w historii przeglądarki lub przypadkowe dodanie strony do zakładek). Do wpisania hasła użytkownika w formularzu użyto pola typu password. Dzięki temu wpisywane hasło nie jest wyświetlane na ekranie (każdy znak jest zastępowany gwiazdką). Zrobiłeś jeszcze jedno: w formularzu dla pola dzytkownik ustaliłeś war- tość początkową — jako zmienną $_POST[ dzytkownik ]. Stało się tak dla wygody użytkownika. Załóżmy, że podczas wypełniania formu- larza nie zostaną wpisane kompletne dane (użytkownik wpisze jedy- nie nazwę, a zapomni o haśle). Wówczas po wysłaniu formularz zo- stanie ponownie wyświetlony, z wypełnionym już polem z nazwą. W podobny sposób można wykorzystywać pola innych typów — na przykład menu czy opcji wyboru. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 9 5 Ć W I C Z E N I E 4.5 Wyświetlanie menu w formularzu I Napisz program, który wyświetli menu, a następnie pokaże wybraną przez użytkow- nika opcję. Wybraną przez użytkownika opcję określ za pomocą instrukcji switch. Na podstawie wartości zmiennej $opcja w $cowyorano zapamiętaj ją. Ponieważ została wykorzystana metoda POST, w adresie jej nie za- uważysz. 4-05.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Menu w formularzu /TITLE /HEAD BODY ? // Wyświetla formularz z menu, a następnie wyświetla wybraną przez // użytkownika opcję. if ($_POST[ opcja ]) { // wartości w formularzu są wpisane switch ($_POST[ opcja ]) { case pilka : $cowybrano = piłka nożna ; break; case kosz : $cowybrano = koszykówka ; break; case siat : $cowybrano = siatkówka ; break; case nar : $cowybrano = narciarstwo ; break; case hokej : $cowybrano = hokej ; break; case boks : $cowybrano = boks ; break; case inny : $cowybrano = inny sport ; break; default: $cowybrano = niezidentyfikowana opcja ; break; } print ( Użytkownik wybrał opcję: B $cowybrano /B . BR ); print BR A HREF= 4-05.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-05.php METHOD=POST ; print SELECT NAME= opcja ; print OPTION SELECTED VALUE= - gt; wybierz, jak sport lubisz: ; print OPTION VALUE= pilka piłka nożna ; print OPTION VALUE= kosz koszykówka ; print OPTION VALUE= siat siatkówka ; 9 6 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne print OPTION VALUE= nar narciarstwo ; print OPTION VALUE= hokej hokej ; print OPTION VALUE= boks boks ; print OPTION VALUE= inny inny sport ; print /SELECT ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Zauważ, że wartość każdej z opcji nie musi nazywać się tak samo, jak tekst wypisywany użytkownikowi. Jest to dość wygodne (czasem opcje mają długie nazwy). W celu wyświetlenia pełnego opisu wybra- nej opcji można posłużyć się instrukcją switch. Dużo jednak wygodniej do pamiętania nazw opcji użyć tablicy asocjacyjnej, o czym przekonasz się w następnym ćwiczeniu. Ć W I C Z E N I E 4.6 Wyświetlanie menu w formularzu II Popraw program z poprzedniego ćwiczenia tak, by nazwy opcji i wartości zostały zapisane w tablicy asocjacyjnej, a zmiana treści formularza była możliwa poprzez poprawienie jej zawartości. Dane o opcjach i ich opisach zapamiętaj w tablicy asocjacyjnej. Na- zwy opcji będą kluczami, a odpowiednie wartości — wartościami w tablicy dla tych kluczy. 4-06.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Menu w formularzu /TITLE /HEAD BODY ? // Wyświetla formularz z menu, a następnie wyświetla wybraną przez // użytkownika opcję. $opcje = array ( pilka = piłka nożna , kosz = koszykówka , siat = siatkówka , nar = narciarstwo , hokej = hokej , boks = boks , Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 9 7 inny = inny sport ); if ($_POST[ opcja ]) { // wartości w formularzu są wpisane $znal = 0; foreach ($opcje as $klucz = $wartosc) { if ($klucz == $_POST[ opcja ]) { $cowybrano = $wartosc; $znal = 1; } } if (!$znal) { $cowybrano = niezidentyfikowana opcja ; } print ( Użytkownik wybrał opcję: B $cowybrano /B . BR ); print BR A HREF= 4-06.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-06.php METHOD=POST ; print SELECT NAME= opcja ; print OPTION SELECTED VALUE= - gt; wybierz, jak sport lubisz: ; foreach ($opcje as $klucz = $wartosc) { print ( OPTION VALUE= $klucz .$wartosc); } print /SELECT ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Trzeba przyznać, że taki sposób rozwiązania problemu jest bardzo wygodny, gdyż wszelkie zmiany w treści formularza nanosisz tylko raz (w tablicy $opcje) i mają one skutek w całym programie, zarówno przy wyświetlaniu formularza, jak i przy jego interpretacji. Powyższe ćwiczenie jest wstępem do utworzenia ankiety na stronie WWW. Całościowe rozwiązanie tego zadania znajdzie się w rozdziale 6. W bardzo podobny sposób można oprogramować przyciski opcji. Spró- buj samodzielnie zmienić powyższy program tak, by wyświetlał je zamiast menu. Rozwiązanie znajduje się w pliku 4-06a.php. W nieco inny sposób należy zaprogramować pola wyboru, w których użytkownik może zaznaczyć więcej niż jedną opcję. 9 8 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Ć W I C Z E N I E 4.7 Pole wyboru w formularzu Napisz program z powyższych przykładów w taki sposób, by użytkownik mógł wybrać więcej niż jedną opcję. Użyj pola wyboru. Każde pole wyboru projektowanego formularza nazwij tak, jak nazywa się klucz z tablicy asocjacyjnej. 4-07.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Pole wyboru w formularzu /TITLE /HEAD BODY ? // Wyświetla formularz z opcjami wyboru, a następnie wyświetla // wybrane przez użytkownika opcje. $opcje = array ( pilka = piłka nożna , kosz = koszykówka , siat = siatkówka , nar = narciarstwo , hokej = hokej , boks = boks , inny = inny_sport ); $znal = 0; foreach ($opcje as $klucz = $wartosc) { $jest = $_GET[$klucz]; if ($jest) { $cowybrano = $cowybrano.$wartosc. ; $znal = 1; } } if ($znal) { // wartości w formularzu są wpisane print ( Użytkownik wybrał opcje: B $cowybrano /B . BR ); print BR A HREF= 4-07.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-07.php METHOD=GET ; print Wybierz, jaki sport lubisz: P ; foreach ($opcje as $klucz = $wartosc) { print ( INPUT TYPE= checkbox NAME= $klucz VALUE= 1 ); print ($wartosc. BR ); } print P INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 9 9 Celowo użyto metody GET, aby w adresie można było zobaczyć, w ja- ki sposób są przekazywane informacje o wybranych przy użyciu pól wyboru opcjach. W każdym przebiegu pętli foreach jako $kldcz zostanie podstawiona odpowiednia nazwa klucza, dzięki czemu można odwołać się do za- wartości tablicy $_GET i pobrać zmienną formularza o odpowiedniej nazwie. Ze względu na to, że użytkownik może wybrać więcej niż jedną opcję menu, nie wyświetlasz tylko jednej z nich, lecz zbierasz w pętli w zmiennej $cowyorano wszystkie wybrane opcje. Wyjątkową rolę w formularzach spełniają pola ukryte. Jeżeli do tej po- ry nie miałeś styczności z aplikacjami działającymi po stronie klienta (client-side), możesz wątpić w ich sens. Nic bardziej mylnego — są niezmiernie pomocne podczas przekazywania informacji pomiędzy kolejnymi formularzami przedstawianymi użytkownikowi do wypeł- nienia. Na pewno docenisz je po wykonaniu poniższego ćwiczenia. Ć W I C Z E N I E 4.8 Użycie kilku formularzy Napisz program, który w pierwszym formularzu zbierze informacje o tym, jakim to- warem jest zainteresowany użytkownik, a w drugim, jak się nazywa. Po wpisaniu wszyst- kich potrzebnych danych program powinien wyświetlić zebrane informacje. Tym razem instrukcja warunkowa będzie bardziej skomplikowana — wszak musisz, w zależności od sytuacji, wyświetlić dwa formularze lub końcowy wynik. Pierwszy warunek będzie informował, że użyt- kownik nie wybrał jeszcze żadnego towaru, drugi — że nie podał swoich danych. Jeżeli oba będą spełnione, zostanie wyświetlona in- formacja o wyborze użytkownika. 4-08.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Co chciałbyś /TITLE /HEAD BODY 1 0 0 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne ? // Pozwala na wybór towarów, a następnie na wpisanie danych // użytkownika. Po wpisaniu wyświetla informacje o wyborze // i użytkowniku. Informacje o wybranych towarach są przekazywane // przez ukryte pola formularza. if (!($_POST[ zak1 ] || $_POST[ zakh ])) { // nie wybrano żadnego towaru print FORM ACTION= 4-08.php METHOD=POST ; print INPUT TYPE= checkbox NAME= zak1 VALUE= 1 Towar 1 BR ; print INPUT TYPE= checkbox NAME= zakh VALUE= 1 Towar h BR ; print INPUT TYPE= submit VALUE= Wyślij /FORM ; } elseif (!($_POST[ imienazwisko ])) { // są wpisane dane o towarach, ale nie o osobie if ($_POST[ zak1 ]) { print Wybrano towar 1 BR ; } if ($_POST[ zakh ]) { print Wybrano towar h BR ; } print FORM ACTION= 4-08.php METHOD=POST ; print INPUT TYPE= hidden NAME= zak1 VALUE= .$_POST [ zak1 ]. ; print INPUT TYPE= hidden NAME= zakh VALUE= .$_POST [ zakh ]. ; print Podaj imię i nazwisko: BR ; print INPUT TYPE= text NAME= imienazwisko ; print INPUT TYPE= submit VALUE= Wyślij /FORM ; } else { // masz już wszystkie dane if ($_POST[ zak1 ]) { print Wybrano towar 1 BR ; } if ($_POST[ zakh ]) { print Wybrano towar h BR ; } print BR Zamawiający: $imienazwisko BR ; } ? /BODY /HTML Warto zauważyć, że informacje o wybranych towarach są przekazy- wane pomiędzy pierwszym formularzem i stroną końcową poprzez ukryte pola, zaszyte w drugim formularzu. Często się zdarza, że chcesz dane wpisane przez użytkownika w for- mularzu otrzymać pocztą elektroniczną. Jeżeli korzystasz z systemu Unix, sprawa jest łatwa — istnieje funkcja mail, która się tym zajmie. Wywołanie jej w postaci: mail ( odbiorcamadres.pl , Wiadomość testowa , Tak działa funkcja mail , From: wwwadmin@serwer.pl ); Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 0 1 spowoduje posłanie na adres (będący parametrem) e-maila z tematem „Wiadomość testowa” i treścią: „Tak działa funkcja mail”. Nadawcą listu będzie wwwadmin@serwer.pl (jako czwarty parametr można okre- ślić nagłówki listu oddzielone od siebie znakami nowego wiersza). Jeżeli korzystasz z Krasnala, wysyłanie maili powinno od razu działać poprawnie. Natomiast jeżeli pracujesz na jakiejś innej dystrybucji, musisz uwierzyć, że ta funkcja działa poprawnie, mimo że prawdo- podobnie w Twoim systemie spowoduje błąd. Umieść ją w progra- mie tam, gdzie jest to konieczne, ale na razie w komentarzu, a jesz- cze lepiej — w instrukcji warunkowej. Po przeniesieniu na linuksowy „produkcyjny” serwer wysyłanie poczty elektronicznej powinno dzia- łać bezproblemowo. Podobnie stanie się, jeżeli odpowiednio skonfigu- rujesz serwer Windows (albo wpisując odpowiednie IP serwera SMTP w pliku php.ini i będąc z nim połączonym, albo instalując serwer SMTP na własnym komputerze). Cookies Jeżeli już miałeś do czynienia z programowaniem po stronie serwera lub używałeś JavaScriptu w bardziej zaawansowany sposób, pewnie wiesz, czym są cookies. Jeżeli nie, zapewne informacja „posłałem użytkownikowi ciasteczko” wywołuje u Ciebie konsternację. Zwróć uwagę, że takie „ciasteczko” (ang. cookie) nie jest sposobem osłodzenia życia osobom oglądającym stronę (choć każdy twórca stron powinien ich hołubić), a jedynie prostą metodą zapamiętania pewnych danych o kliencie w jego przeglądarce. Zasada jest prosta. O ile użytkownik wyrazi na to zgodę (decydują o tym ustawienia jego przeglądarki), masz prawo zapisać pewne doty- czące go informacje na jego dysku. Warto zapamiętać, że: 1. tylko Twój serwis będzie mógł pozyskać je z powrotem; 2. użytkownik może zabronić ich zapisu i nadzorować dowolnie ich treść. Oba fakty (jeśli wziąć pod uwagę prawo każdego do prywatności) wy- dają się bardzo sensowne. Pomimo tych ograniczeń cookies mogą być bardzo przydatne webmasterowi. Możesz je na przykład wykorzysty- wać, by umożliwić osobom, które wyrażą na to zgodę, zapamiętanie ich danych przy kolejnym wypełnianiu formularza. To duże ułatwienie dla odwiedzających, a wiele osób udostępnia w ten sposób swoje dane 1 0 2 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne zaufanym serwisom, aby nie musieć wpisywać informacji o sobie wielokrotnie. Wiele serwisów stosuje cookies, by śledzić działania użytkowników i tworzyć jego „profil” (w różnych celach — marketin- gowych czy handlowych). Takie działanie jest zresztą często uważane za wątpliwe pod względem etycznym. Jeżeli ktoś już robił zakupy w księgarni Amazon lub chociażby ko- rzystał z jej wyszukiwarki, nie powinien się zdziwić, gdy wchodząc ponownie na jej stronę, zauważy książki, które są związane z jego zainteresowaniami. Kiedyś nawet księgarnia ta sprawdzała, czy klient korzystał już z jej oferty, czy też nie, i jako nowemu dawała niższe ceny. Dwie osoby przeglądające informacje o danej książce mogły zobaczyć ją z całkiem różnymi cenami. Wywołało to wielkie oburze- nie klientów, co zaowocowało zaniechaniem wspomnianej praktyki. Można być pewnym, że za takim działaniem na pewno kryły się cookies, które księgarnia wysłała użytkownikowi i wykorzystywała, by ocenić, czy jest nowym, czy starym klientem, a także jakie są jego zainteresowania. Warto przez pewien czas poobserwować, jak i jakie informacje wysy- łają różne serwisy w postaci cookies. Istnieje możliwość ustawienia sobie opcji informowania o ich otrzymywaniu w przeglądarce: q w Internet Explorerze w formularzu Opcje internetowe w zakładce Zabezpieczenia i w opcji Poziom niestandardowy dla ustawień cookies włącz dwa razy opcję Monituj, q w Mozilli w formularzu Preferences w sekcji Advanced w grupie Cookies zaznacz opcję Warn me before accepting a cookie. Od tej pory, jeżeli jakiś serwis będzie próbował wysłać cookie, będziesz o tym informowany. Cookie zawiera kilka informacji, a wśród nich: q nazwę i wartość (nie mogą zawierać spacji), q termin ważności (jeżeli nie jest podany, uznaje się, że wygasa wraz z wyłączeniem przeglądarki), q informację domain, określającą serwer, którego dotyczy cookie (standardowo jest to ten serwer, który „ciasteczko” wysłał, ale na przykład wpisanie .domena.pl pozwala na dostęp do niego z domen typu domena.pl, www.domena.pl, online.domena.pl, serwis.domena.pl itd.), Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 0 3 q informację path, która określa, dla jakiego podkatalogu serwisu cookie ma być widoczne (zazwyczaj chcesz, aby było widoczne w całym serwisie i ustawiasz path=/). Musisz mieć świadomość, że nie wszyscy użytkownicy będą odbie- rać Twoje cookies. Narosło wokół nich wiele mitów, a prasa popularna podawała nie zawsze prawdziwe informacje o zagrożeniach, które ze sobą niosą (czasem nazywając je nawet programami, które serwis umieszcza na dysku użytkownika!). W związku z tym istnieje grono osób, które mają wyłączone ich przyjmowanie. Nie znaczy to jednak, że nie powinno się korzystać z cookies. Warto wykorzystywać je w takich zastosowaniach, w których mogą ułatwić użytkownikowi wizytę na stronie, lub które pozwolą Ci na zbieranie informacji statystycznych oraz takich, które możesz uzyskać, ale nie są koniecznie potrzebne do działania serwisu. Ciągle powinieneś jednak dbać, by ten poprawnie działał u użytkownika, który ma wyłączone przyjmowanie cookies. Ć W I C Z E N I E 4.9 Zliczanie liczby wyświetleń strony I Napisz program, który będzie zliczał, ile razy użytkownik wyświetlił daną stronę w czasie działania jego przeglądarki. To bardzo typowy przykład zastosowania cookie. Będziesz w nim przechowywać informację o liczbie wyświetleń danej strony. Cookie będzie nosiło nazwę ile, a jego wartością będzie liczba wyświetleń strony. Dostęp do informacji jest trywialny i bardzo podobny do od- czytu danych z formularza. Wartość „ciastka” o nazwie ile jest pamię- tana w specjalnej tablicy $_COO$_E w polu ile, więc możesz ją odczytać poprzez $_COO$_E[ ile ]. W celu przesłania użytkownikowi cookie posłuż się poleceniem setcookie. setcookie Posyła użytkownikowi cookie. Funkcja posiada sześć parametrów: pierwszy określa nazwę, drugi wartość cookie, trzeci to termin ważności, czwarty to informacja path, piąty — domain, a ostatni parametr to znacznik, który określa, czy cookie może być wysyłane jedynie przy bezpiecznym połączeniu (SSL), i domyślnie przyjmuje wartość 0. 1 0 4 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne 4-09.php ? // Program zlicza liczbę wyświetleń przez użytkownika danej strony // w czasie działania przeglądarki. Informacja jest zbierana w cookie. setcookie ( ile , ++$_COOKIE[ ile ]); ? HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Ile razy? /TITLE /HEAD BODY ? print Stronę odwiedziłeś .$_COOKIE[ ile ]. razy w czasie bieżącego ; print uruchomienia przeglądarki ; ? /BODY /HTML Pomimo że funkcja setcookie może mieć aż sześć parametrów, możesz ją wywoływać z mniejszą ich liczbą. W naszym programie podajesz jedynie pierwsze dwa — nazwę i wartość. Pozostałe przyjmą wartości domyślne. Powyższy skrypt nie ma zbyt wiele wspólnego ze zwykłym licznikiem — ciągle należy pamiętać, że zlicza odwiedziny każdego użytkownika oddzielnie. Skrypt przy każdym wywołaniu odczytuje wartość cookie o nazwie ile (poprzez zmienną $_COO$_E[ ile ]) i powiększa ją o 1. Obie te operacje są wykonywane jedną instrukcją przy użyciu przedrostkowego opera- tora inkrementacji. Jeżeli użytkownik nie miał do tej pory takiej in- formacji, zostanie ona ustalona na 1. Po uaktualnieniu wartości skrypt wyświetla informację o dotychczasowej liczbie odwiedzin. Zapamiętaj, że funkcja setcookie musi być wywoływana zawsze przed wysłaniem czegokolwiek do przeglądarki, nawet spacji czy pustego wiersza. Wadą programu jest to, że zlicza odwiedziny jedynie w czasie dzia- łania przeglądarki. Po jej ponownym włączeniu rozpocznie obliczenia od 1. Aby to poprawić, powinieneś ustalić termin ważności cookie. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 0 5 Ć W I C Z E N I E 4.10 Zliczanie liczby wyświetleń strony II Napisz program, który będzie zliczał liczbę wyświetleń strony przez użytkownika nawet po wyłączeniu przez niego przeglądarki. Zadanie jest bardzo proste. W celu jego realizacji użyj trzeciego ar- gumentu funkcji setcookie — daty ważności „ciastka”. 4-10.php ? // Program zlicza liczbę wyświetleń przez użytkownika danej strony. // Informacja jest zbierana w cookie, którego ważność wynosi 30 dni. setcookie ( ileh , ++$_COOKIE[ ileh ], time()+h59h000); ? HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Ile razy? /TITLE /HEAD BODY ? print Stronę odwiedziłeś ostatnio .$_COOKIE[ ileh ]. razy. ; ? /BODY /HTML Cookie celowo zostało nazwane inaczej niż w poprzednim przykładzie, aby podczas testowania nie było niejasności. Pamiętaj, że programy z obu ćwiczeń (4.9 i 4.10) mogą zobaczyć oba „ciastka”: ile i ile2. Nie ma tu znaczenia, który z nich któremu nadał wartość. Chcesz określić termin ważności cookie na miesiąc. Używasz funk- cji time, by ustalić bieżący znacznik czasu. Obliczasz liczbę sekund w 30 dniach (60 sekund *60 *24 *30), co daje wynik 2 592 000. Usta- lasz więc termin ważności, dodając tę wartość do bieżącego znaczni- ka czasu. W programie fakt, że termin ważności został ustawiony na miesiąc, nie oznacza, że cookie wygaśnie po 30 dniach. Jeżeli strona w tym czasie będzie odwiedzona, zostanie odświeżona wartość cookie ile2, z no- wym (znowu miesięcznym) terminem ważności. Cookie straci więc swoją ważność po 30 dniach od ostatnich odwiedzin użytkownika na stronie. 1 0 6 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Powyższe przykłady nie są w praktyce szczególnie przydatne. Spró- buj teraz wykorzystać poznaną technologię do realizacji użytecz- nych zadań. Ć W I C Z E N I E 4.11 Przechowywanie informacji w cookies Napisz program, który wyświetla formularz pobierający imię i nazwisko użytkowni- ka. Jeżeli użytkownik wyrazi na to zgodę, program powinien zapamiętać wpisane dane w cookies w celu uproszczenia ponownego wypełnienia formularza. W wyświetlanym formularzu uwzględnij pole wyboru, które pozwoli użytkownikowi na decyzję, czy chce, by jego dane zostały zapamiętane, czy też nie. Każdemu użytkownikowi posyłasz cookies — w zależności od jego wyboru z wpisanymi wartościami lub z wartościami pustymi, by usunąć ewentualne poprzednio zapisane informacje. 4-11.php ? // Drukuje formularz i jednocześnie odbiera i wyświetla wpisane // w nim dane. Informacje są zapisywane w cookie. $imie = htmlspecialchars ($_POST[ imie ]); $nazwisko = htmlspecialchars ($_POST[ nazwisko ]); $imiecookie = htmlspecialchars ($_COOKIE[ imiecookie ]); $nazwiskocookie = htmlspecialchars ($_COOKIE[ nazwiskocookie ]); if (($nazwisko) ($imie)) { // są wpisane wartości w formularzu if ($_POST[ pamietac ]) { setcookie ( imiecookie , $imie , time()+h59h0000); setcookie ( nazwiskocookie , $nazwisko , time()+h59h0000); } else { setcookie ( imiecookie , ); setcookie ( nazwiskocookie , ); } } ? HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Pamiętasz imię i nazwisko /TITLE /HEAD BODY ? Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 0 7 if (($nazwisko) ($imie)) { // są wpisane wartości w formularzu print Wpisana wartość to B $imie $nazwisko /B . BR ; print A HREF= 4-11.php Powrót do formularza /A ; } else { // nie ma wpisanych danych, wyświetlasz formularz print FORM ACTION= 4-11.php METHOD=POST ; print TABLE TR TD nazwisko: /TD TD INPUT TYPE= text ; print NAME= nazwisko VALUE= $nazwiskocookie /TD /TR ; print TR TD imię: /TD TD INPUT TYPE= text ; print NAME= imie VALUE= $imiecookie /TD /TR /TABLE ; print Chcę, żeby program pamiętał dane: INPUT TYPE= checkbox ; print NAME= pamietac BR ; print BR INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } ? /BODY /HTML Ponieważ odebrane dane zostaną wyświetlone na stronach WWW, po odebraniu danych z formularza przetwarzasz je funkcją htmlspecial- chars, aby uniknąć niepożądanych efektów, takich jak w ćwiczeniu 4.1. Możesz zapytać jednak, w jakim celu użyto tej funkcji do przetworze- nia wartości cookies? Pamiętaj, że musisz do nich podchodzić tak samo nieufnie, jak do wartości pól formularzy — użytkownik, chcąc zaszkodzić, może manipulować wartościami cookies podobnie, jak war- tościami wpisanymi w formularzu! Jeżeli chcesz zapamiętać jakieś dane osobowe użytkownika swojego serwisu, dobrym zwyczajem jest zapytanie go najpierw, czy rzeczy- wiście tego chce. Ciekawym rozwiązaniem jest to zaprezentowane w tym ćwiczeniu — w postaci pola wyboru. Być może użytkownik będzie korzystał z cudzego komputera, przeglądając serwis (np. w ka- wiarni internetowej). Dzięki polu w formularzu będzie mógł łatwo zadecydować, czy chce, by jego dane zostały zapamiętane na kompu- terze, czy też nie. Ć W I C Z E N I E 4.12 Losowe wyświetlanie bannera Napisz program, który wyświetla użytkownikowi banner reklamowy (wylosowany jeden z pięciu). 1 0 8 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Postaraj się, by — o ile to możliwe — użytkownik przy kolejnej wi- zycie na stronie w pierwszej kolejności oglądał te bannery, których jeszcze nie widział. Dla każdego bannera w cookie zapamiętaj informację, iż był już wy- świetlony danemu użytkownikowi. Pięć bannerów zamieszczono w katalogu bannery — w przykładach na serwerze. 4-12.php ? // System wyświetlania bannerów, który stara się, by użytkownikowi // nie wyświetlić powtórnie bannera, dopóki nie obejrzy przynajmniej // raz wszystkich. for ($i=1; $i =5; $i++) { // sprawdzasz, które bannery już wyświetlano $jest = $_COOKIE[ banner .$i]; if (!($jest)) { $tab[] = $i; $znaleziono = 1; } } // jeżeli nie wyświetlano, włączasz do tabeli wszystkie. if (!($znaleziono)) { for ($i=1; $i =5; $i++) { $tab[$i-1] = $i; }} $nr= $tab[rand() count($tab)]; setcookie ( banner .$nr, 1 , time()+86400); ? HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Losowy (prawie?) banner /TITLE /HEAD BODY ? print IMG SRC= bannery/$nr.gif ; ? /BODY /HTML W pierwszej pętli for sprawdzasz, które bannery nie były jeszcze wy- świetlane. Jeżeli taki znajdziesz, wpisz jego numer do tabeli. Warto zauważyć, że kolejna dana jest dopisana do tablicy w niespotykany jeszcze sposób: $tao[ ] odwołuje się do pierwszego wolnego pola w ta- beli — jest to bardzo wygodna i często stosowana konstrukcja. Jeżeli nie znaleziono żadnego bannera, który nie był jeszcze wyświetlo- ny, uznajesz, że użytkownik widział już wszystkie. W związku z tym można mu wyświetlić dowolny z nich — więc wszystkie dopisujesz do tablicy. Następnie losujesz numer z tabeli (zwróć uwagę na sposób, Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 0 9 w jaki określasz liczbę jej elementów, używając funkcji codnt). Na końcu posyłasz użytkownikowi informację o wylosowanym bannerze i wy- świetlasz go. W poprzednim ćwiczeniu (przy podawaniu danych osobowych) pozo- stawienie odbiorcy decyzji, czy chce, by te informacje były pamiętane, miało głęboki sens. W przypadku tego ćwiczenia oczywiście takiego sensu nie ma. Niezależnie od tego, z jakiego komputera korzysta użyt- kownik, pozostawienie informacji, który losowy banner już widział, nie ma żadnego znaczenia. Warto pomyśleć, jak zmodyfikować program, by przesyłał tylko jedno cookie informacyjne, a nie inne dla każdego bannera. Jeden serwis może posłać danemu użytkownikowi tylko niewielką liczbę „ciaste- czek”, więc powinieneś je szanować. Spróbuj zmodyfikować program tak, by w jednym przesyłanym cookie informacje o wyświetlonych bannerach były oddzielone przecinkami. Należy zauważyć, że w obu powyższych praktycznych przykładach skrypty będą działały poprawnie, nawet jeżeli użytkownik nie odbie- rze „ciasteczek”. Pierwszy po prostu nie podpowie mu jego danych w formularzu, jednak poprawnie go wyświetli i odbierze wpisane dane. Drugi program w przypadku braku informacji będzie po prostu wyświetlał losowy banner. W żadnym wypadku programy nie stracą jednak swojej funkcjonalności. Obsługa plików Do tej pory dane dla tworzonych przez Ciebie programów były wpi- sywane z klawiatury, a wyniki wypisywane na ekranie. Przydałaby się jednak także metoda pamiętania informacji w jakiś trwalszy — i łatwy do przekazania programowi — sposób. Taki warunek spełniają pliki dyskowe. PHP potrafi zapisywać i odczytywać pliki w systemie ope- racyjnym serwera. Należy podkreślić jeszcze raz: jesteś w stanie (zgod- nie z uprawnieniami, które zostaną tam nadane odpowiednim kata- logom i plikom) tworzyć, zapisywać, odczytywać i usuwać pliki na serwerze. Na serwerze, a nie na komputerze użytkownika. Zapis i odczyt plików może być niezwykle przydatny do zapamiętania niewielkich ilości informacji zarówno dla całego serwisu, jak i dla poje- dynczego użytkownika. Tak naprawdę mechanizm sesji przedstawiony 1 1 0 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne w kolejnym punkcie opiera się właśnie na plikach tekstowych. Jeżeli będziesz chciał pamiętać więcej informacji, lepszą metodą okaże się skorzystanie z bazy danych (punkt 4.5), ale jeżeli jest ich niewiele, można użyć plików tekstowych. Najprostsza operacja na pliku składa się z trzech etapów: otwarcia pliku, zapisu lub odczytu z niego danych i zamknięcia pliku. Ć W I C Z E N I E 4.13 Tworzenie pliku i zapis danych Napisz program, który w podkatalogu dane utworzy plik z Twoim imieniem i nazwi- skiem. Na początku należy utworzyć katalog dane, w którym powstanie plik. Jeżeli korzystasz z systemu Windows, sprawa jest prosta: po prostu utwórz go jako podkatalog tego, w którym przechowujesz pliki PHP. Jeżeli natomiast korzystasz z serwera linuksowego, musisz jeszcze nadać odpowiednie prawa katalogowi, w celu umożliwienia wszyst- kim zapisu. Pozwoli na to program FTP, którego używasz (jeżeli nie, koniecznie go zmień!). Ustaw dla katalogu prawa na 666. Wykorzystaj trzy funkcje operujące na plikach. fopen Otwarcie pliku o nazwie określonej pierwszym parametrem, w trybie określonym drugim parametrem. Na przykład r oznacza otwarcie do odczytu, a w — do zapisu. Funkcja zwraca uchwyt pliku, poprzez który możesz się do niego odwoływać. fpdts Pozwala na zapis tekstu, który jest drugim parametrem, do pliku określonego uchwytem w pierwszym parametrze. fclose Zamyka wskazany przez uchwyt plik. 4-13.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Zapisujesz plik /TITLE /HEAD BODY ? // Program tworzy plik tekstowy z imieniem i nazwiskiem. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 1 1 $plik = mfopen ( dane/imienazwisko.txt , w ); if (!($plik)) { print BŁĄD: Nie da się utworzyć pliku. ; } else { print Plik z imieniem i nazwiskiem został utworzony. ; fputs ($plik, Andrzej Kierzkowski ); fclose ($plik); } ? /BODY /HTML Zwróć uwagę na znak @ przed wywołaniem fopen — dzięki niemu in- formujesz PHP, że ewentualne błędy w wykonaniu nie mają być wy- syłane do przeglądarki. Po próbie otwarcia pliku dobrym zwyczajem jest zweryfikowanie, czy operacja się powiodła. Czynisz to poprzez sprawdzenie, czy uchwyt (zmienna $plik) ma ustaloną wartość. Jeżeli pracujesz w systemie Windows, a program zakończył działanie błę- dem, najprawdopodobniej nie założyłeś katalogu dane lub założyłeś go w złym miejscu (powinien być podkatalogiem tego, w którym znajduje się program z bieżącego ćwiczenia). Jeżeli program zakoń- czył działanie pomyślnie, poszukaj utworzonego pliku i sprawdź jego zawartość. Ć W I C Z E N I E 4.14 Odczyt danych z pliku Napisz program, który odczyta utworzony w poprzednim ćwiczeniu plik i wyświetli jego zawartość. Tym razem otworzysz plik w trybie „do odczytu”. Użyj funkcji, która odczytuje dane z pliku. fgets Odczytuje z pliku wskazanego przez pierwszy argument liczbę znaków w bieżącym wierszu, określoną przez drugi, opcjonalny, argument. 4-14.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Odczytywanie pliku /TITLE /HEAD 1 1 2 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne BODY ? // Program odczytuje plik tekstowy z imieniem i nazwiskiem. $plik = mfopen ( dane/imienazwisko.txt , r ); if (!($plik)) { print BŁĄD: Nie da się otworzyć pliku. ; } else { $wiersz = fgets ($plik, h55); print Dane z pliku: B $wiersz /B ; fclose ($plik); } ? /BODY /HTML Aby sprawdzić, czy plik istnieje, możesz wykorzystać w tym celu funkcję file_exist. file_exists Zwraca prawdę, gdy istnieje plik, którego nazwę podaje się jako parametr, a fałsz — w przeciwnym razie. Pomyśl, jak poprawić program, by najpierw sprawdzał, czy plik ist- nieje, a dopiero potem go otwierał. Ciekawy jest fakt, że za pomocą funkcji z poprzedniego ćwiczenia możesz odczytywać pliki nie tylko z serwera, ale także inne dostępne w internecie za pośrednictwem protokołów HTTP i FTP. Ć W I C Z E N I E 4.15 Zmiana sposobu wyświetlania odczytanej strony WWW Napisz program, który odczyta zawartość głównej strony serwisu http://helion.pl i wyświetli ją, zamieniając najpierw kolor tła z niebieskawego na zielony. W celu wykonania tego ćwiczenia serwer, na którym uruchamiasz pro- gramy PHP, musi być podłączony do internetu, aby program mógł odczytać stronę Helionu. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 1 3 4-15.php ? // Program odczytuje stronę helion.pl i wyświetla, podmieniając kolory. $plik = fopen ( http://helion.pl , r ); if (!($plik)) { print BŁĄD: Nie da się otworzyć strony http://helion.pl ; } else { while (!(feof($plik))) { $wiersz = (fgets ($plik, h55)); $wiersz = str_replace ( #E4E7ED , #AhFFB5 , $wiersz); $wiersz = str_replace ( SRC= , SRC= http://helion.pl , $wiersz); print $wiersz ; } fclose ($plik); } ? Nie wypisujesz nagłówków HTML, licząc na to, że strona ma swo- je. Po odczytaniu przetwarzasz plik wiersz po wierszu, używając funk- cji feof. feof Zwraca prawdę, gdy osiągnięto koniec pliku, określonego pierwszym parametrem, a fałsz — w przeciwnym razie. W każdym wierszu dokonujesz dwóch operacji: po pierwsze — zamie- niasz kolor z niebieskawego (#E4E#E4) na zielony (#A2FFB5) a po drugie — poprawiasz adresy wszystkich ilustracji, by zawierały również adres serwera (w innym przypadku nie byłoby ich widać, ponieważ pro- gram szukałby ich na Twoim serwerze). Efekt jest… ciekawy, choć niebieski kolor komponuje się znacznie lepiej. Zauważ, że układ strony się nieco „rozsypał”. Spróbuj odgad- nąć, co jest tego przyczyną. Przyjrzyj się, jak są odczytywane pliki z definicjami styli. W praktyce najczęściej pliki pamiętane na dysku będą wspólne dla wszystkich odwiedzających — znajdą się w nich informacje, którymi będą się oni mogli dzielić. Istnieje w związku z tym ryzyko, że dwie osoby jednocześnie będą pracować na jednym pliku, co może spo- wodować niemałe kłopoty. 1 1 4 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne Wyobraź sobie sytuację, gdy w pliku jest pamiętany aktualny stan licznika odwiedzin danej strony. Sam licznik działa w taki sposób, że odczytuje wartość z tego pliku, zwiększa ją o 1 i zapisuje z powro- tem (i oczywiście wyświetla wartość odwiedzającemu). Nieszczęśliwy przypadek może spowodować, że dwie osoby niemalże jednocześnie uruchamiają program. Działania mogą przybrać opisany niżej, nieko- rzystny dla Ciebie przebieg. 1. Pierwszy użytkownik odczyta wartość z pliku. 2. Drugi użytkownik odczyta tę samą wartość z pliku. 3. Pierwszy użytkownik zwiększy wartość o 1 i zapisze. 4. Drugi użytkownik zwiększy wartość o 1 i zapisze. Jaki będzie efekt? Stronę odwiedziły dwie osoby, a wskazanie licznika wzrośnie tylko o 1! Stanie się tak dlatego, że dwie osoby będą miały dostęp do pliku w jednym czasie, podczas gdy odczyt, zwiększenie i zapisanie wartości z powrotem powinno się odbyć w czasie, gdy inne osoby nie mogą nawet odczytać wartości licznika. Jest to możliwe do zrealizowania poprzez zablokowanie pliku na czas trwania operacji. flock Ustawia blokadę pliku, którego uchwyt jest pierwszym argumentem w trybie określonym przez drugi. Na przykład tryb 2 oznacza blokowanie na wyłączność, a tryb 3 — odblokowanie. Ć W I C Z E N I E 4.16 Prosty licznik tekstowy Napisz program, realizujący prosty licznik tekstowy, którego wskazanie jest pamię- tane w pliku tekstowym. Pamiętaj o blokowaniu pliku. Plik ze wskazaniem licznika zapamiętaj w katalogu dane. Program sprawdzi najpierw, czy plik licznika już istnieje, a jeśli takiego pliku nie ma, zajmie się jego utworzeniem. 4-16.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Licznik /TITLE /HEAD BODY Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 1 5 ? // Program pokazuje działanie prostego licznika tekstowego. if (!(file_exists( dane/liczba.txt ))) { // nie ma pliku z licznikiem $plik = fopen ( dane/liczba.txt , w+ ); fputs ($plik, 0 ); // więc go tworzysz fclose ($plik); } $plik = fopen ( dane/liczba.txt , r+ ); if (!($plik)) { print BŁĄD: Nie da się otworzyć pliku. ; } else { flock ($plik, h); $ile = fgets ($plik, h55); $ile++; print Licznik wskazuje $ile. ; fseek ($plik, 0); fputs ($plik, $ile ); flock ($plik, 3); fclose ($plik); } ? /BODY /HTML Jeżeli plik nie istnieje, otwierasz go w trybie w+ (tryb ten pozwala na otwarcie istniejącego pliku do zapisu, uprzednio usuwając jego zawar- tość, a jeśli nie istnieje — tworzy go). Jeżeli plik istnieje, otwierasz go w trybie r+, co pozwala na czytanie i zapis do niego. Po odczytaniu danych wskaźnik przesunął się poza liczbę odwiedzin. Jeżeli wpisałbyś nową, zostałaby dopisana na końcu pliku, po pier- wotnej. Aby wpisać ją znów we właściwym miejscu, należy przesunąć się z powrotem do początku pliku. W tym celu użyto funkcji fseek. fseek Przesuwa wskaźnik położenia w pliku, którego uchwyt jest pierwszym argumentem, w miejsce wskazane przez drugi. Warto zauważyć, że blokada pliku nastąpiła po jego otwarciu (musi tak być, inaczej zmienna plikowa nie byłaby określona), a odblo- kowanie — przed zamknięciem. W czasie istnienia blokady pliku do- konujesz na nim wszystkich operacji: odczytu, przesunięcia wskaźni- ka i zapisu. 1 1 6 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne W ćwiczeniach przedstawionych do tej pory pliki umieszczano w pod- katalogu tego, w którym występują dokumenty PHP, co oznacza, że znajdują się one w drzewie katalogów serwera WWW. Nietrudno przewidzieć, co to oznacza. Zamiast http://localhost/cwphp/4-14.php wystarczy w przeglądarce wpisać adres http://localhost/cwphp/dane/ imienazwisko.txt, a wówczas to, co być może miało być ukryte, stanie się całkiem jawne. Niejednokrotnie poważne serwisy postępują w taki sposób, ujawniając nawet dane dotyczące swoich klientów. Jeżeli ko- niecznie chcesz przechowywać pliki z informacjami w strukturze katalogów serwisu, koniecznie zabezpiecz je metodą, którą poznałeś w ćwiczeniu 2.4. Pamiętaj jednak, że nie jest to zabezpieczenie bardzo pewne, dlatego dużo lepiej jest umieszczać pliki poza strukturą serwisu. Możesz też utworzyć w katalogu plik .htaccess i umieścić w nim pole- cenie 4eny from all, które uniemożliwia odczytanie za pomocą serwera plików leżących wewnątrz. Warto też zwrócić uwagę, że masz dostęp do całego dysku serwera, który jest ograniczony jedynie nadanymi prawami do katalogów. Aby odwoływać się do pliku, który znajduje się poza strukturą serwisu, najlepiej używaj ścieżki bezwzględnej (za- czynającej się od katalogu głównego struktury plików). Możesz więc próbować tworzyć pliki o nazwach /home/httpd/aki/mojplik.txt (o ile nadałeś katalogowi aki odpowiednie prawa) czy C:usrapacheplik.txt. Pomimo faktu, że pliki dyskowe zazwyczaj tworzy się po to, by wy- mieniać informacje pomiędzy poszczególnymi użytkownikami, jest możliwe łatwe utworzenie unikatowego pliku tymczasowego dla jed- nego użytkownika. W tym celu wykorzystuje się funkcję tempnam. tempnam Tworzy plik o unikatowej nazwie w katalogu określonym pierwszym parametrem. Początek nazwy można określić drugim parametrem. Plik zwraca nazwę utworzonego pliku. Ć W I C Z E N I E 4.17 Przechowywanie informacji w pliku tymczasowym Napisz program, który będzie zbierał informacje o użytkowniku, podobnie jak ten z ćwiczenia 4.8. Dane niech będą jednak zbierane w pliku tymczasowym, którego nazwa będzie przekazywana w ukrytym polu. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 1 7 Bezpieczną lokalizacją dla plików tymczasowych w systemie Windows jest C:WINDOWS TEMP, a w Linuksie — katalog /tmp. Jeżeli w wy- wołaniu funkcji tempnam podasz nazwę nieistniejącego katalogu, plik zostanie założony w domyślnym katalogu plików tymczasowych w systemie. 4-17.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Co chciałbyś -- h /TITLE /HEAD BODY ? // Pozwala na wybór towarów, a następnie na wpisanie danych // użytkownika. Po wpisaniu wyświetla informacje o wyborze // i użytkowniku. Informacje o wybranych towarach są // przechowywane w pliku tekstowym. if (!($_POST[ nazwapliku ] || $_POST[ zak1 ] || $_POST[ zakh ])) { // nie ma danych print FORM ACTION= 4-17.php METHOD=POST ; print INPUT TYPE= checkbox NAME= zak1 VALUE= 1 Towar 1 BR ; print INPUT TYPE= checkbox NAME= zakh VALUE= 1 Towar h BR ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } else { if (($_POST[ zak1 ]) || ($_POST[ zakh ])) { // wybrano towar w poprzednim formularzu $nazwapliku = tempnam ( C:WINDOWSTEMP , ); $plik = fopen ($nazwapliku, w ); fputs ($plik, $_POST[ zak1 ]. ); fputs ($plik, $_POST[ zakh ]. ); fclose ($plik); print FORM ACTION= 4-17.php METHOD=POST ; print INPUT TYPE= hidden NAME= nazwapliku ; print VALUE= $nazwapliku ; print Podaj imię i nazwisko: BR ; print INPUT TYPE= text NAME= imienazwisko ; print INPUT TYPE= submit VALUE= Wyślij ; print /FORM ; } else { // masz już wszystkie dane $plik = fopen ($_POST[ nazwapliku ], r ); $zak1 = fgets ($plik, h55); $zakh = fgets ($plik, h55); fclose ($plik); if ($zak1 0) { print Wybrano towar 1 BR ; } if ($zakh 0) { print Wybrano towar h BR ; } 1 1 8 PHP5. Tworzenie stron WWW • Ćwiczenia praktyczne print BR Zamawiający: .$ _POST[ imienazwisko ]. BR ; unlink ($_POST[ nazwapliku ]); } } ? /BODY /HTML Jak widzisz, w ukrytym polu formularza była przenoszona jedynie in- formacja o nazwie pliku. Wybrane przez użytkownika towary prze- chowano w pliku tymczasowym. Aby „posprzątać” po sobie i usunąć niepotrzebny już plik, użyłeś funkcji dnlink. dnlink Usuwa plik o nazwie podanej jako parametr. Istnieje możliwość wczytania całej zawartości pliku do tablicy za pomocą pojedynczej instrukcji. Wtedy każdy wiersz pliku zostanie zamieszczony w oddzielnym polu tablicy. file Wczytuje całą zawartość pliku o nazwie podanej jako parametr. Trzeba uważać, by nie przeprowadzać w ten sposób operacji na dużych plikach, gdyż może się to zakończyć katastrofą. Dla małych plików jest to jednak bardzo wygodna metoda. Ć W I C Z E N I E 4.18 Losowe przysłowie Napisz program, który będzie wyświetlał jedno wylosowane przysłowie z wielu za- pamiętanych w pliku tekstowym. Zacznij od utworzenia pliku tekstowego z przysłowiami. Każde za- mieść w osobnym wierszu. 4-18.php HTML HEAD META HTTP-EQUIV= Content-Type CONTENT= text/html; charset=iso-8859-h TITLE Odczytywanie pliku /TITLE /HEAD BODY ? // Program odczytuje plik tekstowy i wyświetla losowe przysłowie. Rozdział 4. • Dane — pobieranie, przekazywanie i przechowywanie 1 1 9 $przyslowia = file ( dane/przyslowia.txt , false); $przyslowie = chop($przyslowia[rand() count($przyslowia)]); print Przysłowie na dziś: B $przyslowie /B ; ? /BODY /HTML Program wczytuje cały plik z przysłowiami
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP5. Tworzenie stron WWW. Ćwiczenia praktyczne. Wydanie II
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ą: