Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00325 005869 13850379 na godz. na dobę w sumie
Head First PHP & MySQL. Edycja polska - książka
Head First PHP & MySQL. Edycja polska - książka
Autor: , Liczba stron: 800
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-2113-2 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> bazy danych >> mysql - programowanie
Porównaj ceny (książka, ebook, audiobook).

PHP wraz z MySQL stanowią najpopularniejszy zespół, służący do szybkiego tworzenia aplikacji internetowych o różnym stopniu złożoności. Dzięki dużym możliwościom, wydajności oraz optymalnemu podejściu do wielu zagadnień tworzą prawdopodobnie najpopularniejszą platformę do wprowadzania atrakcyjnych rozwiązań. Na temat wykorzystania możliwości PHP i MySQL napisano już wiele książek, jednak ta jest wyjątkowa - należy do popularnej i przyjaznej Czytelnikowi serii Head First!

'Head First PHP & MySQL. Edycja polska' nie jest kolejnym trudnym i nudnym podręcznikiem do nauki PHP i MySQL. Autorzy wykorzystują tu innowacyjne oraz niezwykle skuteczne techniki przyswajania wiedzy szybko i bezboleśnie. Z pomocą licznych ilustracji i ciekawych skojarzeń nauczą Cię, jak stosować PHP wraz z MySQL w Twojej codziennej pracy. Dzięki temu bez najmniejszych problemów przygotujesz formularz, przetworzysz dane wprowadzone przez użytkownika, a następnie zapiszesz je w bazie MySQL. Ponadto zostaniesz wtajemniczony w szczegóły języka PHP oraz SQL. Zapoznasz się z zagrożeniami oraz dowiesz się, jak chronić swoją aplikację przed atakami z zewnątrz. To wszystko sprawi, że pewnym krokiem wejdziesz w świat profesjonalnych aplikacji internetowych!

Wykorzystaj nowoczesne metody nauki
i opanuj możliwości duetu PHP-MySQL!

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

Darmowy fragment publikacji:

Head First PHP MySQL. Edycja polska Autorzy: Lynn Beighley, Michael Morrison T³umaczenie: £ukasz Schmidt ISBN: 978-83-246-2113-2 Tytu³ orygina³u: Head First PHP MySQL Format: 200×230, stron: 800 (cid:129) Odkryj tajniki tworzenia dynamicznych witryn opartych na bazach danych (cid:129) Uniknij kompromituj¹cych wpadek przy korzystaniu z formularzy (cid:129) Wczytaj wszystkie kluczowe elementy sk³adni prosto do swego mózgu (cid:129) Zainstaluj kod PHP i MySQL (cid:129) SprawdŸ sw¹ wiedzê na temat skryptów, wykonuj¹c dziesi¹tki æwiczeñ PHP wraz z MySQL stanowi¹ najpopularniejszy zespó³, s³u¿¹cy do szybkiego tworzenia aplikacji internetowych o ró¿nym stopniu z³o¿onoœci. Dziêki du¿ym mo¿liwoœciom, wydajnoœci oraz optymalnemu podejœciu do wielu zagadnieñ tworz¹ prawdopodobnie najpopularniejsz¹ platformê do wprowadzania atrakcyjnych rozwi¹zañ. Na temat wykorzystania mo¿liwoœci PHP i MySQL napisano ju¿ wiele ksi¹¿ek, jednak ta jest wyj¹tkowa – nale¿y do popularnej i przyjaznej Czytelnikowi serii Head First! „Head First PHP MySQL. Edycja polska” nie jest kolejnym trudnym i nudnym podrêcznikiem do nauki PHP i MySQL. Autorzy wykorzystuj¹ tu innowacyjne oraz niezwykle skuteczne techniki przyswajania wiedzy szybko i bezboleœnie. Z pomoc¹ licznych ilustracji i ciekawych skojarzeñ naucz¹ Ciê, jak stosowaæ PHP wraz z MySQL w Twojej codziennej pracy. Dziêki temu bez najmniejszych problemów przygotujesz formularz, przetworzysz dane wprowadzone przez u¿ytkownika, a nastêpnie zapiszesz je w bazie MySQL. Ponadto zostaniesz wtajemniczony w szczegó³y jêzyka PHP oraz SQL. Zapoznasz siê z zagro¿eniami oraz dowiesz siê, jak chroniæ swoj¹ aplikacjê przed atakami z zewn¹trz. To wszystko sprawi, ¿e pewnym krokiem wejdziesz w œwiat profesjonalnych aplikacji internetowych! (cid:129) Tworzenie i obs³uga formularzy (cid:129) Zastosowanie zmiennej $_POST (cid:129) Wysy³anie wiadomoœci e-mail z poziomu PHP (cid:129) Wykonywanie zapytañ SQL (cid:129) Pobieranie i wykorzystywanie danych z MySQL w PHP (cid:129) Elementarz jêzyka PHP (cid:129) Przesy³anie plików (cid:129) Bezpieczeñstwo danych w PHP (cid:129) Zastosowanie sesji oraz ciasteczek (cid:129) Sortowanie wyników (cid:129) Obs³uga kana³ów RSS (cid:129) Zamieszczanie materia³ów multimedialnych (cid:129) Zastosowanie formatu XML (cid:129) Instalacja i konfiguracja serwera Apache Wykorzystaj nowoczesne metody nauki i opanuj mo¿liwoœci duetu PHP–MySQL! Spis treści (skrócony) Spis treści Wprowadzenie Ożywianie statycznych stron. To żyje! Łączenie się z bazą MySQL. Jak wszystko wiąże się ze sobą? Tworzenie i zapełnianie bazy danych. Tworzenie własnych danych Realistyczne i praktyczne aplikacje. Twoja aplikacja w sieci WWW Używanie danych przechowywanych w plikach. Kiedy baza danych nie wystarcza Zabezpieczanie aplikacji. Załóżmy, że każdy stanowi zagrożenie Tworzenie spersonalizowanych aplikacji sieciowych. Pamiętasz mnie? Eliminowanie powtórzeń w kodzie. Współdzielenie oznacza troskę Kontroluj dane — kontroluj swój świat. Zbieranie danych Funkcje niestandardowe i do obsługi łańcuchów znaków. Dzięki funkcjom żyje się lepiej 1 2 3 4 5 6 7 7½ 8 9 10 Wyrażenia regularne. Reguły zastępowania 11 Wizualizowanie danych i inne zagadnienia. Dynamiczne dodawanie grafiki 12 A B C Rozpowszechnianie danych i usługi sieciowe. Interfejs do komunikacji ze światem Pozostałości. Dziesięć najważniejszych tematów (których nie poruszyliśmy) Konfigurowanie środowiska programistycznego. Miejsce do zabawy Rozszerzanie PHP. Jeszcze więcej możliwości 27 39 97 141 195 259 329 379 451 461 533 593 637 687 743 761 779 Spis treści (z prawdziwego zdarzenia) W Wprowadzenie Twój mózg a PHP i MySQL. Podczas gdy Ty próbujesz się czegoś nauczyć, mózg wyświadcza Ci przysługę i dba o to, abyś niczego nie zapamiętał. Twój mózg myśli sobie: „Lepiej zostawić miejsce na ważniejsze informacje, na przykład o dzikich zwierzętach, których należy unikać, i o tym, że ćwiczenie jogi pod wodą nie jest dobrym pomysłem”. Jak więc możesz przechytrzyć mózg i przekonać go, że Twoje życie zależy od znajomości technologii PHP i MySQL? Dla kogo przeznaczona jest ta książka? Kto prawdopodobnie powinien zrezygnować z tej książki? Wiemy, co sobie myślisz Wiemy, co sobie myśli Twój mózg Metapoznanie: myślenie o myśleniu Oto, co MY zrobiliśmy A oto, co TY możesz zrobić, aby zmusić mózg do posłuszeństwa Przeczytaj koniecznie Zespół recenzentów technicznych Podziękowania 28 28 29 29 31 32 33 34 36 37 9 1 Ożywianie statycznych stron To żyje! Umiesz tworzyć świetne strony za pomocą HTML-a i odrobiny stylów CSS. Zauważyłeś jednak, że użytkownicy Twoich witryn mogą tylko pasywnie przeglądać zawartość witryn. Komunikacja jest jednostronna i planujesz to zmienić. Chcesz poznać opinie użytkowników. Aby dowiedzieć się, o czym myślą internauci, trzeba umożliwić im wprowadzanie danych za pomocą formularzy. Musisz też umieć przetworzyć i pobrać te informacje. Wygląda na to, że podniesienie poziomu witryn wymaga użycia czegoś więcej niż samego kodu HTML. Strony HTML są statyczne i nudne PHP ożywia strony WWW Formularz pomoże Markowi poznać całą historię Formularze składają się z kodu HTML Formularz HTML sprawia problemy HTML działa po stronie KLIENTA PHP działa po stronie SERWERA Skrypty PHP działają na serwerze Dostęp do danych z formularza w kodzie PHP Skrypty PHP muszą działać na serwerze! Przenoszenie skryptów PHP na serwer Serwer przekształca kod PHP na HTML Analiza skryptu PHP Marka Kilka reguł pisania kodu związanych z językiem PHP Ustalanie idealnych nazw dla zmiennych Zmienne służą do przechowywania danych w skryptach $_POST to specjalna zmienna na dane z formularza Zmienna $_POST przesyła dane z formularza do skryptu Tworzenie treści listu w kodzie PHP Nawet zwykły tekst można (trochę) sformatować Znaki nowego wiersza trzeba umieścić w cudzysłowach Zbuduj e-mail do Marka Zmienne przechowują fragmenty e-maila Wysyłanie e-maili przy użyciu PHP Marek zaczyna otrzymywać e-maile Marek zaczyna gubić e-maile 40 41 43 44 46 48 49 50 54 56 57 60 62 63 64 69 71 72 82 84 85 86 87 88 91 92 Spis treści Czy ktoś go widział? 10 Spis treści 2 Łączenie się z bazą MySQL Jak wszystko wiąże się ze sobą? Ustalenie powiązań między elementami przed rozpoczęciem pracy to dobry pomysł. Utworzyłeś pierwszy działający skrypt PHP, jednak otrzymywanie danych z formularzy w formie listów elektronicznych już nie wystarcza. Potrzebny jest sposób na zapisanie takich informacji, aby można je przechowywać i w odpowiednim momencie pobierać. Możesz użyć do tego bazy danych MySQL. Aby zapisać w niej dane, musisz uzyskać dostęp do bazy MySQL z poziomu skryptów PHP. Formularz PHP Marka działa dobrze — aż za dobrze… MySQL doskonale nadaje się do przechowywania danych Marek potrzebuje bazy danych MySQL Utwórz bazę danych i tabelę MySQL Instrukcja INSERT w akcji Użyj instrukcji SELECT do pobrania danych z tabeli Użyj PHP do obsługi żmudnych instrukcji SQL PHP umożliwia przepływ danych z formularza Marka Połącz się z bazą danych w skrypcie PHP Wstawianie danych za pomocą skryptu PHP Użyj funkcji PHP do komunikacji z bazą danych Łączenie się z bazą za pomocą mysqli_connect() Budowanie zapytań INSERT w kodzie PHP Kierowanie zapytań do bazy MySQL w skryptach PHP Zamykanie połączenia za pomocą funkcji mysqli_close() Zmienna $_POST udostępnia dane z formularza Marek potrzebuje pomocy przy filtrowaniu danych Marek jest na dobrej drodze do znalezienia Kła Nowy formularz jest doskonały, ale otrzymuję zbyt wiele listów. Nawet kawa nie pomaga mi nadążyć z czytaniem na bieżąco wszystkich wiadomości. $query Nowak 37 sekund mysqli_query() J a n w 1991 roku przypominali metalowe os(cid:239)y nie wiem n a (cid:258) w i e t l a l i m n i e t y s i (cid:200) c a m i p r o m i e n i Uwielbiam ziemniaki. jn@iwasvicepresident.com tak 98 99 100 102 105 108 111 112 114 115 116 118 123 124 125 129 134 136 11 Spis treści 3 Tworzenie i zapełnianie bazy danych Tworzenie własnych danych Potrzebne informacje nie zawsze są dostępne. Czasem trzeba najpierw utworzyć dane. Nieraz należy też przygotować tabele do przechowywania informacji, a nawet zbudować bazę danych. Czujesz się zagubiony? Wkrótce wszystkiego się dowiesz. Zobaczysz, jak samodzielnie tworzyć bazy danych i tabele. Jeśli to wciąż za mało, przy okazji rozwiniesz swą pierwszą aplikację opartą na technologiach PHP i MySQL. Sklep poświęcony Elvisowi otwiera podwoje Edward potrzebuje aplikacji Wizualizacja projektu aplikacji Edwarda Wszystko zaczyna się od tabeli Nawiąż kontakt z serwerem MySQL Tworzenie bazy danych na adresy Edwarda Tworzenie tabeli w bazie danych Musimy zdefiniować dane Poznaj wybrane typy danych języka MySQL Tworzenie tabel przy użyciu zapytań Wskaż bazę danych przed jej użyciem Instrukcja DESCRIBE opisuje strukturę tabeli Edward jest gotowy do zapisywania danych Tworzenie skryptu do dodawania adresów Druga strona aplikacji Edwarda Mechanizmy skryptu do wysyłania wiadomości Zacznijmy od początku — pobieranie danych Funkcja mysqli_fetch_array() pobiera wyniki zapytania Pętle WHILE Przechodzenie po danych za pomocą pętli while Otrzymałeś wiadomość od Edwarda! Czasem użytkownicy chcą zrezygnować Usuwanie danych za pomocą instrukcji DELETE Użyj klauzuli WHERE, aby usunąć konkretne dane Minimalizowanie ryzyka przypadkowych usunięć ZrobZeMnieElvisa.com to aplikacja internetowa Lista mailingowa klientów Edwarda: Kurowski Julian jul_kurowski@breakneckpizza.com Olejnik Krystian olej@simuduck.com Nowakowska Amanda amanno@breakneckpizza.com Grabowski Edmund ed99@b0tt0msup.com Skiba Joanna joski@breakneckpizza.com Wrona Lucjan poduszkowiec@breakneckpizza.com Kot Anna AnnaKot@leapinlimos.com Matusiak Andrzej andrzejmat@obiektowo.net Madej Tomasz madejtom@mightygumball.com Kasprzak Alicja pirat@breakneckpizza.com Janicki Krzysztof krzych@starbuzzcoffee.com Czajka Adrianna adaczajka@chocoholic-inc.com Piotrowski Bartosz bp@honey-doit.com Socha Katarzyna kat86@obiektowo.net Sosnowski Dariusz sosna@breakneckpizza.com Maj Magda magdamaj@starbuzzcoffee.com Bednarek Wiktoria wiki@starbuzzcoffee.com Szwed Jacek szwedjacek@obiektowo.net Tomczyk Diana tomczykdi@mightygumball.net Jarosz Piotr weganin@tikibeanlounge.com Kurek Krystyna krysia0098@obiektowo.net Wolska Hanna hannaw@b0tt0msup.com Kos Maria bezproblemu@starbuzzcoffee.com Stasiak Agata cudowna@breakneckpizza.com Pawlik Jakub drpawlik@b0tt0msup.com Piasecki Maciej maciejp@weatherorama.com Krupa Urszula ulak@starbuzzcoffee.com Urban Piotr piotruspan@tibibeanlounge.com Kozak Mariola mariolka23@obiektowo.net Mucha Zuzanna zuza@weatherorama.com Nowacki Kamil kamilnowy@breakneckpizza.com Kowalik Janina jankak@chocoholic-inc.com Wilk Barbara barbaraw@breakneckpizza.com Sawicka Iga iga@tikibeanlounge.com Makowski Alfred amakowski@obiektowo.net Zawadzka Teresa tesa99@obiektowo.net 142 143 144 147 148 149 150 151 152 155 158 161 163 164 171 172 173 174 177 178 183 184 185 186 187 192 To wymaga zbyt dużo pracy. Wole spędzać czas na naśladowaniu Elvisa niż na ręcznym wysyłaniu e-maili. 12 Spis treści 4 Realistyczne i praktyczne aplikacje Twoje aplikacje w sieci WWW Czasem trzeba podejść do projektu realistycznie i jeszcze raz go przemyśleć. Możesz też poświęcić więcej czasu na zaplanowanie witryny na początku prac. Kiedy aplikacja znajdzie się już w sieci WWW, może się okazać, że projekt nie był doskonały. Rozwiązania, które na pozór powinny działać, czasem nie sprawdzają się w praktyce. W tym rozdziale rozwiążesz kilka rzeczywistych problemów, które mogą pojawić się przy przenoszeniu aplikacji ze środowiska testowego na serwer WWW. Przy okazji poznasz kilka ważnych fragmentów kodu PHP i SQL. Niektórzy klienci Edwarda są zirytowani Zabezpiecz Edwarda przed nim samym Sprawdzaj poprawność danych z formularza Walidacja w skrypcie sendemail.php Kod podejmuje decyzje dzięki instrukcji IF Sprawdzanie warunku Instrukcja IF sprawdza nie tylko równość Walidacja w skrypcie sendemail.php Funkcje PHP do sprawdzania zawartości zmiennych Sprawdzanie wielu warunków przy użyciu I oraz LUB Użytkownicy formularza potrzebują informacji zwrotnych Wygodne otwieranie i zamykanie bloków PHP Użyj flagi, aby uniknąć powielania kodu Napisz kod formularza jeden raz Formularz autoreferencyjny Wskaż skrypt w atrybucie action Sprawdzanie, czy użytkownik przesłał formularz Niektórzy użytkownicy nadal są niezadowoleni Wiersze tabeli powinny mieć niepowtarzalne identyfikatory Klucze główne wymuszają niepowtarzalność Od pól wyboru do identyfikatorów klientów Przechodzenie po elementach tablicy za pomocą foreach 196 199 200 201 202 203 204 207 208 215 219 229 230 231 235 236 238 242 244 246 251 252 13 Spis treści 5 Używanie danych przechowywanych w plikach Kiedy baza danych nie wystarcza Nie wierz przechwałkom — przynajmniej tym dotyczącym baz danych. To prawda, świetnie nadają się do przechowywania danych tekstowych, ale co z danymi binarnymi, na przykład rysunkami w formacie JPEG lub dokumentami PDF? Czy ma sens zapisywanie zdjęć kolekcji rzadkich gitar w tabelach bazy danych? Zwykle nie. Jednak możesz jednocześnie mieć wirtualne ciastko i je zjeść. W tym rozdziale dowiesz się, jak wykorzystać pliki i bazę danych do utworzenia aplikacji PHP, która używa danych binarnych. Wirtualni gitarzyści lubią współzawodnictwo Rysunki to dowód prawdziwości wyniku Aplikacja musi przechowywać rysunki Planowanie przesyłania plików w aplikacji Gitarowe wojny Trzeba zmodyfikować bazę rekordów za pomocą instrukcji ALTER Jak pobrać rysunek od użytkownika? Wstaw rysunki (nazwy plików) do bazy danych Określanie nazwy przesłanego pliku Gdzie znajdują się przesłane pliki? Utwórz miejsce na przesłane pliki graficzne Współużytkowane dane trzeba współdzielić Dołączanie danych współużytkowanych przez skrypty Traktuj instrukcję require_once jak polecenie „wstaw” W przypadku rekordowych wyników najważniejszy jest porządek Wyróżnianie najlepszego gitarowego wojownika Sformatuj najlepszy wynik za pomocą kodu HTML i CSS Przepuszczamy tylko małe rysunki Walidacja pliku zwiększa niezawodność aplikacji Projektowanie strony administracyjnej Generowanie odsyłaczy do usuwania wyników na stronie administracyjnej Skrypty mogą komunikować się ze sobą O żądaniach GET i POST GET, POST i usuwanie wyników Znajdowanie usuwanych wyników Kontrolowanie liczby usuwanych wierszy za pomocą klauzuli LIMIT 260 261 262 267 268 272 274 275 280 284 290 291 292 294 297 298 303 304 308 311 312 314 316 319 320 14 Spis treści 6 Zabezpieczanie aplikacji Załóżmy, że każdy stanowi zagrożenie Rodzice mieli rację — nie należy rozmawiać z nieznajomymi. A przynajmniej nie wolno im ufać. Z pewnością nie dawaj im kluczy do danych z aplikacji z nadzieją, że nie wykorzystają ich do złych celów. Świat bywa okrutny i nikomu nie należy ufać. Programista aplikacji sieciowych musi być nieco cyniczny i bardzo podejrzliwy. Tak, ludzie są przeważnie źli i z pewnością stanowią zagrożenie! W porządku, może trochę przesadzamy, jednak koniecznie traktuj bezpieczeństwo poważnie i projektuj aplikacje tak, aby zabezpieczyć je przed potencjalnymi napastnikami. Spróbujcie teraz przesłać sfałszowane dokumenty, to znaczy wyniki. Pracuję dokładnie i rzadko popełniam błędy. Dzień, w którym umarła muzyka Gdzie się podziały wyniki? Zabezpieczenia przed dzikimi hordami Zabezpieczanie strony administracyjnej Gitarowych wojen Uwierzytelnianie HTTP wymaga nagłówków Kontrolowanie nagłówków za pomocą PHP Uwierzytelnianie za pomocą nagłówków Tworzenie skryptu do obsługi uwierzytelniania Gitarowe wojny. Część II: Atak klonów rekordów Odejmowanie przez dodawanie Bezpieczeństwo wymaga interwencji człowieka Planowanie obsługi moderowania w Gitarowych wojnach Użyj instrukcji ALTER, aby zrobić miejsce na zatwierdzanie wyników Niezatwierdzone wyniki nie są potrzebne Oszustwo za milion punktów Czy jest tu moderator? Jak Ela to zrobiła? Oszukiwanie bazy MySQL za pomocą komentarzy Do formularza do dodawania wyników wstrzyknięto kod SQL Chroń dane przed wstrzyknięciem kodu SQL Bezpieczniejsza instrukcja INSERT (z parametrami) Walidacji formularza nigdy za wiele Wstrzymać ogień! 330 331 333 334 336 339 340 348 352 353 354 355 356 361 364 365 367 368 369 370 371 373 375 15 Spis treści 7 Tworzenie spersonalizowanych aplikacji sieciowych Pamiętasz mnie? Nikt — a zwłaszcza użytkownik aplikacji sieciowych — nie lubi, kiedy się o nim zapomina. Jeśli odwiedzający wchodzą w spersonalizowane interakcje z witryną, aplikacja powinna ich zapamiętywać. Przedstawianie się rodzinie po każdym powrocie do domu to dziwaczna perspektywa. Dzięki wspaniałej funkcji zwanej pamięcią nie musimy tego robić, jednak aplikacje sieciowe nie zapamiętują automatycznie użytkowników. To zmyślny programista musi użyć dostępnych narzędzi (na przykład PHP i MySQL), aby utworzyć spersonalizowaną aplikację, która potrafi rozpoznawać odwiedzających. Podobno przeciwieństwa się przyciągają Niedopasowanie opiera się na prywatnych danych Witryna Niedopasowani potrzebuje loginów Przygotowanie bazy do zapisywania loginów Tworzenie interfejsu logowania Szyfrowanie haseł za pomocą funkcji SHA() Porównywanie haseł Uwierzytelnianie użytkowników za pomocą HTTP Logowanie się użytkowników za pomocą uwierzytelniania HTTP Formularz do rejestracji nowych użytkowników Co zawierają pliki cookie? Zastosuj ciasteczka w kodzie PHP Modyfikowanie przebiegu logowania Logowanie oparte na plikach cookie Wylogowanie to efekt usunięcia plików cookie Sesje nie są zależne od klienta Śledzenie danych sesji Usprawnij aplikację Niedopasowani za pomocą sesji Wylogowywanie przy użyciu sesji Dokończ wprowadzanie sesji Użytkownicy nie czują się mile witani Sesje nie żyją długo… …ale pliki cookie mogą trwać wiecznie! Sesje + pliki cookie = większa trwałość logowania 380 381 382 385 387 388 389 392 395 399 409 410 413 414 419 423 425 426 427 432 438 440 441 443 16 Spis treści 7½ Eliminowanie powtórzeń w kodzie Współdzielenie oznacza troskę Parasole to nie jedyna rzecz, którą można się dzielić. W każdej aplikacji sieciowej natrafisz na kod, który powtarza się w kilku miejscach. Nie tylko jest to niepotrzebne, ale ponadto prowadzi do problemów z konserwacją, ponieważ w przyszłości z pewnością będziesz musiał wprowadzić zmiany w wielu różnych miejscach aplikacji. Rozwiązanie polega na wyeliminowaniu powtórzeń w kodzie przez jego współużytkowanie. Oznacza to, że należy umieścić powielany fragment w jednym miejscu, a następnie korzystać z tego kodu za każdym razem, kiedy jest potrzebny. Eliminacja powtarzającego się kodu pozwala tworzyć aplikacje, którą są wydajniejsze, łatwiejsze w konserwacji i bardziej niezawodne. Aplikacja Niedopasowani w kawałkach Przebudowywanie aplikacji Niedopasowani przy użyciu szablonu Przebudowa aplikacji Niedopasowani z wykorzystaniem szablonów Zupełnie nowa i dużo lepiej uporządkowana aplikacja Niedopasowani 455 456 458 460 startsession.php Każda spersonalizowana strona aplikacji Niedopasowani wymaga kodu do obsługi logowania, który zapamiętuje użytkownika. Stopka udostępnia widoczny w dolnej części każdej strony tekst, który obejmuje informacje o prawach autorskich. footer.php Nagłówek pojawia się na początku każdej strony witryny Niedopasowani i obejmuje nazwę aplikacji oraz tytuł specyficzny dla danej strony. header.php navmenu.php Menu nawigacyjne pojawia się tuż pod nagłówkiem i udostępnia na każdej stronie aplikacji Niedopasowani spójne menu, które umożliwia poruszanie się w witrynie. index.php Dzięki wykorzystaniu wielu innych skryptów na stronie index.php możemy skupić się na specyficznym dla niej zadaniu — wyświetlaniu listy użytkowników. 17 Spis treści 8 Kontroluj dane — kontroluj swój świat Zbieranie danych Nie ma nic lepszego niż udane żniwa danych. Możesz uzyskać w ten sposób dostęp do mnóstwa informacji gotowych do analizowania, sortowania, porównywania, łączenia i wykonywania innych zadań obsługiwanych przez Twoją fantastyczną aplikację sieciową. Przyjemne? O tak. Jednak uzyskanie kontroli nad danymi w bazie MySQL — podobnie jak prawdziwe żniwa — wymaga ciężkiej pracy i dużej wiedzy. Użytkownicy wymagają czegoś więcej niż przestarzałych i nudnych danych. Chcą informacji, które wzbogacają ich wiedzę, dają satysfakcję i są ważne. Na co więc czekasz? Uruchom traktor MySQL i ruszaj do pracy! Idealnie niedopasowani Aplikacja Niedopasowani opiera się na danych Utwórz model bazy danych za pomocą schematu Łączenie kilku tabel Klucze zewnętrzne w praktyce Jeden wiersz pasuje do jednego wiersza Jeden wiersz łączy się z wieloma Wiersze w relacji wiele do wielu Tworzenie kwestionariusza na potrzeby aplikacji Niedopasowani Zapisywanie odpowiedzi w bazie danych Możemy sterować formularzem za pomocą danych Generowanie formularza z kwestionariuszem w aplikacji Niedopasowani Droga do normalności W czasie normalizacji myśl w kategoriach atomów Trzy kroki do znormalizowanej bazy danych Modyfikowanie bazy aplikacji Niedopasowani Czy baza aplikacji Niedopasowani jest naprawdę znormalizowana? Zapytanie w zapytaniu wewnątrz zapytania… Złączmy tabele Łączenie za pomocą kropek To jeszcze nie wszystkie możliwości złączeń wewnętrznych Pseudonimy tabel i kolumn Pomoc ze strony złączeń Pięć kroków do udanego niedopasowania Porównywanie osób pod kątem niedopasowania Potrzebujemy pętli FOR 462 463 465 470 471 472 473 474 479 480 484 490 496 497 499 503 504 506 507 508 509 511 512 519 521 522 Horrory Niechęć Mai do horrorów oznacza niedopasowanie. Nie znosi ich! Uwielbia je. Niedopasowanie! Horrory ? ? mismatch_response response_id response user_id topic_id mismatch_topic topic_id name category mismatch_user user_id username password join_date first_name last_name gender birthdate city state picture 18 Spis treści 9 Funkcje niestandardowe i do obsługi łańcuchów znaków Dzięki funkcjom żyje się lepiej Funkcje pozwalają znacznie podnieść poziom aplikacji. Używałeś już funkcji języka PHP do wykonywania różnych zadań. W tym rozdziale poznasz kilka innych funkcji wbudowanych. Następnie nauczysz się tworzyć własne, niestandardowe funkcje, które pozwolą Ci uzyskać niewyobrażalne efekty. Może nie uda Ci się wyhodować w ten sposób laserowych rekinów, ale niestandardowe funkcje usprawniają kod i umożliwiają jego wielokrotne wykorzystanie. Trudno jest znaleźć dobrą ryzykowną pracę Wyszukiwanie nie daje możliwości popełnienia błędu Dzięki słowu kluczowemu LIKE zapytania SQL mogą być elastyczne Podziel łańcuch znaków na pojedyncze słowa Funkcja implode() tworzy łańcuch znaków przy użyciu podłańcuchów Wstępne przetwarzanie szukanego łańcucha znaków Zastępowanie niepotrzebnych znaków w szukanym tekście Potrzebujemy poprawnych szukanych łańcuchów Kopiowanie niepustych elementów do nowej tablicy Czasem potrzebny jest tylko fragment łańcucha Pobieranie podłańcuchów z obu stron tekstu Można posortować wyniki w kilku zapytaniach Funkcje umożliwiają wielokrotne wykorzystanie kodu Zbuduj zapytanie za pomocą niestandardowej funkcji SWITCH obsługuje więcej decyzji niż IF Sortowanie w funkcji build_query() Możemy podzielić wyniki na strony Pobieranie tylko potrzebnych wierszy dzięki klauzuli LIMIT Zarządzanie odnośnikami związanymi z klauzulą LIMIT Kontrolowanie danych potrzebnych do obsługi stronicowania Konfigurowanie zmiennych używanych do stronicowania Poprawianie zapytania, które pobiera stronicowane wyniki Generowanie odnośników do nawigacji po stronach Tworzenie kompletnego skryptu do wyszukiwania ofert Kompletny skrypt do wyszukiwania ofert — ciąg dalszy 534 536 537 542 545 551 552 556 557 560 561 564 568 569 574 577 580 581 582 583 584 585 586 589 590 19 Spis treści 10 Wyrażenia regularne Reguły zastępowania Funkcje do obsługi łańcuchów znaków są bardzo przydatne, ale mają pewne ograniczenia. Oczywiście, potrafią określić długość tekstu, skrócić go i zastąpić wybrane znaki innymi. Jednak czasem potrzebne są bardziej złożone operacje związane z tekstem. Wtedy pomocne są wyrażenia regularne. Przy ich użyciu można precyzyjnie modyfikować łańcuchy znaków na podstawie zestawu reguł, a nie pojedynczego kryterium. Użytkownicy serwisu Ryzykowne prace mogą zamieszczać w nim życiorysy Określ, jaki format powinny mieć dane Utwórz wzorzec numerów telefonów Dopasuj dane do wzorca za pomocą wyrażeń regularnych Tworzenie wzorców za pomocą metaznaków Dopracuj wzorce za pomocą klas znaków Wyszukiwanie wzorców za pomocą funkcji preg_match() Ustandaryzuj numery telefonów Usuwanie niepożądanych znaków Dopasowywanie adresów e-mail może być trudne Przyrostki domen są wszędzie Użyj języka PHP do walidacji domeny Walidacja adresów e-mail — łączenie wszystkich elementów 594 598 601 602 604 611 616 623 624 628 630 631 632 Imi(cid:266): Jacek Nazwisko: Szybki E-mail: JS@sim-u-duck.com Telefon: (555) 526 4652 Szukana praca: Ninja Pojawił się komunikat błędu, po czym wpisałem pełny numer telefonu. Następnie dostałem posadę ninji! Imi(cid:266): Jacek Nazwisko: Szybki E-mail: JS@sim-u-duck.com Telefon: (555) 526 4652 Szukana praca: Ninja 20 Spis treści 11 Wizualizowanie danych i inne zagadnienia Dynamiczne dodawanie grafiki Wszyscy wiemy, jakie możliwości dają odpowiednie zapytania i zbiory wyników. Jednak dane nie zawsze są w pełni zrozumiałe. Czasem warto przedstawić je w innym, bardziej wizualnym świetle. PHP umożliwia wyświetlanie graficznej reprezentacji danych z bazy w postaci wykresów kołowych, wykresów słupkowych, diagramów Venna, plam Rorschacha i tak dalej. Pomaganie użytkownikom w zrozumieniu danych to swego rodzaju gra. Jednak nie wszystkie wartościowe grafiki w aplikacjach PHP pochodzą z bazy danych. Czy wiedziałeś, że za pomocą dynamicznie generowanych rysunków można powstrzymać roboty spamujące? Dodaj wynik, dodaj wynik, dodaj wynik, dodaj wynik, dodaj wynik, dodaj wynik… To niedorzeczne! Nie zdołam przefiltrować wszystkich tych danych. Większość z nich wygląda na nieprawdziwe, a ja nawet nie wiem, czym jest „frowney”. Powrót Gitarowych wojen: narodziny maszyn Żaden formularz na dane wejściowe nie jest bezpieczny Musimy oddzielić ludzi od maszyn Możemy pokonać automatyzację automatyzacją Generowanie tekstu hasła w teście CAPTCHA Generowanie rysunku z testem CAPTCHA Funkcje graficzne biblioteki GD Wyświetlanie tekstu za pomocą innych czcionek Generowanie losowych rysunków z testami CAPTCHA Przywracanie normalności w Gitarowych wojnach Dodawanie testu CAPTCHA do skryptu do dodawania wyników Pięć wymiarów niedopasowania Diagramy niedopasowania Zapisywanie danych na potrzeby wykresu Od jednej tablicy do drugiej Tworzenie tablicy niedopasowanych tematów Plan tworzenia wykresu Analizowanie kategorii Określanie liczby kategorii Podstawy rysowania wykresów Rysowanie i wyświetlanie rysunku z wykresem słupkowym Osobne rysunki z wykresami dla wszystkich Użytkownicy serwisu Niedopasowani polubili wykresy 638 639 640 643 645 646 648 652 655 657 659 662 663 664 668 670 671 672 673 676 679 682 685 21 Spis treści 12 Rozpowszechnianie danych i usługi sieciowe Interfejs do komunikacji ze światem Świat jest wielki, czego nie można ignorować w czasie tworzenia aplikacji sieciowych. Nie chcesz przecież, aby użytkownicy zignorowali Twoją witrynę. Doskonałym sposobem na dostrojenie aplikacji do świata jest rozpowszechnianie danych. Technika ta sprawia, że użytkownicy mogą subskrybować informacje i otrzymywać je bez konieczności odwiedzania witryny. Ponadto aplikacja może stanowić interfejs do innych programów (służą do tego usługi sieciowe) i korzystać z danych z zewnętrznych serwisów, co otwiera przed programistą dodatkowe możliwości. Marek musi poinformować świat o zaginięciu Kła Przesyłanie danych o porwaniach do użytkowników RSS pozwala przesyłać zawartość witryny do użytkowników RSS to w rzeczywistości XML Z bazy danych do czytnika kanałów RSS Wizualizowanie kodu RSS Dynamiczne generowanie kanału RSS Odnośnik do kanału RSS Jeden film jest wart miliona słów Pobieranie materiałów od innych Rozpowszechnianie filmów z YouTube Przesyłanie żądania danych o filmach do serwisu YouTube Marek jest gotów do utworzenia żądania REST YouTube komunikuje się w języku XML Analiza kodu XML odpowiedzi z serwisu YouTube Wizualizowanie danych XML z opisem filmów Dostęp do danych XML za pomocą obiektów Od elementów XML do obiektów PHP Pobieranie danych XML za pomocą obiektów Nie zapominaj o przestrzeniach nazw! Obserwatorzy zauważyli Kła Rozmieść wyświetlane filmy Formatowanie danych o filmach w celu ich wyświetlenia 688 689 690 691 696 699 702 706 708 710 711 712 716 720 724 725 726 727 728 729 731 732 733 Niektóre programy pocztowe obsługują rozsyłane informacje, co pozwala użytkownikom otrzymywać aktualne wiadomości z witryny w taki sam sposób, jak listy elektroniczne. Także wiele standardowych przeglądarek umożliwia przeglądanie rozsyłanych informacji, wśród których można szybko znaleźć najnowsze wiadomości zamieszczone w witrynie. Nawet urządzenia przenośne zapewniają dostęp do rozsyłanych danych, które są dostarczane automatycznie po zmianie zawartości witryny. 22 Spis treści A Pozostałości Dziesięć najważniejszych tematów (których nie poruszyliśmy) Nawet po omówieniu wszystkiego zawsze znajdą się jakieś dodatkowe informacje. Warto, żebyś poznał jeszcze kilka innych zagadnień. Uznaliśmy, że nie można ich pominąć, choć wymagają tylko krótkiej wzmianki. Dlatego zanim odłożysz książkę, zapoznaj się z tymi krótkimi, ale ważnymi ciekawostkami na temat języków PHP i MySQL. Ponadto skoro już doszedłeś do tego miejsca, zostało Ci do końca tylko kilka niedługich dodatków… indeks… może kilka reklam… i to będzie już naprawdę koniec. Obiecujemy! Numer 1. Dopasowywanie kodu do języka PHP 4 i funkcji mysql Numer 2. Uprawnienia użytkowników w MySQL Numer 3. Zgłaszanie błędów w MySQL Numer 4. Obsługa wyjątków w kodzie PHP Numer 4. Obsługa wyjątków w PHP (ciąg dalszy) Numer 5. Obiektowy język PHP Numer 5. Obiektowy język PHP (ciąg dalszy) Numer 6. Zabezpieczanie aplikacji PHP Numer 6. Zabezpieczanie aplikacji PHP (ciąg dalszy) Numer 7. Zabezpieczanie aplikacji przed atakami XSS Numer 7. Zabezpieczanie aplikacji przed atakami XSS (ciąg dalszy) Numer 8. Pierwszeństwo operatorów Numer 9. Czym różni się język PHP 5 od PHP 6? Numer 9. Czym różni się język PHP 5 od PHP 6? (ciąg dalszy) Numer 10. Wykorzystanie kodu PHP innych osób BANK W DATOWIE POŻYCZKI I KREDYTY 744 746 748 749 750 751 752 753 754 755 756 757 758 759 760 23 Spis treści B Konfigurowanie środowiska programistycznego Miejsce do zabawy Potrzebujesz miejsca, w którym będziesz mógł przetestować nowe umiejętności z obszaru technologii PHP i MySQL bez narażania danych na ataki w sieci WWW. Zawsze warto mieć bezpieczny obszar do rozwijania aplikacji PHP przed udostępnieniem ich światu. W tym dodatku dowiesz się, jak zainstalować serwer WWW, bazę danych MySQL i język PHP, aby przygotować bezpieczne miejsce do pracy oraz ćwiczeń. Komputer serwerowy Serwer WWW Serwer bazodanowy Utwórz środowisko do programowania w języku PHP Sprawdź dostępne komponenty Czy masz serwer WWW? Czy masz PHP? W której wersji? Czy masz zainstalowany serwer MySQL? Którą wersję? Zacznij od serwera WWW Instalowanie serwera Apache — zakończenie Instalowanie PHP Etapy instalowania PHP Etapy instalowania PHP — zakończenie Instalowanie MySQL Etapy instalowania serwera MySQL w systemie Windows Włączanie PHP w systemie Mac OS X Etapy instalowania MySQL w systemie Mac OS X Przenoszenie kodu ze środowiska produkcyjnego do publicznie dostępnej witryny Zrób zrzut danych (i tabel) Przygotowania do użycia zrzutu danych Przenoszenie zrzuconych danych na serwer publiczny Łączenie się z serwerem publicznym 762 762 763 763 764 765 766 766 767 768 768 769 772 772 774 775 775 776 777 24 Spis treści C Rozszerzanie PHP Jeszcze więcej możliwości To prawda, że za pomocą PHP i MySQL możesz tworzyć doskonałe aplikacje sieciowe. Jednak wiesz, że musi istnieć coś jeszcze. Rzeczywiście tak jest. W tym krótkim dodatku zobaczysz, jak zainstalować rozszerzenie mysqli i bibliotekę graficzną GD. Opiszemy też kilka innych wartościowych dodatków do języka PHP. Czasem nie ma nic złego w tym, że chcemy czegoś więcej. Rozszerzanie języka PHP A w komputerach Mac… Powinieneś zobaczyć pliki php_gd2.dll i php_mysqli.dll. Pobierz rozszerzenie mysqli dopasowane do używanej wersji języka PHP. Skorowidz S 780 783 785 25 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Dzięki funkcjom żyje się lepiej dyplom inżyniera, nic mnie nie powstrzyma. Znajdę kryjówkę, wyhoduję laserowe rekiny i zniszczę Księżyc. Potem może wyjdę za mąż Teraz, kiedy mam już i się ustatkuję. Funkcje pozwalają znacznie podnieść poziom aplikacji. Używałeś już funkcji języka PHP do wykonywania różnych zadań. W tym rozdziale poznasz kilka innych funkcji wbudowanych. Następnie nauczysz się tworzyć własne, niestandardowe funkcje, które pozwolą Ci uzyskać niewyobrażalne efekty. Może nie uda Ci się wyhodować w ten sposób laserowych rekinów, ale niestandardowe funkcje usprawniają kod i umożliwiają jego wielokrotne wykorzystanie. to jest nowy rozdział (cid:23) 533 W witrynie Ryzykowne prace potrzebny jest mechanizm wyszukiwania Trudno jest znaleźć dobrą ryzykowną pracę Nowy serwis internetowy RyzykownePrace.biz ma pomóc firmom w znalezieniu odpowiednich pracowników do wykonywania niebezpiecznych zajęć. Model biznesowy witryny jest prosty — otrzymujemy od przedsiębiorstw prowizję za każdego znalezionego kandydata. Im więcej pracowników zapewnimy firmom, tym większe będą zyski. Serwis wymaga usprawnienia mechanizmu wyszukiwania ofert pracy. Obecnie mamy bazę danych pełną ryzykownych stanowisk, które tylko czekają na odkrycie przez odpowiednie osoby. Przyjrzyjmy się formularzowi wyszukiwania informacji w serwisie Ryzykowne prace i bazie danych z dostępnymi ofertami. Ten prosty formularz wywołuje skrypt, który przeszukuje tabelę riskyjobs. Formularz wyszukiwania w serwisie Ryzykowne prace uruchamia zapytanie do tabeli riskyjobs, które pobiera odpowiednie oferty. job_id title 1 2 3 4 5 6 7 8 Matador Paparazzi Treser rekinów Strażak Kontroler napięcia Dentysta krokodyli Chodzenie po kremie Serwisant elektrycznych byków Tabela riskyjobs zawiera nazwy stanowisk i ich opisy, a także miejsce wykonywania pracy oraz datę udostępnienia każdej oferty. company Mleczarnia szalone krowy W pogoni za gwiazdami Rekinarium Miasto Katowice Szok S.A. Żarłoczne gady Kremowe technologie Bar u Henia date_posted 2008-03-11 10:51:24 2008-03-24 10:51:24 2008-04-28 03:12:45 2008-05-22 12:34:17 2008-06-28 11:16:30 2008-07-14 10:51:24 2008-07-14 10:54:05 2008-07-27 11:22:28 ZP OP SL SL MZ MZ WP WM 70-950 45-087 44-100 40-012 26-610 02-200 62-800 10-254 Wyświetlanie wyników wyszukiwania! description riskyjobs city state zip Szczecin Rozwijająca się mleczarnia… Czołowa firma fotografująca… Opole Uczenie rekinów ciekawych… Miejscowość Katowice … Praca w terenie, która… Czy kochasz zwierzęta?… Potrzebujemy osób… Bar u Henia poszukuje… Gliwice Katowice Radom Warszawa Kalisz Olsztyn … Każda oferta ma niepowtarzalny identyfikator w postaci klucza głównego job_id. 534 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Jestem gotów spełnić swe marzenia i zostać matadorem, są puste. ale wyniki wyszukiwania w witrynie Ryzykowne prace Antoni — nieustraszony pogromca byków — jest wściekły, ponieważ wyszukiwanie zakończyło się niepowodzeniem. Zaostrz ołówek Przy przesyłaniu formularza w witrynie Ryzykowne prace łańcuch znaków z zapytaniem jest zapisywany w zmiennej $user_search. Skrypt wstawia tę zmienną do poniższego zapytania SQL, które uruchamia wyszukiwanie. Napisz, ile wierszy z bazy riskyjobs z poprzedniej strony zostanie zwróconych przez zapytanie Antoniego. $search_query = SELECT job_id, title, state, description FROM riskyjobs . WHERE title = $user_search ; $result = mysqli_query($dbc, $search_query); Tu wpisz odpowiedź! ..................... jesteś tutaj (cid:23) 535 Zapytania muszą być bardziej elastyczne Zaostrz ołówek: Rozwiązanie Przy przesyłaniu formularza w witrynie Ryzykowne prace łańcuch znaków z zapytaniem jest zapisywany w zmiennej $user_search. Skrypt wstawia tę zmienną do poniższego zapytania SQL, które uruchamia wyszukiwanie. Napisz, ile wierszy z bazy riskyjobs z poprzedniej strony zostanie zwróconych przez zapytanie Antoniego. Klauzula WHERE ze znakiem = oznacza, że dwa porównywane łańcuchy muszą być dokładnie takie same. Ta zmienna zawiera dane wpisane w polu tekstowym. $search_query = SELECT job_id, title, state, description FROM riskyjobs . WHERE title = $user_search ; $result = mysqli_query($dbc, $search_query); Nic, zero, brak wyników! Problem polega na tym, że zapytanie jest zbyt wymagające — użytkownik musi wpisać dokładną nazwę stanowiska. ..................... 0 Wyszukiwanie nie daje możliwości popełnienia błędu Zapytanie SELECT w skrypcie witryny Ryzykowne prace jest bardzo ścisłe i zwraca wyniki tylko wtedy, jeśli porównywane łańcuchy są identyczne. Utrudnia to przeszukiwanie ofert. Użytkownicy powinni móc uzyskać wyniki także wtedy, jeżeli nie wpiszą dokładnej nazwy stanowiska. Wróćmy do wyszukiwania Antoniego. Wpisane dane powodują uruchomienie zapytania, które szuka w kolumnie title tabeli riskyjobs tekstu „pogromca byków matador”. SELECT job_id, title, description FROM riskyjobs WHERE title = ‘pogromca byków matador’ Wielkość znaków w szukanym tekście nie ma znaczenia, ponieważ klauzula WHERE języka MySQL domyślnie nie uwzględnia tej cechy. Operator = wymaga, aby porównywane łańcuchy znaków były identyczne. Dostrzegasz problem? Zapytanie znajdzie w tabeli tylko te wiersze, w których tabela title zawiera tekst „pogromca byków matador”. Nie zwróci stanowisk o nazwie „matador” lub „serwisant elektrycznych byków”. To prawda, ta ostatnia posada nie interesuje Antoniego, ale wyszukiwanie nie działa tak, jak powinno. Problemu nie stanowi wielkość znaków (proces wyszukiwania danych w języku MySQL domyślnie nie uwzględnia wielkości liter). Przyczyną jest fakt, że do nazwy stanowiska musi pasować cały łańcuch znaków, co wynika z użycia w klauzuli WHERE operatora równości (=). 536 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Dzięki słowu kluczowemu LIKE zapytania SQL mogą być elastyczne Potrzebny jest sposób na przeszukiwanie bazy danych w celu dopasowania tylko fragmentu podanego łańcucha. SQL udostępnia do tego słowo kluczowe LIKE, które zwiększa elastyczność zapytań z klauzulą WHERE. Możesz traktować to słowo jak bardziej „wyrozumiałą” wersję operatora =. Przyjrzyj się poniższemu zapytaniu. Użyliśmy w nim słowa kluczowego LIKE do dopasowania wierszy, w których w dowolnym miejscu kolumny title pojawia się słowo „kier”. SELECT job_id, title, description FROM riskyjobs WHERE title LIKE kier Słowo kluczowe LIKE pozwala znaleźć dane, które nie są identyczne ze słowem podanym w apostrofach. Wyszukiwanie także tu nie uwzględnia wielkości znaków. to symbole wieloznaczne, które zastępują dowolne znaki występujące przed danym słowem lub po nim. Słowo kluczowe LIKE znacznie ułatwia wyszukiwanie, zwłaszcza jeśli chcesz dopasować tekst, który jest częścią dłuższego słowa lub zwrotu. Przyjrzyj się przykładowym łańcuchom, które pasują do powyższego zapytania: Kierownik Bankier Cukiernik W klauzuli LIKE zwykle pojawiają się symbole wieloznaczne, które zastępują znaki w dopasowywanych danych. W języku SQL symbol wieloznaczny w postaci znaku procentów ( ) oznacza dowolną grupę znaków. Umieszczenie tego symbolu w zapytaniu przed szukanym tekstem lub po nim (jak we wcześniejszej instrukcji SELECT) informuje SQL, że należy pobrać dane, w których pojawia się dany fragment. Nie jest istotne, ile znaków znajduje się przed nim lub po nim. Dla zaawansowanych SQL udostępnia też inny symbol wieloznaczny, którego można użyć w klauzuli LIKE. Jest to podkreślenie (_), które reprezentuje pojedynczy znak. Przyjrzyj się poniższej klauzuli LIKE: LIKE straż_ _ Klauzula ta oznacza: „Znajdź poprzedzony dowolnymi symbolami łańcuch »straż«, po którym następują dwa znaki”. Wyrażenie to pasuje do słów „strażak” i „starszy strażak”, ale już nie do wyrazu „strażnik”. jesteś tutaj (cid:23) 537 Przygotowywanie kodu bazy riskyjobs Przerwa! Poświęć chwilę na zapoznanie się z bazą serwisu Ryzykowne prace i uruchom kilkakrotnie wyszukiwanie. Pobierz z FTP wydawnictwa Helion (ftp://ftp.helion.pl/przyklady/hfphms.zip) plik riskyjobs. sql aplikacji Ryzykowne prace. Zawiera on instrukcje SQL, które utworzą tabelę riskyjobs i zapełnią ją przykładowymi danymi. Po uruchomieniu w narzędziu do obsługi MySQL instrukcji z pliku riskyjobs.sql wypróbuj kilka zapytań, aby zasymulować wyszukiwanie stanowisk. Poniżej znajdziesz kilka poleceń, od których możesz zacząć. SELECT * FROM riskyjobs To zapytanie pobiera wszystkie kolumny wszystkich wierszy z ofertami z tabeli riskyjobs. SELECT job_id, title, description FROM riskyjobs WHERE title = ‘matador pogromca byków’ To zapytanie pobiera identyfikator oferty, nazwę i opis stanowiska z wierszy, w których kolumna title ma wartość „matador pogromca byków”. SELECT job_id, title, description FROM riskyjobs WHERE description LIKE ‘ zwierz ’ W tym zapytaniu użyliśmy klauzuli LIKE, aby znaleźć stanowiska, w których opisie pojawia się słowo „zwierz”. Pobierz pliki! Kompletny kod źródłowy aplikacji Ryzykowne prace znajdziesz na FTP wydawnictwa Helion: ftp://ftp.helion.pl/przyklady/hfphms.zip 538 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Magnesiki z klauzulą LIKE Do lodówki przyczepionych jest kilka klauzul LIKE. Czy potrafisz dopasować je do odpowiednich wyników? Które magnesiki nie odpowiadają żadnej z podanych klauzul LIKE? Niektórym klauzulom może odpowiadać kilka wyników. LIKE er LIKE T LIKE c LIKE ator LIKE Tipper Cow LIKE do_ LIKE ma Operator Armaty Młodszy Tester Matador Komandos Klown na Rodeo Chytry Bankier Czujny Ofi cer Polityk Chomików Treser Szmugler Podwodny Ankieter jesteś tutaj (cid:23) 539 Magnesiki z klauzulą LIKE — rozwiązanie Magnesiki z klauzulą LIKE. Rozwiązanie Do lodówki przyczepionych jest kilka klauzul LIKE. Czy potrafisz dopasować je do odpowiednich wyników? Które magnesiki nie odpowiadają żadnej z podanych klauzul LIKE? Do tego zapytania pasują wszystkie nazwy z końcówką „er”. LIKE er Młodszy Tester Chomików Treser Szmugler Czujny Ofi cer Podwodny Ankieter Chytry Bankier W zapytaniach SQL wielkość znaków jest nieistotna, dlatego to zapytanie pasuje do nazw z małą i dużą literą „c”. LIKE c Chomików Treser Czujny Ofi cer Chytry Bankier W pasujących nazwach przed literą „T” musi wystąpić odstęp. LIKE T Młodszy Tester Chomików Treser Wielkość znaków nie ma znaczenia. LIKE ator Operator Armaty Po literach „do” może pojawić się tylko jeden znak. W dowolnym miejscu pasującej nazwy muszą pojawić się litery „ma”. LIKE do_ Matador Komandos LIKE ma Operator Armaty Komandos Matador Ta klauzula LIKE nie odpowiada żadnej nazwie. LIKE Treser Chomików Te nazwy nie pasują do żadnego zapytania. Klown na Rodeo Polityk 540 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Ostatnia klauzula LIKE, LIKE Treser Chomików , nie pasuje do żadnego stanowiska, ponieważ słowa „Treser” i „Chomików” nigdzie nie występują razem w tej kolejności. Wygodny byłby podział szukanych wyrażeń na słowa i wyszukiwanie poszczególnych wyrazów. Zapytanie będzie działało dużo lepiej, jeśli będzie wyszukiwało pojedyncze słowa „Treser” i „Chomików” zamiast cały łańcuch „Treser Chomików”. To naprawdę wygodne! Musimy tylko ustalić, jak wyszukać każde z wpisanych słów. Dokładne dopasowywanie całego tekstu z pola wyszukiwania aplikacji Ryzykowne prace nie zawsze pozwala uzyskać pożądane wyniki. Aby zwiększyć skuteczność aplikacji, należy wyszukiwać poszczególne słowa, a nie całe łańcuchy znaków. Jak jednak znaleźć wiersze danych na postawie kilku odrębnych wyrazów? Możemy zapisać każdy z nich w tablicy, a następnie zmodyfikować zapytanie SELECT, aby wyszukiwało dane na podstawie poszczególnych słów. jesteś tutaj (cid:23) 541 Funkcja explode() języka PHP Podziel łańcuch znaków na pojedyncze słowa Aby mechanizm wyszukiwania w aplikacji Ryzykowne prace był skuteczniejszy, należy podzielić wpisany przez użytkownika łańcuch znaków, jeśli składa się z kilku słów. Osoby szukające pracy wprowadzają dane tekstowe, co oznacza, że możemy użyć funkcji wbudowanych języka PHP do ich przetworzenia. Jednym z przydatnych narzędzi tego typu jest funkcja explode(). Dzieli ona łańcuch znaków na fragmenty. Oto przykład jej działania: Funkcja explode() dzieli łańcuch znaków na tablicę podłańcuchów na podstawie separatora (nazywanego też ogranicznikiem). Ten parametr to tekst, który chcemy podzielić. $search_words = explode(‘ ‘, ‘Treser Chomików’); Funkcja explode() dzieli łańcuch znaków na tablicę podłańcuchów. Zmienna $search_words zawiera tablicę szukanych słów, której użyjemy w zapytaniu SQL. Ten parametr informuje funkcję explode(), co oddziela podłańcuchy w tekście (tu jest to odstęp). Można podać tu kilka znaków. Noszą one nazwę ograniczników. Funkcja explode() wymaga podania dwóch parametrów. Pierwszy z nich to ogranicznik, czyli znak (lub ich zbiór), który określa, gdzie należy podzielić łańcuch. W przedstawionym kodzie separatorem jest odstęp, co oznacza, że funkcja podzieli tekst w miejscach wystąpienia spacji. Same ograniczniki są pomijane w wynikowych podłańcuchach. Drugi parametr to dzielony tekst. Ogranicznik w postaci odstępu określa, gdzie należy podzielić łańcuch. w ó k i m o h C r e s e r T explode() r e s e r T w ó k i m o h C $search_words Każdy podłańcuch jest zapisywany jako odrębny element tablicy. Utworzenie tablicy szukanych słów w aplikacji Ryzykowne prace wymaga dodania wiersza kodu przed uruchomieniem zapytania. Teraz jeśli użytkownik wpisze w polu wyszukiwania tekst „Treser Chomików”, kod podzieli go na dwa słowa i zapisze każde z nich w tablicy $search_words. Funkcja explode() zapisuje każde słowo ze zmiennej $user_search w tablicy $search_words. $user_search = $_GET[ usersearch ]; $search_words = explode( , $user_search); 542 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Ćwiczenie Aby wyszukać poszczególne słowa w bazie aplikacji Ryzykowne prace, trzeba umieścić każde z nich w zapytaniu SELECT języka SQL. Można to zrobić za pomocą słów kluczowych LIKE i OR. Tak powinno wyglądać zapytanie, jeśli Antoni wpisze tekst „matador pogromca byków”. SELECT * FROM riskyjobs Teraz przeszukujemy opisy stanowisk zamiast nazw, ponieważ w opisie można znaleźć więcej informacji. WHERE description LIKE matador OR description LIKE pogromca OR description LIKE byków Załóżmy, że użyliśmy poniższego kodu PHP do utworzenia tego zapytanie na podstawie danych wpisanych przez użytkownika w formularzu wyszukiwania w aplikacji Ryzykowne prace: $search_query = SELECT * FROM riskyjobs ; $where_clause = ; $user_search = $_GET[ usersearch ]; $search_words = explode( , $user_search); foreach ($search_words as $word) { $where_clause .= description LIKE $word OR ; } if (!empty($where_clause)) { $search_query .= WHERE $where_clause ; } Zapisz zapytanie SQL wygenerowane przez ten kod, kiedy Antoni wpisze w polu wyszukiwania tekst „pogromca byków matador”. Opisz, jakie problemy mogą się pojawić. .................................................................................................................................................................. .................................................................................................................................................................. .................................................................................................................................................................. jesteś tutaj (cid:23) 543 Ćwiczenie — rozwiązanie Aby wyszukać poszczególne słowa w bazie aplikacji Ryzykowne prace, trzeba umieścić każde z nich w zapytaniu SELECT języka SQL. Można to zrobić za pomocą słów kluczowych LIKE i OR. Tak powinno wyglądać zapytanie, jeśli Antoni wpisze tekst „matador pogromca byków”. Ćwiczenie: Rozwiązanie SELECT * FROM riskyjobs Teraz przeszukujemy opisy stanowisk zamiast nazw, ponieważ w opisie można znaleźć więcej informacji. WHERE description LIKE matador OR description LIKE pogromca OR description LIKE byków Załóżmy, że użyliśmy poniższego kodu PHP do utworzenia tego zapytanie na podstawie danych wpisanych przez użytkownika w formularzu wyszukiwania w aplikacji Ryzykowne prace: $search_query = SELECT * FROM riskyjobs ; $where_clause = ; $user_search = $_GET[ usersearch ]; $search_words = explode( , $user_search); foreach ($search_words as $word) { Każda klauzula LIKE kończy się słowem OR, co pozwala dodać następny warunek. Technika ta działa dobrze do czasu dodania ostatniego słowa. $where_clause .= description LIKE $word OR ; Przed dołączeniem klauzuli WHERE do zapytania należy sprawdzić, czy nie jest ona pusta. } if (!empty($where_clause)) { $search_query .= WHERE $where_clause ; } Ten operator dodaje łańcuch znaków na końcu innego łańcucha. Zapisz zapytanie SQL wygenerowane przez ten kod, kiedy Antoni wpisze w polu wyszukiwania tekst „pogromca byków matador”. Opisz, jakie problemy mogą się pojawić. SELECT * FROM riskyjobs .................................................................................................................................................................. WHERE description LIKE pogromca OR description LIKE byków OR .................................................................................................................................................................. description LIKE matador OR .................................................................................................................................................................. Na końcu zapytania znajduje się dodatkowe słowo OR, co spowoduje, że instrukcja nie zadziała! 544 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Funkcja implode() tworzy łańcuch znaków przy użyciu podłańcuchów Kod powinien umieszczać w klauzuli WHERE słowo OR między instrukcjami LIKE, ale nie po ostatniej z nich. Jak można to zrobić? Może dodamy warunek w pętli, który sprawdzi, czy kod doszedł do ostatniego elementu, co pozwoli pominąć słowo OR? To rozwiązanie zadziała, ale jest nieeleganckie. Dużo bardziej przejrzyste będzie wywołanie polecenia, które odwróci działanie funkcji explode(). Funkcja implode() przyjmuje tablicę łańcuchów i tworzy przy ich użyciu pojedynczy łańcuch znaków. To ogranicznik, który funkcja wstawi między podłańcuchy przy ich scalaniu. $where_clause = implode( OR , $where_list); Funkcja implode() zwraca pojedynczy łańcuch znaków. Tu trzeba podać tablicę łańcuchów znaków, które chcemy scalić. Jak pomoże to w rozwiązaniu problemu nadmiarowego słowa OR w zapytaniu? W funkcji implode() można określić ogranicznik, który znajdzie się między scalanymi łańcuchami. Jeśli jako separatora użyjemy sekwencji ‘ OR ‘, utworzymy klauzulę WHERE, w której słowo OR znajdzie się tylko pomiędzy klauzulami LIKE. Zaostrz ołówek Zmodyfikuj kod PHP, który generuje zapytanie SELECT w aplikacji Ryzykowne prace. Użyj funkcji implode(), aby rozwiązać problem nadmiarowego słowa OR. ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... jesteś tutaj (cid:23) 545 Zaostrz ołówek — rozwiązanie Zaostrz ołówek: Rozwiązanie Zmodyfikuj kod PHP, który generuje zapytanie SELECT w aplikacji Ryzykowne prace. Użyj funkcji implode(), aby rozwiązać problem nadmiarowego słowa OR. $search_query = SELECT * FROM riskyjobs ; ............................................................................................................................................... $where_list = array(); ............................................................................................................................................... $user_search = $_GET[ usersearch ]; ............................................................................................................................................... Ponieważ funkcja implode() przyjmuje tablicę scalanych łańcuchów, trzeba utworzyć tablicę klauzul LIKE. $search_words = explode( , $user_search); ............................................................................................................................................... foreach ($search_words as $word) { ............................................................................................................................................... Operator [] w tym kontekście działa tak samo jak funkcja array_push() — dodaje nowy ............................................................................................................................................... element na końcu tablicy. ............................................................................................................................................... $where_list[] = description LIKE $word ; } $where_clause = implode( OR , $where_list); ............................................................................................................................................... Jako ogranicznik należy przekazać ............................................................................................................................................... do funkcji implode() słowo „OR” z odstępami po obu stronach. ............................................................................................................................................... ............................................................................................................................................... $search_query .= WHERE $where_clause ; if (!empty($where_clause)) { } ............................................................................................................................................... r o d a t a m E K I L n o i t p i r c s e d R O w ó k y b E K I L n o i t p i r c s e d R O a c m o r g o p E K I L n o i t p i r c s e d Efekt scalania to kilka klauzul LIKE połączonych słowami OR. Aby użyć funkcji implode(), najpierw tworzymy tablicę $where_list z klauzulami LIKE. a c m o r g o p E K I L n o i t p i r c s e d w ó k y b E K I L n o i t p i r c s e d r o d a t a m E K I L n o i t p i r c s e d implode() $where_list 546 Rozdział 9. $where_clause Funkcje niestandardowe i do obsługi łańcuchów znaków Jazda próbna Wypróbuj formularz wyszukiwania w aplikacji Ryzykowne prace. Pobierz kod aplikacji Ryzykowne prace z FTP wydawnictwa Helion (ftp://ftp.helion.pl/ przyklady/hfphms.zip). Skrypt search.php zawiera kod do generowania zapytania, który wcześniej omówiliśmy, i służy do przetwarzania danych wpisanych w formularzu na stronie search.html. Prześlij wspomniany skrypt i inne pliki aplikacji Ryzykowne prace na serwer WWW, a następnie otwórz w przeglądarce formularz wyszukiwania (strona search.html). Wpisz kilka różnych wyrażeń, aby zobaczyć, jak sprawuje się kod do generowania zapytań. Koniecznie wpisz zapytanie Antoniego „pogromca byków matador”. Jest to dobry test dla nowego kodu, w którym użyliśmy funkcji implode(). Tyle prac do wyboru! Nie chcę zostać strażakiem ani naprawiać elektrycznych byków, ale myślę, że kiedyś uda mi się znaleźć w serwisie wymarzoną pracę. Antoni nie znalazł od razu swej wymarzonej ryzykownej pracy, ale widoczne są wyraźne postępy w działaniu skryptu wyszukiwania, który sprawdza teraz poszczególne słowa. jesteś tutaj (cid:23) 547 Czy można usprawnić wyszukiwanie? Jestem linoskoczkiem. Odwiedziłam wasz serwis i nie znalazłam żadnych ofert pracy, choć wpisałam poprawne słowa. Sandra jest linoskoczkiem, ale formularz wyszukiwania w aplikacji Ryzykowne prace nie pozwolił jej znaleźć odpowiednich ofert. Szukane słowa wyraźnie określają, że Sandra szuka pracy linoskoczka w cyrku, jednak wyniki nie zawierają odpowiednich propozycji. Czy problem stanowią szukane słowa, czy może naprawdę nie ma pracy dla linoskoczków? 548 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Zaostrz ołówek Zapisz zapytanie SQL wygenerowane po wpisaniu przez Sandrę tekstu „chodzenie, lina, cyrk” w polu wyszukiwania. Wyjaśnij, z czego może wynikać problem. ......................................................................................................................................................................................... ......................................................................................................................................................................................... ......................................................................................................................................................................................... jesteś tutaj (cid:23) 549 Wstępne przetwarzanie szukanego tekstu Zaostrz ołówek: Rozwiązanie Zapisz zapytanie SQL wygenerowane po wpisaniu przez Sandrę tekstu „chodzenie, lina, cyrk” w polu wyszukiwania. Wyjaśnij, z czego może wynikać problem. SELECT * FROM riskyjobs ......................................................................................................................................................................................... WHERE description LIKE chodzenie, OR description LIKE lina, OR ......................................................................................................................................................................................... description LIKE cyrk ......................................................................................................................................................................................... Funkcja explode() używa odstępów jako ograniczników, ale nie modyfikuje przecinków. k r y c , a n i l , e i n e z d o h c Przecinki są traktowane jak części szukanych słów, a nie jako separatory. explode() , e i n e z d o h c , a n i l k r y c Jedyne szukane słowo, które zapytanie potrafi dopasować, to „cyrk”. Skrypt nie dołączył do tego wyrazu zbędnego przecinka. $search_words Nie widzę, w czym tkwi problem. Wystarczy dwukrotnie wywołać funkcję explode() — najpierw aby usunąć odstępy, a następnie w celu pozbycia się przecinków. Funkcja explode() pozwala podzielić pojedynczy łańcuch na podłańcuchy, jednak tu już wcześniej je utworzyliśmy. Pierwsze wywołanie funkcji explode() tworzy zbiór łańcuchów znaków zapisany w tablicy, dlatego nie mamy pojedynczego łańcucha, który można podzielić. Próba rozbicia na fragmenty każdego łańcucha z tablicy prawdopodobnie spowoduje dalsze problemy. Zamiast próbować rozwiązać problem ograniczników za pomocą kilku wywołań funkcji explode(), należy wstępnie przetworzyć szukany łańcuch znaków, aby przed uruchomieniem tej funkcji zawierał tylko jeden separator. Wtedy można ją wywołać, aby zrobiła to, co potrafi najlepiej — podzieliła łańcuch przy użyciu jednego ogranicznika. 550 Rozdział 9. Funkcje niestandardowe i do obsługi łańcuchów znaków Wstępne przetwarzanie szukanego łańcucha znaków
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Head First PHP & MySQL. Edycja polska
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ą: