Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00628 011824 11058373 na godz. na dobę w sumie
PHP. Receptury. Wydanie II - książka
PHP. Receptury. Wydanie II - książka
Autor: , Liczba stron: 816
Wydawca: Helion Język publikacji: polski
ISBN: 83-246-0827-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook, audiobook).

Podręczny słownik 250 sprawdzonych
i skutecznych rozwiązań z zakresu języka PHP

PHP to najpopularniejszy język skryptowy na świecie, wykorzystywany w milionach witryny internetowych. Szeroki wachlarz możliwości, łatwa składnia oraz współpraca z wieloma systemami operacyjnymi sprawiają, że jest to idealne narzędzie do tworzenia dynamicznych aplikacji WWW. Od wersji PHP 5 język ten obsługuje programowanie obiektowe oraz udostępnia usprawniony mechanizm współpracy z bazami danych, co w znacznym stopniu ułatwia kreowanie rozbudowanych programów sieciowych.

Drugie wydanie książki 'PHP. Receptury' zawiera jeszcze więcej gotowych rozwiązań, które zostały dostosowane do nowej wersji języka, czyli PHP 5. Dodatkowo ulepszona forma umożliwia łatwiejsze znalezienie potrzebnych receptur. Pozwolą Ci one szybko rozwiązać często spotykane problemy. Czytając tę książkę dowiesz się między innymi, jak wykonywać operacje na różnych typach danych, jakie elementy składają się na programy PHP i jak z nich korzystać, a także jak obsługiwać formularze czy współpracować z bazami danych. Nauczysz się stosować techniki zarządzania sesjami. Poznasz zasady korzystania z XML, współpracy z kodem w języku JavaScript, a także rozwiązania wielu innych praktycznych problemów.

Wykorzystaj gotowy kod do błyskawicznego
tworzenia dynamicznych witryn internetowych.

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

Darmowy fragment publikacji:

PHP. Receptury. Wydanie II Autorzy: Adam Trachtenberg, David Sklar T³umaczenie: Marek Pa³czyñski ISBN: 978-83-246-0827-0 Tytu³ orygina³u: PHP Cookbook Format: B5, stron: 816 Przyk³ady na ftp: 194 kB Podrêczny s³ownik 250 sprawdzonych i skutecznych rozwi¹zañ z zakresu jêzyka PHP (cid:129) Praca z typami danych i blokami programów PHP (cid:129) Obs³uga formularzy, baz danych i sesji (cid:129) Tworzenie wydajnych i bezpiecznych witryn internetowych PHP to najpopularniejszy jêzyk skryptowy na œwiecie, wykorzystywany w milionach witryny internetowych. Szeroki wachlarz mo¿liwoœci, ³atwa sk³adnia oraz wspó³praca z wieloma systemami operacyjnymi sprawiaj¹, ¿e jest to idealne narzêdzie do tworzenia dynamicznych aplikacji WWW. Od wersji PHP 5 jêzyk ten obs³uguje programowanie obiektowe oraz udostêpnia usprawniony mechanizm wspó³pracy z bazami danych, co w znacznym stopniu u³atwia kreowanie rozbudowanych programów sieciowych. Drugie wydanie ksi¹¿ki „PHP. Receptury” zawiera jeszcze wiêcej gotowych rozwi¹zañ, które zosta³y dostosowane do nowej wersji jêzyka, czyli PHP 5. Dodatkowo ulepszona forma umo¿liwia ³atwiejsze znalezienie potrzebnych receptur. Pozwol¹ Ci one szybko rozwi¹zaæ czêsto spotykane problemy. Czytaj¹c tê ksi¹¿kê dowiesz siê miêdzy innymi, jak wykonywaæ operacje na ró¿nych typach danych, jakie elementy sk³adaj¹ siê na programy PHP i jak z nich korzystaæ, a tak¿e jak obs³ugiwaæ formularze czy wspó³pracowaæ z bazami danych. Nauczysz siê stosowaæ techniki zarz¹dzania sesjami. Poznasz zasady korzystania z XML, wspó³pracy z kodem w jêzyku JavaScript, a tak¿e rozwi¹zania wielu innych praktycznych problemów. (cid:129) Praca z typami danych (cid:129) Korzystanie z ró¿nych bloków aplikacji PHP (cid:129) Obs³uga formularzy (cid:129) Praca z bazami danych (cid:129) Przetwarzanie dokumentów XML (cid:129) Us³ugi Web Services (cid:129) Zarz¹dzanie sesj¹ (cid:129) Generowanie grafiki na stronach internetowych (cid:129) Zabezpieczanie witryn (cid:129) Obs³uga b³êdów (cid:129) Optymalizacja kodu (cid:129) Praca z systemem plików i katalogów Wykorzystaj gotowy kod do b³yskawicznego tworzenia dynamicznych witryn internetowych Wydawnictwo Helion ul. Koœciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl 1. Wstęp ............................................................................................................................. 15 Łańcuchy znaków ..........................................................................................................23 23 1.0. Wprowadzenie 26 1.1. Uzyskiwanie dostępu do podłańcuchów znaków 27 1.2. Wyodrębnianie podłańcuchów znaków 1.3. Zastępowanie podłańcuchów znaków 29 30 1.4. Przetwarzanie łańcucha znaków znak po znaku 32 1.5. Odwracanie kolejności słów lub znaków w łańcuchu znaków 1.6. Poszerzanie i zwężanie tabulatorów 33 35 1.7. Kontrolowanie wielkości liter 37 1.8. Umieszczanie funkcji i wyrażeń wewnątrz łańcuchów znaków 38 1.9. Odcinanie od ciągów tekstowych znaków niewidocznych 1.10. Generowanie danych rozdzielanych znakami przecinka 40 41 1.11. Parsowanie danych oddzielanych przecinkami 42 1.12. Generowanie rekordów danych o stałej szerokości pól 1.13. Parsowanie danych o stałej szerokości 44 47 1.14. Dzielenie łańcuchów znaków 49 1.15. Łamanie tekstu do określonej długości linii 51 1.16. Przechowywanie danych binarnych w łańcuchach znaków 1.17. Program — pobieranie pliku CSV 53 2. Liczby .............................................................................................................................57 57 2.0. Wprowadzenie 2.1. Sprawdzanie, czy zmienna zawiera poprawną liczbę 58 59 2.2. Porównywanie liczb zmiennopozycyjnych 60 2.3. Zaokrąglanie liczb zmiennopozycyjnych 2.4. Wykonywanie operacji na seriach liczb całkowitych 61 3 2.5. Generowanie liczb losowych z danego przedziału 2.6. Generowanie ważonych liczb losowych 2.7. Obliczanie logarytmów 2.8. Obliczanie potęg 2.9. Formatowanie liczb 2.10. Formatowanie wartości walutowych 2.11. Wyświetlanie słów w liczbie mnogiej 2.12. Obliczanie wartości funkcji trygonometrycznych 2.13. Obliczanie funkcji trygonometrycznych w stopniach, a nie w radianach 2.14. Obsługa bardzo dużych lub bardzo małych liczb 2.15. Przekształcanie liczb z jednego systemu liczbowego na inny 2.16. Wykonywanie obliczeń na liczbach systemów innych niż dziesiętny 2.17. Określenie odległości między dwoma punktami 63 65 66 66 67 69 70 72 73 73 75 76 78 3. Daty i czas ...................................................................................................................... 81 81 3.0. Wprowadzenie 3.1. Sprawdzanie aktualnej daty i czasu 82 85 3.2. Przekształcanie elementów daty i czasu w znaczniki czasu epoki 87 3.3. Przekształcanie znacznika czasu epoki w elementy czasu i daty 3.4. Wyświetlanie daty lub czasu w określonym formacie 88 3.5. Obliczanie różnicy między dwiema datami 93 3.6. Obliczanie różnicy między dwiema datami mierzonej w dniach liczonych według kalendarza juliańskiego 3.7. Znajdowanie dnia tygodnia, miesiąca lub roku oraz numeru tygodnia w roku 3.8. Weryfikacja poprawności daty 3.9. Parsowanie dat i czasu z łańcuchów znaków 3.10. Dodawanie lub odejmowanie czasu od daty 3.11. Wyznaczanie czasu w strefach czasowych 3.12. Uwzględnianie czasu letniego 3.13. Generowanie czasu o wysokiej precyzji 3.14. Generowanie przedziałów czasowych 3.15. Stosowanie kalendarzy innych niż gregoriański 3.16. Korzystanie z dat wykraczających poza zakres znacznika czasu epoki uniksowej 3.17. Program Calendar 95 96 98 100 103 104 110 111 113 114 118 120 4. Tablice .......................................................................................................................... 123 123 4.0. Wprowadzenie 4.1. Tworzenie tablicy zaczynającej się od indeksu różnego od 0 125 127 4.2. Przechowywanie w tablicy wielu elementów pod jednym kluczem 128 4.3. Inicjowanie tablicy liczbami całkowitymi z określonego przedziału 4.4. Iterowanie przez kolejne elementy tablicy 129 4 | Spis treści 4.5. Usuwanie elementów z tablicy 4.6. Zmienianie rozmiaru tablicy 4.7. Łączenie tablic 4.8. Przekształcanie tablicy w łańcuch znaków 4.9. Wyświetlanie zawartości tablicy z przecinkami 4.10. Sprawdzanie, czy klucz jest w tablicy 4.11. Sprawdzanie, czy element jest w tablicy 4.12. Znajdowanie pozycji elementu w tablicy 4.13. Znajdowanie elementów, które spełniają odpowiednie warunki 4.14. Znajdowanie elementu tablicy o największej lub najmniejszej wartości 4.15. Odwracanie tablicy 4.16. Sortowanie tablicy 4.17. Sortowanie tablicy na podstawie porównywalnych pól 4.18. Sortowanie wielu tablic 4.19. Sortowanie tablicy przy użyciu metody, a nie funkcji 4.20. Ustawianie elementów tablicy w kolejności losowej 4.21. Usuwanie z tablicy powtarzających się elementów 4.22. Przypisanie funkcji do każdego elementu tablicy 4.23. Wyznaczanie sumy, przecięcia lub różnicy między dwiema tablicami 4.24. Wykorzystanie obiektu w sposób charakterystyczny dla tablic 4.25. Program — wyświetlanie tablicy w tabeli HTML z kolumnami ułożonymi w poziomie 131 133 135 137 138 139 140 142 143 144 145 146 147 149 151 151 152 153 155 157 160 5. 6. Zmienne ....................................................................................................................... 163 163 5.0. Wprowadzenie 164 5.1. Unikanie pomyłek między operatorami == i = 165 5.2. Ustalanie wartości domyślnej 5.3. Wymiana wartości bez używania zmiennych tymczasowych 166 167 5.4. Tworzenie dynamicznej nazwy zmiennej 168 5.5. Stosowanie zmiennych statycznych 5.6. Współdzielenie zmiennych pomiędzy procesami 170 174 5.7. Enkapsulacja złożonych typów danych do postaci łańcucha znaków 5.8. Wyświetlanie zawartości zmiennej w postaci łańcuchów znaków 176 Funkcje ..........................................................................................................................181 181 6.0. Wprowadzenie 182 6.1. Uzyskiwanie dostępu do parametrów funkcji 183 6.2. Ustawianie domyślnych wartości parametrów funkcji 6.3. Przekazywanie wartości przez referencję 185 185 6.4. Stosowanie parametrów nazwanych 6.5. Tworzenie funkcji pobierających zmienną liczbę argumentów 187 Spis treści | 5 7. 6.6. Zwracanie wartości przez referencję 6.7. Zwracanie więcej niż jednej wartości 6.8. Pomijanie pewnych zwracanych wartości 6.9. Zwracanie błędu 6.10. Wywoływanie funkcji zależnie od wartości zmiennych 6.11. Dostęp do zmiennej globalnej wewnątrz funkcji 6.12. Tworzenie funkcji dynamicznych 189 191 192 193 195 197 198 Klasy i obiekty ............................................................................................................. 201 201 7.0. Wprowadzenie 205 7.1. Tworzenie egzemplarzy klasy 206 7.2. Definiowanie konstruktorów obiektów 7.3. Definiowanie destruktorów obiektu 207 209 7.4. Kontrola dostępu 211 7.5. Zabezpieczenie klas i metod przed zmianami 213 7.6. Przekształcanie obiektu w ciąg tekstowy 7.7. Tworzenie interfejsów 215 217 7.8. Tworzenie abstrakcyjnej klasy bazowej 220 7.9. Przypisywanie referencji do obiektów 7.10. Klonowanie obiektów 220 223 7.11. Przesłonięcie procedury dostępu do właściwości 227 7.12. Wywoływanie metod obiektu zwracanego przez inną metodę 228 7.13. Agregowanie obiektów 7.14. Dostęp do metod przesłoniętych 231 233 7.15. Wykorzystanie polimorfizmu metod 235 7.16. Definiowanie stałych klasy 7.17. Definiowanie statycznych właściwości i metod 237 239 7.18. Nadzorowanie serializacji obiektów 240 7.19. Introspekcja obiektów 244 7.20. Sprawdzenie, czy obiekt jest egzemplarzem określonej klasy 7.21. Automatyczne pobieranie plików klasy podczas powoływania obiektu 247 249 7.22. Dynamiczne tworzenie obiektów 7.23. Program whereis 250 8. Podstawy programowania na potrzeby WWW ........................................................253 253 8.0. Wprowadzenie 254 8.1. Zapisywanie danych cookie 256 8.2. Odczytywanie danych cookie 8.3. Usuwanie danych cookie 257 258 8.4. Odsyłanie do innej strony 8.5. Pozyskiwanie informacji o przeglądarkach 259 6 | Spis treści 8.6. Konstruowanie zapytania metody GET 8.7. Odczytywanie treści żądania POST 8.8. Tabele HTML z wierszami o różnych atrybutach stylu 8.9. Proste uwierzytelnianie HTTP 8.10. Uwierzytelnianie z wykorzystaniem danych cookie 8.11. Wymuszenie przesłania danych do przeglądarki 8.12. Buforowanie danych wyjściowych 8.13. Przesyłanie danych z użyciem kompresji gzip 8.14. Odczyt zmiennych środowiskowych 8.15. Ustawianie wartości zmiennych środowiskowych 8.16. Komunikacja w ramach serwera Apache 8.17. Program — aktywowanie i dezaktywowanie stron internetowych użytkowników 8.18. Prosty serwis Wiki 261 262 263 264 268 271 272 273 274 275 277 278 280 9. Formularze ................................................................................................................. 283 9.0. Wprowadzenie 283 285 9.1. Przetwarzanie danych pochodzących z formularza 286 9.2. Weryfikacja danych formularza — pola obowiązkowe 9.3. Weryfikacja danych formularza — liczby 288 291 9.4. Weryfikacja danych formularza — adresy poczty elektronicznej 292 9.5. Weryfikacja danych formularza — listy rozwijane 294 9.6. Weryfikacja danych formularzy — przyciski opcji 9.7. Weryfikacja danych formularza — pola wyboru 295 297 9.8. Weryfikacja danych formularza — wartości daty i czasu 298 9.9. Weryfikacja danych formularza — dane kart kredytowych 299 9.10. Ochrona przed atakami XSS 9.11. Formularze wielostronicowe 300 302 9.12. Powtórne wyświetlanie formularzy wraz z komunikatami o błędach 304 9.13. Zabezpieczenie przed wielokrotnym przesyłaniem tego samego formularza 9.14. Obsługa przesyłanych plików 306 309 9.15. Zabezpieczenie przed wstrzyknięciem zmiennej globalnej 311 9.16. Obsługa zmiennych zawierających w nazwie znak kropki 312 9.17. Elementy formularza o większej liczbie opcji 9.18. Listy rozwijane zawierające daty 313 10. Dostęp do baz danych ................................................................................................. 317 317 10.0. Wprowadzenie 10.1. Bazy danych DBM 320 323 10.2. Bazy danych SQLite 10.3. Zestawianie połączeń z bazami danych SQL 325 Spis treści | 7 10.4. Przesyłanie zapytań do baz danych SQL 10.5. Odczyt wierszy bez użycia pętli 10.6. Wprowadzanie zmian w bazach danych SQL 10.7. Efektywne zwielokrotnianie zapytań 10.8. Określanie liczby udostępnionych wierszy 10.9. Obsługa znaków specjalnych 10.10. Zapisywanie informacji o przebiegu programu oraz komunikatów o błędach 10.11. Automatyczne dobieranie wartości identyfikatorów 10.12. Programowe konstruowanie zapytań 10.13. Tworzenie odsyłaczy do wielostronicowych wyników zapytania 10.14. Buforowanie zapytań i ich wyników 10.15. Dostęp do połączenia bazodanowego w dowolnej części programu 10.16. Program — wielowątkowa lista dyskusyjna 327 329 330 331 335 336 338 340 342 346 349 351 353 11. 12. Sesje i trwałe dane ...................................................................................................... 361 11.0. Wprowadzenie 361 362 11.1. Śledzenie przebiegu sesji 364 11.2. Ochrona przed przechwyceniem sesji 11.3. Ochrona przed ustawianiem sesji 365 366 11.4. Przechowywanie danych sesji w bazie danych 368 11.5. Przechowywanie danych sesji w pamięci współdzielonej 372 11.6. Przechowywanie dowolnych danych w pamięci współdzielonej 11.7. Przechowywanie obliczonych rezultatów w tabelach statystyk 374 XML .............................................................................................................................. 377 377 12.0. Wprowadzenie 12.1. Generowanie kodu XML w formie ciągu tekstowego 380 382 12.2. Generowanie kodu XML z użyciem rozszerzenia DOM 384 12.3. Analiza nieskomplikowanego dokumentu XML 12.4. Analiza złożonych dokumentów XML 387 389 12.5. Analiza dokumentów XML o dużych rozmiarach 395 12.6. Wyodrębnianie informacji za pomocą języka XPath 398 12.7. Przekształcanie dokumentu XML za pomocą arkusza XSLT 12.8. Definiowanie parametrów XSLT w kodzie PHP 400 402 12.9. Wywoływanie funkcji PHP z arkuszy stylu XSLT 406 12.10. Walidacja dokumentów XML 408 12.11. Kodowanie treści 12.12. Odczyt danych RSS i Atom 409 412 12.13. Generowanie arkuszy RSS 12.14. Generowanie arkuszy Atom 415 8 | Spis treści 13. 14. Automatyzacja pracy w sieci ...................................................................................... 419 13.0. Wprowadzenie 419 420 13.1. Pobieranie stron metodą GET 425 13.2. Pobieranie stron metodą POST 13.3. Pobieranie stron wymagających danych cookie 427 429 13.4. Pobieranie stron wymagających przesłania odpowiednich nagłówków 430 13.5. Pobieranie stron za pomocą wybranej metody 432 13.6. Pobieranie strony z ustalonym czasem oczekiwania 13.7. Pobieranie stron w protokole HTTPS 435 435 13.8. Analizowanie danych HTTP 440 13.9. Wyróżnianie fragmentów strony WWW 443 13.10. Usuwanie niepoprawnych lub niestandardowych znaczników HTML 13.11. Wyodrębnianie odsyłaczy z plików HTML 445 447 13.12. Przekształcanie zwykłego tekstu w kod HTML 448 13.13. Przekształcanie kodu HTML do postaci zwykłego tekstu 13.14. Usuwanie znaczników HTML i PHP 449 450 13.15. Odpowiedź na żądania Ajax 452 13.16. Integracja skryptu PHP z kodem JavaScript 456 13.17. Program — wyszukiwanie błędnych odsyłaczy 13.18. Program — wyszukiwanie nowych odsyłaczy 458 Korzystanie z usług Web Services ............................................................................ 463 463 14.0. Wprowadzenie 14.1. Wywołanie metody REST 465 466 14.2. Wywołanie metody SOAP z wykorzystaniem danych WSDL 468 14.3. Wywołanie metody SOAP bez korzystania z danych WSDL 14.4. Rozwiązywanie problemów z żądaniami SOAP 469 471 14.5. Złożone typy SOAP 472 14.6. Definiowanie typów SOAP 473 14.7. Wykorzystanie nagłówków SOAP 14.8. Uwierzytelnianie w komunikacji SOAP 475 476 14.9. Zmiana adresu serwera docelowego 478 14.10. Przechwytywanie błędów SOAP 480 14.11. Odwzorowanie typów danych XML Schema na klasy PHP 14.12. Wywołanie metod XML-RPC 481 484 14.13. Uwierzytelnianie w komunikacji XML-RPC 15. Tworzenie usług Web Services ..................................................................................487 15.0. Wprowadzenie 487 488 15.1. Udostępnianie metod REST 15.2. Udostępnianie metod SOAP 493 Spis treści | 9 15.3. Pobieranie parametrów w metodach SOAP 15.4. Automatyczne generowanie dokumentu WSDL 15.5. Generowanie błędów SOAP 15.6. Przetwarzanie nagłówków SOAP 15.7. Generowanie nagłówków SOAP 15.8. Uwierzytelnianie w komunikacji SOAP 15.9. Udostępnianie metod XML-RPC 496 498 499 501 504 506 510 16. 17. 18. Usługi internetowe ..................................................................................................... 515 515 16.0. Wprowadzenie 516 16.1. Wysyłanie poczty elektronicznej 518 16.2. Wysyłanie poczty MIME 16.3. Odczytywanie poczty za pomocą protokołów IMAP lub POP3 520 523 16.4. Wysyłanie wiadomości do grup dyskusyjnych 525 16.5. Odczytywanie wiadomości z grup dyskusyjnych 529 16.6. Pobieranie i wysyłanie plików za pomocą protokołu FTP 16.7. Wyszukiwanie adresów przy użyciu serwerów LDAP 531 533 16.8. Wykorzystanie serwera LDAP do autoryzacji użytkowników 535 16.9. Przeprowadzanie sprawdzania DNS 16.10. Sprawdzanie, czy serwer działa 537 538 16.11. Pobieranie informacji o nazwie domeny Grafika ......................................................................................................................... 541 17.0. Wprowadzenie 541 544 17.1. Rysowanie linii, prostokątów i wielokątów 545 17.2. Rysowanie łuków, elips i okręgów 547 17.3. Rysowanie linii ze wzorem 17.4. Rysowanie tekstu 548 551 17.5. Rysowanie wyśrodkowanego tekstu 555 17.6. Dynamiczne generowanie obrazów 17.7. Pobieranie i ustawianie koloru przezroczystości 557 558 17.8. Odczyt danych EXIF 560 17.9. Bezpieczne udostępnianie obrazów 17.10. Program — generowanie wykresów słupkowych z wyników głosowania 562 Szyfrowanie i bezpieczeństwo połączeń ..................................................................565 565 18.0. Wprowadzenie 566 18.1. Zabezpieczenie przed ustawianiem sesji 18.2. Zabezpieczenie przed podstawieniem formularza 567 568 18.3. Filtrowanie danych wejściowych 569 18.4. Unikanie wykonywania skryptów w ramach witryny 18.5. Ochrona przed wstrzykiwaniem instrukcji SQL 570 10 | Spis treści 18.6. Przechowywanie haseł w innym miejscu niż pliki witryny 18.7. Przechowywanie haseł 18.8. Sposoby postępowania w przypadku utraty haseł 18.9. Weryfikacja danych za pomocą skrótu 18.10. Szyfrowanie i deszyfrowanie danych 18.11. Zapamiętywanie zaszyfrowanych danych w pliku lub bazie danych 18.12. Współużytkowanie zaszyfrowanych danych z inną witryną 18.13. Wykrywanie połączenia SSL 18.14. Szyfrowanie poczty za pomocą GPG 571 572 574 576 578 582 585 587 588 19. Internacjonalizacja i lokalizacja tworzonych aplikacji ............................................. 591 591 19.0. Wprowadzenie 19.1. Wyświetlanie nazw dostępnych stref językowych 593 593 19.2. Korzystanie z konkretnej strefy językowej 595 19.3. Ustawianie domyślnej strefy 595 19.4. Dostosowanie tekstów komunikatów 19.5. Formatowanie dat i czasu 599 19.6. Wyświetlanie walut 600 19.7. Dostosowywanie obrazów do potrzeb mieszkańców określonej strefy językowej 19.8. Lokalizacja dołączanych plików 19.9. Zarządzanie zasobami przeznaczonymi dla różnych stref językowych 19.10. Wykorzystanie rozszerzenia gettext 19.11. Określenie kodowania danych wyjściowych 19.12. Określenie kodowania danych wejściowych 19.13. Przetwarzanie ciągów tekstowych UTF-8 604 606 607 609 610 611 612 20. Obsługa błędów, uruchamianie i testowanie ........................................................... 617 617 618 620 623 624 626 627 628 630 632 633 634 637 20.0. Wprowadzenie 20.1. Wyszukiwanie i poprawianie błędów składniowych 20.2. Tworzenie własnej klasy wyjątku 20.3. Wyświetlenie stosu wywołań funkcji 20.4. Odczyt zmiennych konfiguracyjnych 20.5. Ustawianie wartości zmiennych konfiguracyjnych 20.6. Ukrywanie komunikatów o błędach 20.7. Dostosowanie procedur obsługi błędów 20.8. Tworzenie własnych procedur obsługi błędów 20.9. Zapisywanie błędów w dzienniku 20.10. Unikanie błędów powtórnego przesłania nagłówka 20.11. Rejestrowanie informacji uruchomieniowych 20.12. Wykorzystanie rozszerzenia debugera Spis treści | 11 20.13. Przygotowanie testu modułu 20.14. Przygotowanie zestawu testów modułu 20.15. Zastosowanie testu modułu na stronie internetowej 20.16. Przygotowanie środowiska testowego 642 645 647 648 21. Zwiększanie wydajności i testy obciążeniowe ......................................................... 651 651 21.0. Wprowadzenie 652 21.1. Pomiar czasu wykonania funkcji 21.2. Pomiar czasu wykonywania programu 653 656 21.3. Wykorzystanie rozszerzenia debuger do optymalizacji kodu 659 21.4. Testy obciążeniowe serwisu 660 21.5. Unikanie wyrażeń regularnych 21.6. Wykorzystanie akceleratora 662 22. Wyrażenia regularne ..................................................................................................665 665 668 670 671 673 675 676 22.0. Wprowadzenie 22.1. Różnice pomiędzy funkcjami ereg i preg 22.2. Dopasowywanie wyrazów 22.3. Wyszukiwanie n-tego wystąpienia danej wartości 22.4. Obszerne i ograniczone dopasowania 22.5. Wyszukiwanie linii pliku spełniających określone kryteria 22.6. Wyszukiwanie tekstu wewnątrz znaczników HTML 22.7. Zapobieganie wyodrębnianiu tekstu na podstawie wyrażeń umieszczanych w nawiasie 22.8. Obsługa znaków specjalnych w wyrażeniach regularnych 22.9. Odczytywanie rekordów rozdzielanych określonymi symbolami 22.10. Wykorzystanie funkcji PHP w wyrażeniach regularnych 677 679 681 682 23. Pliki ..............................................................................................................................687 687 23.0. Wprowadzenie 691 23.1. Tworzenie lub otwieranie lokalnego pliku 23.2. Tworzenie tymczasowego pliku 692 693 23.3. Zdalne otwieranie pliku 694 23.4. Odczyt ze standardowego wejścia 23.5. Odczyt plików do łańcucha znaków 695 697 23.6. Zliczanie wierszy, akapitów i rekordów w pliku 700 23.7. Przetwarzanie każdego wyrazu z pliku 701 23.8. Pobieranie z pliku losowego wiersza 23.9. Przemieszanie wszystkich wierszy w pliku 702 703 23.10. Przetwarzanie pól tekstowych o zmiennej długości 704 23.11. Odczytywanie plików konfiguracyjnych 23.12. Modyfikacja pliku bez użycia pliku tymczasowego 706 12 | Spis treści 23.13. Opróżnianie bufora 23.14. Zapis na standardowe wyjście 23.15. Jednoczesny zapis do wielu uchwytów plików 23.16. Znaki specjalne powłoki 23.17. Przekazywanie wejścia do programu 23.18. Odczyt standardowego wyjścia z programów 23.19. Odczyt standardowego wyjścia błędów z programu 23.20. Blokowanie pliku 23.21. Odczyt i zapis niestandardowych plików 23.22. Odczyt i zapis skompresowanych plików 708 708 709 710 712 713 715 716 719 723 24. Katalogi .......................................................................................................................725 24.0. Wprowadzenie 725 728 24.1. Pobieranie i ustawianie czasu plików 729 24.2. Pobieranie informacji o pliku 731 24.3. Zmiana praw lub właściciela pliku 24.4. Podział nazwy pliku na części składowe 732 733 24.5. Usuwanie pliku 734 24.6. Kopiowanie lub przenoszenie pliku 24.7. Przetwarzanie wszystkich plików w katalogu 735 737 24.8. Pobranie listy plików zgodnych z pewnym wzorcem 738 24.9. Rekurencyjne przetwarzanie wszystkich plików katalogu 739 24.10. Tworzenie nowych katalogów 24.11. Usuwanie katalogu i jego zawartości 740 741 24.12. Program — wyświetlanie listy plików w katalogu jako strony WWW 24.13. Program — wyszukiwanie tekstu w witrynie 744 25. Wiersz poleceń PHP ....................................................................................................749 749 750 752 755 25.0. Wprowadzenie 25.1. Przetwarzanie argumentów programu 25.2. Przetwarzanie argumentów za pomocą klasy getopt 25.3. Odczyt z klawiatury 25.4. Wykonanie instrukcji PHP w odniesieniu do każdego wiersza pliku wejściowego 25.5. Odczyt haseł 25.6. Program — powłoka z wierszem poleceń 756 758 760 26. Biblioteki PEAR i PECL .................................................................................................765 26.0. Wprowadzenie 765 767 26.1. Korzystanie z instalatora PEAR 770 26.2. Wyszukiwanie pakietów PEAR 26.3. Wyświetlanie informacji o pakiecie 772 Spis treści | 13 26.4. Instalacja pakietów PEAR 26.5. Aktualizacja pakietów PEAR 26.6. Usuwanie zainstalowanych pakietów PEAR 26.7. Instalacja pakietów PECL 774 775 776 777 Skorowidz .................................................................................................................... 781 14 | Spis treści ROZDZIAŁ 8. 8.0. Wprowadzenie Poszukiwanie informacji na temat programowania dla WWW to zapewne jedna z głównych przyczyn, dla których Czytelnik sięga po tę książkę. Z kolei potrzeba programowania dla WWW była jedną z najważniejszych przyczyn powstania samego PHP oraz uczyniła ten ję- zyk tak popularnym. Budowanie dynamicznych, niemal nieograniczonych w swoich możli- wościach programów WWW za pomocą PHP nie jest skomplikowanym zadaniem. W innych rozdziałach książki zostały omówione różnorodne funkcje języka, takie jak obsługa grafiki, wyrażeń regularnych, dostępu do baz danych i operowania plikami. Wszystkie one stanowią elementy ogólnie pojętego programowania WWW. W niniejszym rozdziale skoncentrujemy się jednak tylko na pewnych problemach charakterystycznych dla Internetu oraz na zagadnieniach organizacyjnych, które pomogą usprawnić proces programowania. Receptury 8.1, 8.2 i 8.3 demonstrują sposób zapisywania, odczytywania i usuwania danych cookie. Cookie to niewielkich rozmiarów ciąg tekstowy, który na polecenie serwera przeglą- darka przesyła wraz z żądaniem strony. Gromadzenie danych cookie w przeglądarce jest efek- tem działania skryptów dołączanych do stron przeglądanej witryny. Żądania HTTP z założe- nia są „bezstanowe”, tzn. dane żądanie nie może być wiązane z poprzednim. Tymczasem użycie danych cookie pozwala na łączenie różnych żądań wygenerowanych przez tego samego użytkownika. Własność ta ułatwia obsługę „koszyków” w sklepach internetowych oraz umoż- liwia rejestrowanie realizowanych przez użytkownika wyszukiwań. Receptura 8.4 przedstawia sposób odsyłania użytkownika do innej strony WWW. Z kolei re- ceptura 8.5 wyjaśnia zagadnienia związane z pozyskiwaniem informacji o przeglądarce klienta. Receptura 8.6 zajmuje się problemem konstruowania adresu URL uzupełnionego zapytaniem metody GET, uwzględniając zagadnienie właściwego kodowania znaków specjalnych oraz obsługę elementów HTML. W recepturze 8.7 zostały natomiast zamieszczone informacje na temat pobierania danych przekazanych przez użytkownika za pomocą żądań POST. Recep- tura 8.8 zawiera rozwiązanie problemu, który często występuje podczas formatowania da- nych WWW — wyświetlanie wierszy tabeli HTML w różnych kolorach i z wykorzystaniem różnych atrybutów stylu. 253 Dwa kolejne podrozdziały prezentują zasady korzystania z mechanizmu uwierzytelniania, umożliwiającego ochronę stron WWW za pomocą haseł. Funkcje PHP związane z podsta- wowym uwierzytelnianiem HTTP są przedstawione w recepturze 8.9. Natomiast receptura 8.10 zilustruje inną metodę, polegającą na wykorzystaniu danych cookies, co niekiedy oka- zuje się korzystniejszym rozwiązaniem. Trzy następne receptury dotyczą sterowania danymi wyjściowymi. Podrozdział 8.11 prezen- tuje mechanizm wymuszonego przesyłania danych do przeglądarki. Receptura 8.12 przed- stawia funkcje buforowania informacji wyjściowych, przydatne w sytuacjach, gdy konieczne jest zgromadzenie danych przeznaczonych do wydruku lub opóźnienie przesłania treści do momentu przetworzenia kodu całej strony. Z kolei w podrozdziale 8.13 omówiono zagad- nienie automatycznej kompresji danych wyjściowych. Kolejne dwie receptury zawierają opis sposobu korzystania z zewnętrznych zmiennych — zmiennych środowiskowych i ustawień konfiguracyjnych interpretera PHP. Zagadnienia te zostały przedstawione w recepturach 8.14 i 8.15. Informacje zamieszczone w recepturze 8.16 są szczególnie istotne dla osób, które korzystają z serwera WWW Apache. Dotyczą bowiem komunikacji programów PHP z różnymi modułami Apache. W końcowej części rozdziału zostały również zaprezentowane przykłady programów, które uwzględniają w działaniu większość opisywanych tu rozwiązań. Zadanie programu 8.17 po- lega na zatwierdzaniu kont użytkowników przez wysyłanie listów elektronicznych zawierających w treści charakterystyczny dla danego użytkownika odsyłacz. Jeżeli w ciągu tygodnia użytkow- nik nie otworzy za jego pomocą przygotowanej strony internetowej, konto zostanie usunięte. Natomiast program 8.18 jest przykładem nieskomplikowanego serwisu Wiki — systemu, który umożliwia edytowanie dowolnych stron witryny za pomocą przeglądarki internetowej. 8.1. Zapisywanie danych cookie Problem Chcemy zapisać dane cookie, aby aplikacja WWW mogła rozpoznawać kolejne żądania gene- rowane przez tę samą przeglądarkę internetową. Rozwiązanie Należy wywołać funkcję setcookie(), podając nazwę i wartość pola, tak jak to zostało przed- stawione w listingu 8.1. Listing 8.1. Zapisywanie danych cookie ?php setcookie( smak , czekoladowy ); ? Analiza Dane cookies przysyłane są w ramach nagłówka HTTP. Z tego względu funkcja setcookie() musi być wywoływana przed wygenerowaniem jakiejkolwiek treści strony. 254 | Rozdział 8. Podstawy programowania na potrzeby WWW Dopuszczalne jest przekazywanie do funkcji setcookie() dodatkowych parametrów, które umożliwiają sterowanie funkcjonowaniem cookie. Trzecim możliwym argumentem wywoła- nia setcookie() jest czas wygaśnięcia danych, wyrażony w postaci znacznika czasowego. Przy- kładowo, dane cookie, które będą przechowywane do 3. grudnia 2004 do południa czasu GMT, zapisywane są przy użyciu funkcji przedstawionej w listingu 8.2. Listing 8.2. Definiowanie wygasających danych cookie setcookie( smak , czekoladowy , 1102075200); W przypadku, gdy trzeci z argumentów nie został określony (lub gdy jest pusty), dane cookie są usuwane wraz z zakończeniem pracy przeglądarki. W wielu systemach znacznik czasowy jest ograniczony do wartości 2147483647, gdyż jest to maksymalna wartość całkowitoliczbowa, jaką można zapisać przy wykorzystaniu znacznika 32-bitowego (o czym informowaliśmy we wprowadzeniu do rozdziału 3.). Czwarty argument setcookie() to ścieżka. Dane cookie są odsyłane do serwera tylko w przy- padku, gdy ścieżka żądanej strony rozpoczyna się od podanej wartości tekstowej. Przykła- dowo, dane cookie zapisane w sposób przedstawiony w listingu 8.3 zostanę odesłane do serwera tylko wtedy, gdy ścieżka strony rozpoczyna się od ciągu /wyroby/: Listing 8.3. Definiowanie danych cookie z wyznaczeniem katalogu serwera ?php setcookie( smak , czekoladowy , , /wyroby/ ); ? Ścieżka do strony zapisującej dane cookie nie musi rozpoczynać się wartością /wyroby/, nie- mniej tylko do takich stron będą dane odsyłane. Piątym parametrem funkcji jest domena. Dane cookie są odsyłane do serwera tylko w przypadku, gdy żądane są strony, których nazwa serwera kończy się określoną nazwą domenową. W przy- kładach prezentowanych w listingu 8.4 dane cookie zdefiniowane pierwszą z funkcji będą odsyłane do wszystkich serwerów z domeny przyklad.com, a te zapisane za pomocą drugiej funkcji — jedynie do komputera joanna.przyklad.com: Listing 8.4. Definiowanie danych cookie z wyznaczeniem domeny ?php setcookie( smak , czekoladowy , , , .przyklad.com ); setcookie( smak , czekoladowy , , , .joanna.przyklad.com ); ? Gdyby w pierwszym przypadku jako wartości domeny użyto tylko przyklad.com zamiast .przyklad.com, dane mogłyby być przesyłane jedynie do pojedynczego komputera o nazwie przy- klad.com (a nie na przykład do www.przyklad.com czy joanna.przyklad.com). Ostatnim (opcjonalnym) argumentem wywołania funkcji jest znacznik, który ustawiony na 1 informuje przeglądarkę o konieczności przesyłania danych cookie tylko w ramach połączenia korzystającego z protokołu SSL. Właściwość ta bywa użyteczna w przypadkach, gdy wymie- niane informacje są szczególnie cenne. Musimy jednak pamiętać, że dane cookie są przechowy- wane w komputerze użytkownika w postaci niezaszyfrowanej. Poszczególne przeglądarki mogą traktować cookie w nieco odmienny sposób. Rzecz dotyczy w szczególności ustalania stopnia zgodności z daną ścieżką i domeną oraz priorytetów pomiędzy różnymi danymi cookie o tej samej nazwie. Szczegółowe wyjaśnienie wspomnianych różnic zamieszczono na poświęconej funkcji setcookie() internetowej stronie podręcznika. 8.1. Zapisywanie danych cookie | 255 Zobacz również Sposób odczytywania danych cookie przedstawiono w recepturze 8.2. Podrozdział 8.3 oma- wia zagadnienie ich usuwania. Receptura 8.12 wyjaśnia koncepcję buforowania danych. Doku- mentacja setcookie() znajduje się pod adresem http://www. php.net/setcookie, a szczegółowa specyfikacja idei danych cookie — w dokumencie RFC 2965, pod adresem http://www.faqs.org/ rfcs/rfc2965.html. 8.2. Odczytywanie danych cookie Problem Chcemy odczytać zapisane wcześniej dane cookie. Rozwiązanie Rozwiązanie polega na przeanalizowaniu zawartości tablicy globalnej $_COOKIE zgodnie z in- strukcjami zamieszczonymi w listingu 8.5. Listing 8.5. Odczytywanie danych cookie ?php if (isset($_COOKIE[ smak ])) { print Zjedzone ciasteczka miały $_COOKIE[ smak ] smak. ; } ? Analiza Wartości cookie nie są dostępne za pośrednictwem $_COOKIE w trakcie realizacji żądania za- pisującego dane informacje cookie. Innymi słowy, funkcja setcookie() nie modyfikuje wartości $_COOKIE. Wszystkie zapisane dane cookie są dostępne dopiero w następnych żądaniach. Je- śli dyrektywa register_globals ma wartość on, dane cookie przypisywane są także zmien- nym globalnym. Odsyłając cookie do serwera, przeglądarka przesyła jedynie wartość. Nie istnieje możliwość operowania za pośrednictwem $_COOKIE informacjami o domenie, ścieżce, terminie wygasa- nia czy stopniu zabezpieczenia. Przeglądarka nie przesyła takich informacji do serwera. Aby wyświetlić nazwy i odpowiadające im wartości cookie danego żądania, możemy użyć pętli, która przeanalizuje tablicę $_COOKIE w sposób przedstawiony w listingu 8.6. Listing 8.6. Odczyt wszystkich danych cookie ?php foreach ($_COOKIE as $nazwa_cookie = $wartosc_cookie) { print $nazwa_cookie = $cookie_value br ; } ? 256 | Rozdział 8. Podstawy programowania na potrzeby WWW Zobacz również Zapis danych cookie opisano w recepturze 8.1. Podrozdział 8.3 omawia zagadnienie ich usuwa- nia. Receptura 8.12 wyjaśnia koncepcję buforowania danych. Informacje o register_globals zawarto w recepturze 9.15. 8.3. Usuwanie danych cookie Problem Chcemy usunąć dane cookie, aby przeglądarka nie mogła ich odesłać do serwera. Taka ope- racja jest niezbędna do wylogowania użytkownika z systemu, który wykorzystuje dane cookie do sprawdzania, czy użytkownik jest uwierzytelniony. Rozwiązanie Wywołanie setcookie() bez żadnej wartości i z przeszłą datą wygasania pozwoli rozwiązać problem. Stosowna instrukcja został przedstawiona w listingu 8.7. Listing 8.7. Usuwanie danych cookie ?php setcookie( smak , , 1); ? Analiza Właściwym rozwiązaniem problemu jest ustalenie czasu wygasania znacznie wcześniejszego niż bieżący. Zapobiega to komplikacjom w przypadku, gdyby komputer klienta i serwer nie miały zsynchronizowanych zegarów. Przykładowo, jeżeli według serwera aktualna godzina to 15:06, a zegar klienta wskazuje 15:02, cookie z czasem wygasania o wartości 15:05 nie zosta- nie usunięte przez komputer użytkownika, mimo iż dla serwera jest to już przeszłość. Wywołując setcookie() w celu usunięcia danych cookie, należy podać dokładnie takie same parametry (poza wartością i czasem), jakie podano w setcookie() podczas zapisywania in- formacji, tzn. domenę, ścieżkę i znacznik zabezpieczenia, o ile takowe zostały określone. Zobacz również Zapis danych cookie opisano w recepturze 8.1. Podrozdział 8.2 omawia zagadnienie od- czytu ich wartości. Receptura 8.12 wyjaśnia koncepcję buforowania danych. Dokumentacja funkcji setcookie() znajduje się pod adresem http://www.php.net/setcookie. 8.3. Usuwanie danych cookie | 257 8.4. Odsyłanie do innej strony Problem Chcemy automatycznie odsyłać użytkownika do strony o innym adresie URL. Przykładem za- stosowania takiego rozwiązania może być sytuacja, kiedy przekazane za pomocą formularza dane zostały zapisane i należy odesłać użytkownika do strony, która poinformuje go o po- prawnym zakończeniu operacji. Rozwiązanie Użyjemy funkcji header() do przesłania nagłówka Location z nowym adresem, a następnie instrukcji exit(), uniemożliwiającej przesłanie jakiejkolwiek treści do przeglądarki. Sposób realizacji zadania został przedstawiony w listingu 8.8. Listing 8.8. Odesłanie użytkownika do innej strony ?php header( Location: http://www.przyklad.com/ ); exit(); ? Analiza Jeżeli zachodzi potrzeba przekazania do nowej strony jakichkolwiek zmiennych, możemy je umieścić w dołączonym do adresu URL ciągu tekstowym zapytania, tak jak to zostało poka- zane w listingu 8.9. Listing 8.9. Odesłanie do innej strony z uwzględnieniem zmiennych ciągu zapytania ?php header( Location: http://www.przyklad.com/?zwierze=pies ); exit(); ? Docelowy ciąg URL powinien zawierać informacje o nazwie protokołu i nazwie jednostki. Nie wystarczy zapisanie jedynie ścieżki dostępu do pliku. W listingu 8.10 został przedsta- wiony przykład właściwego i błędnego ciągu Location nagłówka HTTP. Listing 8.10. Poprawny i błędny ciąg Location ?php // Poprawne przekierowanie header( Location: http://www.przyklad.com/katalog/zywnosc/mielonka.php ); // Błędne przekierowanie header( Location: /katalog/zywnosc/mielonka.php ); ? Nowa strona, do której użytkownik jest odsyłany, pozyskiwana jest za pomocą metody GET. Dopuszcza się również podobną operację z użyciem metody POST. Dzięki językowi Java- Script możliwe jest zasymulowanie odesłania z wykorzystaniem metody POST. Wystarczy 258 | Rozdział 8. Podstawy programowania na potrzeby WWW wygenerować formularz, który zostanie automatycznie odesłany. Gdy przeglądarka obsłu- gująca język JavaScript pobierze stronę z listingu 8.11, natychmiast prześle za pomocą metody POST zawarty w kodzie formularz. Listing 8.11. Odesłanie z wykorzystaniem formularza przesyłanego za pomocą metody POST html body onload= document.getElementById( redirectForm ).submit() form id= redirectForm method= POST action= ./zrobione.html input type= hidden name= status value= zakonczone / input type= hidden name= id value= 0u812 / input type= sumbit value= Kliknij tutaj, aby kontynuować / /form /body /html Wartością atrybutu id formularza przedstawionego w listingu 8.11 jest ciąg redirectForm. Zatem instrukcja przypisana do zdarzenia onload elementu body spowoduje przesłanie tego formularza. Nie zostanie ona jednaj wykonana, jeśli przeglądarka nie obsługuje języka JavaScript. W takim przypadku użytkownik zobaczy na ekranie przycisk z informacją Kliknij tutaj, aby kontynuować. Zobacz również Dokumentacja funkcji header() jest dostępna pod adresem http://www.php.net/header. 8.5. Pozyskiwanie informacji o przeglądarkach Problem Chcemy, aby generowana treść strony zależała od właściwości danej przeglądarki. Rozwiązanie W tym celu wykorzystamy obiekt zwracany przez funkcję get_browser(), który umożliwia usta- lenie parametrów przeglądarki. Sposób pobrania danych został przedstawiony w listingu 8.12. Listing 8.12. Pobranie informacji o przeglądarce ?php $browser = get_browser( ); if ($browser- frames) { // treść wykorzystująca ramki } elseif ($browser- tables) { // treść wykorzystująca tabele } else { // klasyczna treść HTML } ? 8.5. Pozyskiwanie informacji o przeglądarkach | 259 Analiza Działanie funkcji get_browser() sprowadza się do przeanalizowania zmiennej środowiskowej $_ENV[ HTTP_USER_AGENT ] (definiowanej przez serwer WWW) i porównania jej wartości z listą przeglądarek, która znajduje się w zewnętrznym pliku cech przeglądarek. Ze względu na pro- blem licencji, PHP nie jest rozpowszechniany z plikiem cech przeglądarek. Jednak PHP FAQ w sekcji Pozyskiwanie PHP (ang. Obtaining PHP) (http://www. php.net/faq.obtaining) jako strony, z których można pobrać pliki o możliwościach poszczególnych przeglądarek, wymienia: http:// www.cyscape.com/asp/browscap/ oraz http://www.amrein. com/apps/page.asp?Q=InowDownload. Innym źródłem jest http://asp.net.do/browscap.zip. Po pobraniu pliku cech przeglądarek konieczne jest zamieszczenie informacji o jego położe- niu. W tym celu należy nadać dyrektywie konfiguracyjnej PHP browscap wartość ścieżki do wspomnianego pliku. Jeżeli PHP jest wykorzystywany jako skrypt CGI, dyrektywa powinna się znaleźć w pliku php.ini i mieć treść przedstawioną w listingu 8.13. Listing 8.13. Ustawienie wartości browscap w pliku php.ini browscap=/usr/local/lib/browscap.txt Większość cech przeglądarek udostępnianych przez funkcję get_browser() zestawiono w ta- beli 8.1. Funkcja umożliwia rozpoznanie, czy przeglądarka obsługuje takie elementy jak javascript czy dane cookies. Ostatecznie jednak o dostępności wspomnianych elementów decyduje użytkownik, a funkcja nie możliwości poinformowania o tym, czy klient pozwolił na ich obsługę. Funkcja get_browser() wskazuje na możliwość stosowania skryptów JavaScript nawet w przypadku, gdy w zestawieniu przeglądarek obsługujących JavaScript znajduje się odmienna informacja na ten temat. Podobnie, może dostarczać informacji o możliwości zapisu danych cookies, mimo iż klient odmawia wykonania takiej operacji. Tabela 8.1. Własności obiektu reprezentującego cechy przeglądarki Własność platform version majorver minorver frames tables cookies Opis System operacyjny, w którym przeglądarka jest uruchomiona (np. Windows, Macintosh, Unix, Win32, Linux, MacPPC) Pełny numer wersji (np. 5.0,3.5,6.0b2) Zasadniczy numer wersji (np. 5,3,6) Poboczny numer wersji (np. 0,5,02) Przechowuje wartość 1, jeżeli przeglądarka obsługuje ramki Przechowuje wartość 1, jeżeli przeglądarka obsługuje tabele Przechowuje wartość 1, jeżeli przeglądarka akceptuje dane cookies backgroundsounds Przechowuje wartość 1, jeżeli przeglądarka pozwala na odtwarzanie muzyki za pomocą znaczników embed lub bgsound vbscript javascript javaapplets Przechowuje wartość 1, jeżeli przeglądarka obsługuje VBScript Przechowuje wartość 1, jeżeli przeglądarka obsługuje JavaScript Przechowuje wartość 1, jeżeli przeglądarka umożliwia uruchamianie apletów Javy activexcontrols Przechowuje wartość 1, jeżeli przeglądarka umożliwia uruchamianie kontrolek ActiveX 260 | Rozdział 8. Podstawy programowania na potrzeby WWW Zobacz również Dokumentacja funkcji get_browser() jest dostępna pod adresem http://www.php.net/get-browser. 8.6. Konstruowanie zapytania metody GET Problem Chcemy utworzyć łącze zawierające w zapytaniu pary nazwa-wartość. Rozwiązanie Zadanie to realizuje funkcja http_build_query(), przedstawiona w listingu 8.14. Listing 8.14. Konstruowanie zapytania metody GET ?php $vars = array( nazwisko = Kermit Zaba , kolor = zielony , znak_wypunktowania = # ); $query_string = http_build_query($vars); $url = /muppety/wybor.php? . $query_string; ? Analiza Adres URL, utworzony na podstawie kodu z listingu 8.14, miałby następującą postać: /muppety/wybor.php?nazwisko=Kermit+Zaba kolor=zielony znak_wypunktowania= 23 W zapytaniu znajdują się spacje, które zakodowano za pomocą znaków plus (+). Znaki spe- cjalne, takie jak (#), reprezentowane są odpowiednią wartością heksadecymalną. W tym przy- padku jest to wartość 23, z uwagi na fakt, że kodem ASCII odpowiadającym znakowi (#) jest 35, co w notacji szesnastkowej odpowiada wartości 23. Funkcja urlencode() zapewnia, że wszystkie znaki specjalne wchodzące w skład nazw lub wartości będą odpowiednio zapisane w adresie URL. Problem może się pojawić jedynie wtedy, gdy nazwa zmiennej rozpoczyna się ciągiem tekstowym zgodnym z wartością występującą w języku HTML. Przykładem może być część adresu URL, który przekazuje informacje o sy- gnale okresowym: /sygnal.php?czestot=1000 amp=10 W języku HTML do reprezentacji znaku ( ) jest stosowany ciąg tekstowy amp. Z tego powo- du przeglądarka może zinterpretować adres URL jako: /sygnal.php?czestot=1000 =10 Istnieją trzy sposoby unikania takich sytuacji. Pierwszy z nich polega na zastosowaniu nazw zmiennych, które nie wchodziłyby w konflikt z elementami języka — na przykład _amp za- miast amp. Drugim jest przekształcenie znaków w odpowiednikach elementów HTML do po- staci tych elementów języka przed wygenerowaniem adresu URL. Służy do tego instrukcja htmlentities(): 8.6. Konstruowanie zapytania metody GET | 261 $url = /muppety/wybor.php? . htmlentities($query_string); W wyniku otrzymujemy: /muppety/wybor.php?nazwisko=Kermit+Zaba amp;kolor=zielony amp;znak_wypunktowania= 23 Trzecią możliwością jest zmiana znaku rozdzielającego i zastąpienie znaku znakiem ;. W tym celu należy ustalić wartość dyrektywy arg_separator na ;. Pary nazwa-wartość są wówczas rozdzielane znakiem średnika: /muppety/wybor.php?nazwisko=Kermit+Zaba;kolor=zielony;znak_wypunktowania= 23 Zobacz również Omówienie funkcji urlencode() znajduje się pod adresem http://www.php.net/urlencode, a htmlentities() — pod adresem http://www.php.net/htmlentities. 8.7. Odczytywanie treści żądania POST Problem Niezbędny jest bezpośredni dostęp do treści żądania POST, a nie tylko do przeanalizowa- nych przez PHP danych udostępnianych w tablicy $_POST. Taki problem może wystąpić wówczas, gdy trzeba przetworzyć dokument XML przekazany do serwera w formie żądania kierowanego do usługi WWW. Rozwiązanie Dane należy odczytać ze strumienia php://input w sposób przedstawiony w listingu 8.15. Listing 8.15. Odczyt treści żądania POST ?php $body = file_get_contents( php://input ); ? Analiza Automatycznie tworzona globalna tablica $_POST doskonale spełnia swoje zadanie, gdy po- trzebny jest dostęp do zmiennych przesyłanego formularza. Jest jednak bezużyteczna, gdy programista musi w nieograniczony sposób operować nieprzetworzoną treścią całego żąda- nia. Przydatny okazuje się wówczas strumień php://input. Pozwala on na zastosowanie funkcji file_get_contents() do odczytania całej treści żądania lub na wykorzystanie funk- cji fread() do pobierania kolejnych fragmentów tego żądania. Jeżeli dyrektywa konfiguracyjna always_populate_raw_post_data ma wartość on, nieprzetwo- rzone dane metody POST są również umieszczane w globalnej zmiennej $HTTP_RAW_POST_DATA. Chcąc jednak przygotować kod o możliwie największym stopniu przenośności, warto wyko- rzystać rozwiązanie uwzględniające strumień php://output — spełnia ono bowiem swoje zadanie nawet wtedy, gdy opcja always_populate_raw_post_data jest wyłączona. 262 | Rozdział 8. Podstawy programowania na potrzeby WWW Zobacz również Dokumentacja strumienia php://input znajduje się pod adresem http://www.php.net/wrappers, natomiast dyrektywy always_populate_raw_post_data — pod adresem http://www.php.net/ ini.core#ini.always-populate-raw-post-data. 8.8. Tabele HTML z wierszami o różnych atrybutach stylu Problem Chcemy wyświetlić tabelę z danymi, w której styl prezentacji wierszy będzie różny dla róż- nych wierszy. Na przykład wiersze o numerach nieparzystych będą miały białe tło, a wiersze parzyste — szare tło. Rozwiązanie Wystarczy podczas generowania kodu HTML tabeli wykorzystywać naprzemiennie dwie klasy stylu CSS. Przykład wykorzystania tej techniki do wyświetlenia danych pozyskanych z bazy danych został przedstawiony w listingu 8.16. Listing 8.16. Utworzenie tabeli HTML o różnych stylach wierszy style type= text/css .even-row { background: white; } .odd-row { background: gray; } /style table tr th Ilość /th th Dodatek /th /tr ?php $styles = array( even-row , odd-row ); $db = new PDO( sqlite:altrow.db ); foreach ($db- query( SELECT quantity, ingredient FROM ingredients ) as $i = $row) { ? tr class= ?php echo $styles[$i 2]; ? td ?php echo htmlentities($row[ quantity ]) ? /td td ?php echo htmlentities($row[ ingredients ]) ? /td /tr ?php } ? /table Analiza Zwięzłość kodu przedstawionego w listingu 8.16 wynika z zastosowania tablicy nazw klas CSS ($styles) i operatora „reszty ” ( ). Operator reszty zwraca wartość reszty z dzielenia całkowitego dwóch liczb. Reszta z dzielenia dowolnej wartości przez dwa (w tym przypadku dzielony jest numer wiersza) zawsze wynosi 0 lub 1. Dzięki temu można w łatwy sposób na- przemiennie stosować pierwszy i drugi element tablicy $styles. 8.8. Tabele HTML z wierszami o różnych atrybutach stylu | 263 Zobacz również Dokumentacja operatorów arytmetycznych języka PHP jest dostępna pod adresem http://www. php.net/language.operators.arithmetic. 8.9. Proste uwierzytelnianie HTTP Problem Chcemy zabezpieczyć dostęp do pewnej części witryny WWW za pomocą haseł. Mechanizm weryfikacji haseł powinien zostać zdefiniowany w programie PHP, co pozwoli na wyelimi- nowanie konieczności przechowywania ich w plikach zewnętrznych i zwolni serwer WWW z obowiązku przeprowadzania uwierzytelniania. Rozwiązanie Jeżeli użytkownik podał swoją nazwę i hasło, dane te są przechowywane w zmiennych glo- balnych $_SERVER[ PHP_AUTH_USER ] i $_SERVER[ PHP_AUTH_PW ]. Aby uniemożliwić dostęp do strony, musimy przesłać nagłówek WWW-Authenticate, w którym powinna być zawarta również informacja o obszarze witryny objętym uwierzytelnianiem oraz kod odpowiedzi o wartości 401. Stosowny kod został przedstawiony w listingu 8.17. Listing 8.17. Wymuszenie uwierzytelnienia typu Basic ?php header( WWW-Authenticate: Basic realm= Moja strona ); header( HTTP/1.0 401 Unauthorized ); echo Uzyskanie dostępu do strony wymaga podania poprawnej nazwy użytkownika i hasła. ; exit(); ? Analiza Kiedy przeglądarka otrzyma nagłówek z kodem 401, wyświetli okno dialogowe umożliwiają- ce wprowadzenie nazwy użytkownika i hasła. Przekazane w ten sposób parametry uwierzy- telniania (nazwa i hasło) — o ile zostaną zaakceptowane przez serwer — będą związane z ob- szarem witryny określonym w nagłówku WWW-Authenticate (pole realm). Z uwagi na fakt, że kod, który przetwarza parametry uwierzytelniania, może generować nagłówki, jego wyko- nanie powinno poprzedzać przesłanie jakiejkolwiek treści strony. Można do tego celu wyko- rzystać na przykład funkcję pc_validate(), przedstawioną w listingu 8.18. Listing 8.18. Funkcja pc_validate() ?php function pc_validate($user,$pass) { /* w tym miejscu należy zdefiniować odpowiedni mechanizm weryfikacji nazwy i hasła użytkownika, np. sprawdzenie wartości w bazie danych */ $users = array( dawid = fadj 32 , adam = 8HEj838 ); 264 | Rozdział 8. Podstawy programowania na potrzeby WWW if (isset($users[$user]) ($users[$user] == $pass)) { return true; } else { return false; } } ? Przykład zastosowania funkcji pc_validate() został zamieszczony w listingu 8.19. Listing 8.19. Wykorzystanie funkcji weryfikacji danych uwierzytelniających ?php if (! pc_validate($_SERVER[ PHP_AUTH_USER ], $_SERVER[ PHP_AUTH_PW ])) { header( WWW-Authenticate: Basic realm= Moja strona ); header( HTTP/1.0 401 Unauthorized ); echo Uzyskanie dostępu do strony wymaga podania poprawnej nazwy użytkownika i hasła. ; exit; } ? W treści funkcji pc_validate() należy umieścić odpowiedni kod, który pozwoli na spraw- dzenie, czy użytkownik podał poprawną nazwę i hasło. Zmodyfikować można również ciąg tek- stowy identyfikujący obszar witryny objęty uwierzytelnianiem oraz komunikat wyświetlany w sytuacji, gdy użytkownik kliknie przycisk Anuluj w oknie uwierzytelniania (tu będzie to komunikat: Uzyskanie dostępu do strony wymaga podania poprawnej nazwy użytkownika i hasła.). W PHP 5.1.0 i późniejszych wersjach języka obsługiwane jest również uwierzytelnianie typu Digest. W przypadku prostego uwierzytelniania (uwierzytelniania typu Basic) nazwy użyt- kowników i ich hasła są przesyłane do serwera w formie otwartego tekstu, nieznacznie tylko zabezpieczone przez algorytm kodowania Base64. W uwierzytelnianiu typu Digest hasło nigdy nie jest przekazywane z przeglądarki do serwera. Zamiast niego dostarczane są jedy- nie wartości skrótu hasła oraz kilka parametrów uzupełniających. Takie rozwiązanie zmniej- sza ryzyko wykorzystania danych przez osobę, która je przechwyciła. Oczywiście zwiększo- ny poziom bezpieczeństwa mechanizmu Digest oznacza również zwiększenie złożoności kodu skryptu w porównaniu z algorytmem prostego uwierzytelniania. W listingu 8.20 zo- stały przedstawione funkcje, które wyznaczają parametry uwierzytelniania Digest zgodnie z zaleceniami określonymi w dokumencie RFC 2617. Listing 8.20. Wykorzystanie uwierzytelniania typu Digest ?php /* w tym miejscu należy zdefiniować odpowiedni mechanizm weryfikacji nazwy i hasła użytkownika, np. sprawdzenie wartości w bazie danych */ $users = array( dawid = fadj 32 , adam = 8HEj838 ); $realm = Moja strona ; $username = pc_validate_digest($realm, $users); // Poniższa instrukcja nie zostanie wykonana, jeśli dane uwierzytelniające są // niepoprawne print Witaj, . htmlentities($username); function pc_validate_digest($realm, $users) { // Zakończenie z błędem, jeśli klient nie dostarczył wartości skrótu if (! isset($_SERVER[ PHP_AUTH_DIGEST ])) { pc_send_digest($realm); 8.9. Proste uwierzytelnianie HTTP | 265 } // Zakończenie z błędem, jeśli nie można przeanalizować wartości skrótu $username = pc_parse_digest($_SERVER[ PHP_AUTH_DIGEST ], $realm, $users); if ($username === flase) { pc_send_digest($realm); } // W skrócie została zawarta poprawna nazwa użytkownika return $username; } function pc_send_digest($realm) { header( http/1.0 401 Unauthorized ); $nonce = md5(uniqid()); $opaque = md5($realm); header( WWW-Authenticate: Digest realm= $realm qop= auth . nonce= $nonce opaque= $opaque ); echo Uzyskanie dostępu do strony wymaga podania poprawnej nazwy użytkownika i hasła. ; exit; } function pc_parse_digest($digest, $realm, $users) { // W nagłówku skrótu muszą występować następujące parametry: // username, uri, qop, cnotce, nc oraz response $digest_info = array(); foreach (array( username , uri , nonce , cnonce , response ) as $part) { // Separatorem mogą być znaki ( ) lub ( ) lub brak jakiegokolwiek // znaku (w przypadku pól qop i nc) if (preg_match( / .$part. =([ ]?)(.*?)1/ , $digest, $match)) { // Element został znaleziony i zostanie zapamiętany. $digest_info[$part] = $match[2]; } else { // Jeśli element nie występuje, skrót jest niepoprawny. return false; } } // Sprawdzenie, czy została przekazana poprawna wartość qop if (preg_match( /qop=auth(,|$)/ , $digest)) { $digest_info[ qop ] = auth ; } else { return false; } // Sprawdzenie, czy została przekazana poprawna liczba wartości nonce if (preg_match( /nc=([0-9a-f]{8})(,|$)/ , $digest, $match)) { $digest_info[ nc ] = $match[1]; } else { return false; } // Wszystkie niezbędne wartości zostały wyodrębnione z nagłówka, można więc wykonać // obliczenia sprawdzające, czy dostarczone dane są poprawne. // // Wspomniane obliczenia są opisane w punktach 3.2.2, 3.2.2.1 oraz 3.2.2.2 // dokumentu // RFC 2617. // Wykorzystywany algorytm do MD5 $A1 = $digest_info[ username ] . : . $realm . : . $users[$digest_info[ username ]]; // Parametr qop ma wartość auth $A2 = $_SERVER[ REQUEST_METHOD ] . : . $digest_info[ uri ]; $request_digest = md5(implode( : , array(md5($A1), $digest_info[ nonce ], $digest_info[ nc ], $digest_info[ cnonce ], $digest_info[ qop ], md5($A2)))); 266 | Rozdział 8. Podstawy programowania na potrzeby WWW // Porównanie wartości przesłanej i obliczonej if ($request_digest != $digest_info[ response ]) { return false; } // Weryfikacja zakończona pomyślnie. Zwrócenie nazwy użytkownika. return $digest_info[ username ]; } ? Osoby, które nie korzystają z interpretera PHP w wersji 5.1.0 lub późniejszej, ale używają in- terpretera PHP jako modułu serwera Apache, mogą korzystać z uwierzytelniania typu Di- gest dzięki takim rozwiązaniom, jak klasa HTTPDigest Paula Jamesa, dostępna pod adresem http://www.peej.co.uk/projects/phphttpdigest.html. Ani mechanizmy prostego uwierzytelniania HTTP, ani mechanizmy uwierzytelniania typu Digest nie mogą być stosowane w przypadku, gdy program PHP funkcjonuje jako skrypt CGI. Jeżeli nie ma możliwości uruchomienia PHP jako modułu serwera, weryfikację użyt- kowników można oprzeć na danych cookies. Sposób ten omówiliśmy w recepturze 8.10. Z uwierzytelnianiem HTTP wiąże się jeszcze jeden problem, jest nim brak — innej niż zakoń- czenie pracy przeglądarki — możliwości wylogowania się. W podręczniku PHP zawarto kilka sugestii odnośnie sposobów wylogowywania, które niestety na różnych serwerach i w różnych przeglądarkach odnoszą różny skutek. Wspomniane informacje są dostępne pod adresem http://www.php.net/features.http-auth. Istnieje jednak prosty sposób wymuszenia na użytkowniku ponownego logowania się po upły- wie określonego czasu. Rozwiązanie sprowadza się do umieszczenia wartości czasu w ciągu tekstowym określającym obszar witryny objęty uwierzytelnianiem. Jeżeli przeglądarka prze- mieszcza się po stronach w ramach danego obszaru witryny, to za każdym razem, kiedy musi przesłać nazwę użytkownika i hasło, dostarcza serwerowi tych samych, wcześniej wprowa- dzonych przez użytkownika danych. Zmiana nazwy obszaru objętego uwierzytelnianiem spowoduje, że przeglądarka będzie zmuszona do pobrania od użytkownika nowych para- metrów uwierzytelniania. W listingu 8.21 został przedstawiony przykład mechanizmu umożli- wiającego wylogowanie użytkowników w każdej dobie o północy. Listing 8.21. Wymuszone wylogowanie w prostym uwierzytelnianiu HTTP ?php if (! pc_validate($_SERVER[ PHP_AUTH_USER ],$_SERVER[ PHP_AUTH_PW ])) { $realm = Moja strona do .date( Y-m-d ); header( WWW-Authenticate: Basic realm= .$realm. ); header( HTTP/1.0 401 Unauthorized ); echo Uzyskanie dostępu do strony wymaga podania poprawnej nazwy użytkownika i hasła. ; exit; } ? Poza tym istnieje możliwość ustalania dla każdego z użytkowników maksymalnego dopusz- czalnego czasu przeglądania danej witryny. Wyeliminowana została tu konieczność zmiany nazwy obszaru witryny objętej uwierzytelnianiem. Pomysł polega na zapisaniu czasu, w któ- rym użytkownik się zalogował lub pobrał chronioną stronę. Zaprezentowana w listingu 8.22 funkcja pc_validate2() zapisuje w bazie danych czas logowania i automatycznie przepro- wadza wylogowanie klienta po piętnastu minutach od ostatniego pobrania chronionej strony. 8.9. Proste uwierzytelnianie HTTP | 267 Listing 8.22. Funkcja pc_validate2() ?php function pc_validate2($user,$pass) { $safe_user = strtr(addslashes($user),array( _ = \_ , = )); $r = mysql_query( SELECT password,last_access FROM users WHERE user LIKE $safe_user ); if (mysql_numrows($r) == 1) { $ob = mysql_fetch_object($r); if ($ob- password == $pass) { $now = time(); if (($now - $ob- last_access) (15 * 60)) { return false; } else { // zmień czas ostatniego pobrania strony mysql_query( UPDATE users SET last_access = NOW() WHERE user LIKE $safe_user ); return true; } } } else { return false; } } ? Zobacz również Podobne zagadnienia zostały omówione w recepturze 8.10. Sekcja internetowego podręcznika PHP poświęcona uwierzytelnianiu HTTP znajduje się pod adresem http://www.php.net/features. http-auth. 8.10. Uwierzytelnianie z wykorzystaniem danych cookie Problem Chcemy, aby procedura logowania była w większym stopniu uzależniona od kodu skryptu, aby można było wyświetlić niestandardowy formularz logowania. Rozwiązanie Sposobem na rozwiązanie problemu może być zapisywanie statusu uwierzytelnienia w danych cookie lub w postaci elementu sesji. Po prawidłowym zalogowaniu się użytkownika jego nazwa mogłaby być zapisana jako dane cookie. Procedura wymaga zastosowania szyfrowania nazwy użytkownika i dodatkowego utajnionego słowa, dzięki czemu klient nie będzie mógł spreparo- wać cookie z informacjami uwierzytelniającymi i zawartą w nich nazwą użytkownika. Odpo- wiedni kod został przedstawiony w listingu 8.23. Listing 8.23. Uwierzytelnianie z wykorzystaniem danych cookie ?php $secret_word = jedz szpinak ; if (pc_validate($_REQUEST[ username ],$_REQUEST[ password ])) { 268 | Rozdział 8. Podstawy programowania na potrzeby WWW setcookie( login , $_REQUEST[ username ]. , .md5($_REQUEST[ username ].$secret_word)); } ? Analiza Dzięki zastosowaniu uwierzytelniania z wykorzystaniem danych cookie możliwe staje się przy- gotowanie własnego formularza logowania. Kod przykładowego formularza zawiera listing 8.24. Listing 8.24. Prosty formularz logowania — uwierzytelnianie z wykorzystaniem danych cookie form method= post action= login.php Nazwa użytkownika: input type= text name= username br Hasło: input type= password name= password br input type= submit value= Log In /form Do weryfikacji nazwy użytkownika i hasła można się posłużyć funkcją pc_validate2() przedstawioną w recepturze 8.18. Jedyna zmiana polega na tym, że parametry uwierzytel- niania musimy przekazać za pomocą $_REQUEST[ username ] i $_REQUEST[ password ], a nie jak poprzednio z użyciem $_SERVER[ PHP_AUTH_USER ] i $_SERVER [ PHP_AUTH_PW ]. Jeśli weryfikacja hasła zakończy się pomyślnie, serwer powinien odesłać dane cookie, w któ- rych zostanie zawarta nazwa użytkownika oraz jego skrót wraz z utajnionym słowem. Zasto- sowanie fun
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP. Receptury. 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ą: