Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00176 008388 10461163 na godz. na dobę w sumie
PHP i MySQL. Od nowicjusza do wojownika ninja - książka
PHP i MySQL. Od nowicjusza do wojownika ninja - książka
Autor: Liczba stron: 400
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-7110-6 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> inne
Porównaj ceny (książka, ebook, audiobook).

Najlepszy przewodnik dla odkrywców PHP!

Język PHP wciąż zyskuje na popularności. Kolejne wersje, ciągłe ulepszenia sprawiają, że w niektórych obszarach zaczyna on rywalizować z weteranami na rynku języków programowania. Ten trend widać również w ofertach pracy. Programiści biegle znający PHP są wręcz rozchwytywani na rynku! Warto dołączyć do tego grona. Jeśli chcesz tworzyć zaawansowane aplikacje i poznać PHP na wylot, trafiłeś na wymarzoną książkę!

Dzięki niej już wkrótce staniesz się prawdziwym ninją programowania w PHP. Przeprowadzi Cię ona przez wszystkie etapy poznawania języka: skonfigurujesz serwer WWW i MySQL oraz PHP. Następnie zaprojektujesz swoją pierwszą bazę i podłączysz się do niej, żeby zapisać i pobrać dane. W kolejnych rozdziałach przekonasz się, jak wyrażenia regularne mogą Ci pomóc w codziennej pracy, dlaczego należy korzystać z sesji oraz co możesz zapisać w 'ciasteczkach'. 'PHP i MySQL. Od nowicjusza do wojownika ninja' jest genialnym przewodnikiem po PHP i MySQL. Pozwoli Ci przeobrazić się z laika w profesjonalistę. Zainwestuj w tę wiedzę!

Błyskawicznie opanuj:

Zainwestuj w nową wiedzę o języku PHP!

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

Darmowy fragment publikacji:

Tytuł oryginału: PHP MySQL: Novice to Ninja Tłumaczenie: Paweł Koronkiewicz (wstęp, rozdz. 1 - 9), Tomasz Walczak (rozdz. 10 - 12, dodatki) ISBN: 978-83-246-7110-6 © 2013 Helion S.A. Authorized Polish translation of the English edition of PHP MySQL: Novice to Ninja, 5th Edition ISBN 9780987153081 © 2012 SitePoint Pty. Ltd. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Wydawnictwo HELION dołożyło wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie bierze jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo HELION nie ponosi również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/phmnow.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/phmnow Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci Rozdzia(cid:239) 1. O autorze ................................................................................................................11 O firmie SitePoint .....................................................................................................11 Wst(cid:218)p .....................................................................................................................13 Dla kogo jest ta ksi(cid:200)(cid:285)ka ...........................................................................................14 Uk(cid:239)ad ksi(cid:200)(cid:285)ki ...........................................................................................................14 Gdzie znajdziesz pomoc ...........................................................................................17 Konwencje stosowane w tej ksi(cid:200)(cid:285)ce ........................................................................18 Instalacja ....................................................................... 21 Twój w(cid:239)asny serwer WWW ......................................................................................22 Instalacja w systemie Windows ...............................................................................23 Ustawianie has(cid:239)a konta root w MySQL przy u(cid:285)yciu XAMPP ................................29 Instalacja w systemie Mac OS X ...............................................................................30 Ustawianie has(cid:239)a konta root serwera MySQL MAMP ..........................................35 Instalacja w systemie Linux .....................................................................................37 Niezb(cid:218)dne informacje z firmy hostingowej ..............................................................37 Twój pierwszy skrypt PHP ........................................................................................38 Wszystko gotowe, pierwszy skrypt za Tob(cid:200)! ............................................................41 Rozdzia(cid:239) 2. MySQL ........................................................................... 43 Bazy danych — podstawy .......................................................................................43 Uruchamianie kwerend MySQL z poziomu phpMyAdmin .........................................45 J(cid:218)zyk SQL ................................................................................................................50 Zak(cid:239)adanie nowej bazy danych ................................................................................51 Tworzenie tabeli ......................................................................................................52 Wprowadzanie danych ............................................................................................55 Wy(cid:258)wietlanie przechowywanych danych .................................................................56 Modyfikowanie przechowywanych danych ..............................................................58 Usuwanie danych ....................................................................................................59 Niech PHP oszcz(cid:218)dzi Ci pisania ................................................................................59 Rozdzia(cid:239) 3. PHP ................................................................................ 61 Sk(cid:239)adnia i podstawowe instrukcje ............................................................................63 Zmienne, operatory i komentarze ............................................................................64 Tablice ....................................................................................................................66 Formularze i interakcje z u(cid:285)ytkownikiem ..................................................................67 Przesy(cid:239)anie zmiennych w URL ............................................................................67 Przesy(cid:239)anie zmiennych w formularzu ..................................................................73 Poleć książkęKup książkę 6 PHP i MySQL. Od nowicjusza do wojownika ninja Struktury steruj(cid:200)ce ...................................................................................................76 Kod na wy(cid:285)szym poziomie .......................................................................................84 Ukrywanie informacji o budowie witryny ...........................................................84 Szablony PHP .....................................................................................................85 Wiele szablonów, jeden kontroler ......................................................................87 Czas na baz(cid:218) danych ...............................................................................................90 Rozdzia(cid:239) 4. Dane MySQL w witrynie WWW ..................................... 91 Wprowadzenie ........................................................................................................91 Tworzenie konta u(cid:285)ytkownika MySQL ......................................................................92 Dost(cid:218)p do bazy MySQL z poziomu PHP ....................................................................95 Krótki kurs programowania obiektowego ..........................................................98 Konfigurowanie po(cid:239)(cid:200)czenia ..............................................................................100 Przesy(cid:239)anie kwerend SQL .......................................................................................104 Zbiory wyników zapyta(cid:241) SELECT ............................................................................106 Wstawianie danych do bazy ..................................................................................111 Usuwanie danych z bazy .......................................................................................119 G(cid:239)ówny cel zosta(cid:239) osi(cid:200)gni(cid:218)ty! ................................................................................125 Rozdzia(cid:239) 5. Projektowanie relacyjnej bazy danych ........................127 Informacje o wpisuj(cid:200)cych dane ..............................................................................127 Podstawowa zasada — ka(cid:285)dy typ obiektu w innej tabeli ......................................129 Instrukcja SELECT i wiele tabel ...............................................................................132 Podstawowe typy relacji ........................................................................................136 Relacje wiele-do-wielu ..........................................................................................138 Jeden za wielu, wielu za jednego ..........................................................................140 Rozdzia(cid:239) 6. Struktura kodu PHP .....................................................141 W(cid:239)(cid:200)czanie plików do kodu — instrukcja include ....................................................142 W(cid:239)(cid:200)czanie kodu HTML .....................................................................................142 W(cid:239)(cid:200)czanie kodu PHP ........................................................................................143 Odmiany instrukcji include ...............................................................................147 Wspó(cid:239)u(cid:285)ytkowanie plików include ...................................................................148 W(cid:239)asne funkcje i biblioteki funkcji ..........................................................................151 Zakres zmiennych i globalno(cid:258)(cid:202) dost(cid:218)pu ...........................................................153 Struktura kodu w praktyce — funkcje pomocnicze szablonów ...............................156 W(cid:239)a(cid:258)ciwa praktyka ................................................................................................159 Rozdzia(cid:239) 7. System zarz(cid:200)dzania tre(cid:258)ci(cid:200) (CMS) ...............................161 Strona g(cid:239)ówna .......................................................................................................162 Zarz(cid:200)dzanie autorami ............................................................................................164 Usuwanie autorów ..........................................................................................167 Dodawanie i zmienianie informacji o autorach .................................................171 Poleć książkęKup książkę SPIS TRE(cid:165)CI 7 Zarz(cid:200)dzanie kategoriami ........................................................................................175 Zarz(cid:200)dzanie dowcipami .........................................................................................180 Wyszukiwanie dowcipów ................................................................................181 Dodawanie i zmienianie dowcipów .................................................................187 Usuwanie dowcipów .......................................................................................197 Podsumowanie ......................................................................................................198 Rozdzia(cid:239) 8. Formatowanie tre(cid:258)ci przy u(cid:285)yciu wyra(cid:285)e(cid:241) regularnych ................................199 Wyra(cid:285)enia regularne .............................................................................................200 Zast(cid:218)powanie ci(cid:200)gów znakowych .........................................................................206 Wyró(cid:285)niony tekst .............................................................................................206 Akapity ............................................................................................................210 Hiper(cid:239)(cid:200)cza ........................................................................................................212 Ca(cid:239)o(cid:258)(cid:202) kodu .....................................................................................................214 Praca z tekstem przesy(cid:239)anym do witryny ................................................................217 Rozdzia(cid:239) 9. Pliki cookie, sesje i kontrola dost(cid:218)pu ..........................219 Cookies, czyli „ciasteczka” .....................................................................................219 Sesje PHP ..............................................................................................................223 Prosty kod koszyka ..........................................................................................225 Kontrola dost(cid:218)pu ...................................................................................................232 Projekt bazy danych .........................................................................................233 Kod kontrolera .................................................................................................236 Biblioteka funkcji .............................................................................................241 Zarz(cid:200)dzanie has(cid:239)ami i rolami ............................................................................248 Wyzwanie dla Ciebie — moderacja dowcipów ................................................256 Wszystko przed Tob(cid:200)! ...........................................................................................258 Rozdzia(cid:239) 10. Zarz(cid:200)dzanie bazami MySQL ........................................261 Archiwizowanie baz danych MySQL .......................................................................262 Archiwizowanie baz danych za pomoc(cid:200) narz(cid:218)dzia phpMyAdmin .....................263 Archiwizowanie baz danych za pomoc(cid:200) narz(cid:218)dzia mysqldump ........................263 Tworzenie przyrostowych kopii zapasowych z wykorzystaniem logów binarnych ...........................................................................................265 Wskazówki dotycz(cid:200)ce kontroli dost(cid:218)pu w MySQL ..................................................267 Kwestie zwi(cid:200)zane z nazw(cid:200) hosta .....................................................................268 Straci(cid:239)e(cid:258) dost(cid:218)p? ..............................................................................................270 Indeksy ..................................................................................................................271 Indeksy wielokolumnowe ................................................................................274 Klucze obce ...........................................................................................................275 Lepiej si(cid:218) zabezpieczy(cid:202), ni(cid:285) pó(cid:283)niej (cid:285)a(cid:239)owa(cid:202) ..........................................................277 Poleć książkęKup książkę 8 PHP i MySQL. Od nowicjusza do wojownika ninja Rozdzia(cid:239) 11. Zaawansowane kwerendy j(cid:218)zyka SQL ........................279 Sortowanie wyników zwracanych przez kwerendy SELECT .....................................279 Dodawanie klauzuli LIMIT .....................................................................................281 Transakcje w bazach danych .................................................................................282 Aliasy nazw kolumn i tabel ....................................................................................283 Grupowanie wyników kwerend SELECT .................................................................286 Z(cid:239)(cid:200)czenia lewostronne ...........................................................................................288 Ograniczanie listy wyników za pomoc(cid:200) klauzuli HAVING .......................................290 Dalsza lektura ........................................................................................................291 Rozdzia(cid:239) 12. Dane binarne ...............................................................293 Cz(cid:218)(cid:258)ciowo dynamiczne strony ...............................................................................293 Obs(cid:239)uga przesy(cid:239)ania plików ...................................................................................298 Nadawanie niepowtarzalnych nazw plików .....................................................300 Zapisywanie przes(cid:239)anych plików w bazie danych ...................................................302 Typy kolumn na dane binarne ..........................................................................303 Zapisywanie plików .........................................................................................304 Wy(cid:258)wietlanie zapisanych plików ......................................................................306 (cid:146)(cid:200)czenie wszystkich elementów .............................................................................309 Zagadnienia zwi(cid:200)zane z du(cid:285)ymi plikami ................................................................315 Wielko(cid:258)(cid:202) pakietów MySQL ...............................................................................315 Ograniczenie ilo(cid:258)ci pami(cid:218)ci w PHP ...................................................................315 Limit czasu wykonywania skryptu PHP .............................................................316 Koniec ...................................................................................................................316 Dodatek A R(cid:218)czna instalacja .........................................................319 Windows ...............................................................................................................319 Instalowanie MySQL ........................................................................................319 Instalowanie PHP .............................................................................................321 OS X ......................................................................................................................327 Instalowanie MySQL ........................................................................................327 Instalowanie PHP .............................................................................................330 Linux .....................................................................................................................333 Instalowanie MySQL ........................................................................................334 Instalowanie PHP .............................................................................................337 Dodatek B Przegl(cid:200)d sk(cid:239)adni MySQL ..............................................343 Instrukcje SQL zaimplementowane w MySQL .........................................................343 ALTER TABLE ...................................................................................................343 ANALYZE TABLE ...............................................................................................346 BEGIN ..............................................................................................................346 COMMIT ..........................................................................................................346 Poleć książkęKup książkę SPIS TRE(cid:165)CI 9 CREATE DATABASE ..........................................................................................347 CREATE INDEX .................................................................................................347 CREATE TABLE .................................................................................................347 DELETE ............................................................................................................349 DESCRIBE i DESC ..............................................................................................350 DROP DATABASE .............................................................................................350 DROP INDEX ....................................................................................................350 DROP TABLE ....................................................................................................350 EXPLAIN ..........................................................................................................350 GRANT .............................................................................................................351 INSERT .............................................................................................................351 LOAD DATA INFILE ...........................................................................................352 OPTIMIZE TABLE ..............................................................................................353 RENAME TABLE ...............................................................................................353 REPLACE ..........................................................................................................354 REVOKE ...........................................................................................................354 ROLLBACK .......................................................................................................354 SELECT .............................................................................................................355 SET ..................................................................................................................360 SHOW ..............................................................................................................360 START TRANSACTION ......................................................................................361 TRUNCATE .......................................................................................................361 UPDATE ...........................................................................................................362 USE ..................................................................................................................362 Dodatek C Funkcje MySQL ............................................................363 Funkcje do sterowania przebiegiem programu .......................................................363 Funkcje matematyczne ..........................................................................................364 Funkcje dla (cid:239)a(cid:241)cuchów znaków .............................................................................366 Funkcje dotycz(cid:200)ce dat i czasu ................................................................................370 Ró(cid:285)ne funkcje ........................................................................................................375 Funkcje u(cid:285)ywane w klauzuli GROUP BY .................................................................377 Dodatek D Typy kolumn w MySQL ................................................379 Typy liczbowe ........................................................................................................380 Typy znakowe .......................................................................................................383 Typy zwi(cid:200)zane z dat(cid:200) i czasem ..............................................................................387 Skorowidz ....................................................................389 Poleć książkęKup książkę 10 PHP i MySQL. Od nowicjusza do wojownika ninja Poleć książkęKup książkę Rozdzia(cid:239) System zarz(cid:200)dzania tre(cid:258)ci(cid:200) (CMS) Tym, co odróżnia stronę WWW przeznaczoną do wyświetlania informacji z bazy danych od witryny, której funkcjonowanie w całości opiera się na informacjach z serwera bazy (ang. database-driven website), jest system zarządzania treścią (ang. content management system, CMS). System taki przyjmuje postać zbioru stron dostępnych jedynie użytkownikom uprawnionym do wprowadzania zmian. Jest on interfejsem administracyjnym bazy danych, który pozwala przeglądać i zmieniać przechowywane informacje bez konieczności operowania instrukcjami SQL. Początki systemu CMS zbudowaliśmy w końcowej części rozdziału 4., kiedy dodaliśmy formularze pozwalające dodawać i usuwać dowcipy oraz przycisk Usuń. Choć są to mechanizmy niewątpliwie ciekawe, nie powinny one raczej znaleźć się na stronie wyświetlanej wszystkim gościom witryny. Wskazane byłoby pewne zabezpieczenie przed obraźliwymi treściami, a już na pewno przed swo- bodnym usuwaniem zawartości bazy. Przesunięcie takich mechanizmów do wydzielonej grupy stron administracyjnych, do których dostęp jest wyraźnie ograniczony, pozwala zmniejszyć ryzyko ujawnienia danych poufnych. Jest to zarazem znaczne ułatwienie przy zarządzaniu treścią — nie trzeba uciekać się do samodzielnego pisania kwerend SQL. W tym rozdziale rozszerzymy możliwości systemu zarządzającego bazą dow- cipów o obsługę elementów wprowadzonych do bazy w rozdziale 5. Mówiąc prościej, dodamy mechanizm pozwalający administratorowi witryny zarządzać autorami i kategoriami oraz przypi- sywać je do dowcipów. Strony administracyjne zawsze chroni pewnego rodzaju system kontroli dostępu. Jedną z możliwości implementacji takiego systemu jest skonfigurowanie serwera WWW w taki sposób, by chronił odpowiednie pliki PHP, wymagając podania nazwy użytkownika i hasła. Na serwerach Apache służą do tego pliki .htaccess przechowujące listy autoryzowanych użytkowników. Poleć książkęKup książkę 162 PHP i MySQL. Od nowicjusza do wojownika ninja Inną metodą ochrony stron administracyjnych jest wykorzystanie możliwości samego PHP. Jest to rozwiązanie bardziej elastyczne i prowadzące do bardziej eleganckiego rezultatu. Wymaga ono jednak nieco więcej pracy. Opiszę je w rozdziale 9. Na razie skoncentrujmy się na przygotowaniu stron systemu zarządzania treścią. Strona g(cid:239)ówna Pod koniec rozdziału 5. baza danych zawierała tabele dla obiektów trzech typów: dowcipów, autorów i kategorii dowcipów. Jej konstrukcję ilustruje rysunek 7.1. Zwróć uwagę, że pozostajemy przy początkowym założeniu, że każdy autor ma tylko jeden adres e-mail. Rysunek 7.1. Struktura bazy ijdb przewiduje trzy rodzaje obiektów Jeżeli musisz odtworzyć strukturę i podstawowe dane tabel od podstaw, możesz skorzystać z poniż- szej sekwencji kwerend SQL: Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 163 kod w pliku chapter7/sql/ijdb.sql CREATE TABLE joke ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joketext TEXT, jokedate DATE NOT NULL, authorid INT ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB; CREATE TABLE author ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), email VARCHAR(255) ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB; CREATE TABLE category ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB; CREATE TABLE jokecategory ( jokeid INT NOT NULL, categoryid INT NOT NULL, PRIMARY KEY (jokeid, categoryid) ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB; # Przykładowe dane # Określamy id , aby było zgodne w odwołaniach z innych tabel INSERT INTO author (id, name, email) VALUES (1, Kevin Yank , thatguy@kevinyank.com ), (2, Jan Kowalski , jan@przyklad.com ); INSERT INTO joke (id, joketext, jokedate, authorid) VALUES (1, Dlaczego kura przesz(cid:239)a przez szos(cid:218)? (cid:191)eby dosta(cid:202) si(cid:218) na drug(cid:200) stron(cid:218). , 2012-04-01 , 1), (2, Ile zajmuje Windows 7? Ile znajdzie, tyle zajmie... , 2012-04-01 , 1), (3, Kupi(cid:239)em synowi kamer(cid:218) internetow(cid:200). Jedn(cid:200) stron(cid:218) pokoju ma teraz posprz(cid:200)tan(cid:200)... , 2012-04-01 , 2), (4, Ilu wegan potrzeba, (cid:285)eby zmieni(cid:202) (cid:285)arówk(cid:218)? Dwóch. Jeden wkr(cid:218)ca, drugi czyta sk(cid:239)ad. , 2012-04-01 , 2); INSERT INTO category (id, name) VALUES (1, Przechodzenie przez szos(cid:218) ), (2, (cid:191)arówki ), (3, Rodzinne ), (4, Wegetarianie ), (5, Komputerowe ); INSERT INTO jokecategory (jokeid, categoryid) VALUES (1, 1), (2, 5), (3, 4), (4, 3), (4, 5), (3, 2); Strona główna systemu zarządzania treścią będzie zawierać łącza do stron, które pozwalają zarządzać każdym z trzech rodzajów obiektów. Poniższy HTML generuje stronę widoczną na rysunku 7.2. Poleć książkęKup książkę 164 PHP i MySQL. Od nowicjusza do wojownika ninja Rysunek 7.2. Strona g(cid:239)ówna systemu CMS zawiera trzy (cid:239)(cid:200)cza kod w pliku chapter7/admin/index.html !DOCTYPE html html lang= pl head meta charset= utf-8 title System CMS Bazy Dowcipów /title /head body h1 System Zarz(cid:200)dzania Dowcipami /h1 ul li a href= jokes/ Zarz(cid:200)dzanie dowcipami /a /li li a href= authors/ Zarz(cid:200)dzanie autorami /a /li li a href= categories/ Zarz(cid:200)dzanie kategoriami dowcipów /a /li /ul /body /html Każde z tych łączy kieruje do innego podkatalogu: jokes, authors lub categories. Każdy z tych pod- katalogów będzie zawierał skrypt kontrolera oraz wymagane przezeń szablony — strony służące do zarządzania obiektami bazy. Zarz(cid:200)dzanie autorami Rozpocznijmy od kodu, który zapewni możliwości dodawania i usuwania wpisów autorów oraz, dodatkowo, modyfikowania ich. Całość tego kodu będzie przechowywana w podkatalogu authors. Podstawową informacją, którą powinniśmy wyświetlić administratorowi, aby mógł zarządzać auto- rami, powinna być lista zapisanych w bazie autorów. Potrzebny do tego kod nie różni się istotnie od używanego do wyświetlania listy zapisanych dowcipów. Ponieważ zamierzamy zapewnić możliwość usuwania i modyfikowania wpisów w tabeli autorów, dodamy odpowiednie przyciski. Podobnie jak dodany w rozdziale 4. przycisk Usuń, będą wysyłać identyfikator autora, co zapewni kontrolerowi informację o tym, na którym wierszu tabeli wykonać operację. Przycisk dodawania nowego wpisu będzie nosił nazwę Dodaj nowego autora. Wyświetlany przezeń formularz będzie podobny do wyświetlanego przy dodawaniu dowcipów w rozdziale 4. Poleć książkęKup książkę Oto kod kontrolera: kod w pliku chapter7/admin/authors/index.php (fragment) SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 165 // Wyświetlanie listy autorów include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $result = $pdo- query( SELECT id, name FROM author ); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d bazy danych w trakcie pobierania listy autorów! ; include error.html.php ; exit(); } foreach ($result as $row) { $authors[] = array( id = $row[ id ], name = $row[ name ]); } include authors.html.php ; Działanie tego kodu powinno być już dla Ciebie oczywiste. Zwróć uwagę, że do nawiązywania połączenia z bazą danych wykorzystywany jest współużytkowany plik db.inc.php przechowywany w katalogu includes serwera WWW. Kontroler wykorzystuje do wyświetlania listy autorów następujący szablon: kod w pliku chapter7/admin/authors/authors.html.php ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/helpers.inc.php ; ? !DOCTYPE html html lang= pl head meta charset= utf-8 title Zarz(cid:200)dzanie autorami /title /head body h1 Zarz(cid:200)dzanie autorami /h1 p a href= ?add Dodaj nowego autora /a /p ul ?php foreach ($authors as $author): ? li form action= method= post div ?php htmlout($author[ name ]); ? input type= hidden name= id value= ?php echo $author[ id ]; ? input type= submit name= action value= Edycja input type= submit name= action value= Usu(cid:241) /div Poleć książkęKup książkę 166 PHP i MySQL. Od nowicjusza do wojownika ninja /form /li ?php endforeach; ? /ul p a href= .. Powrót do strony g(cid:239)ównej CMS /a /p /body /html Również ten kod powinien wyglądać znajomo. Zwróćmy uwagę na kilka ważniejszych miejsc: Szablon korzysta ze współużytkowanego pliku, który przygotowaliśmy wcześniej w roz- dziale 6. Ułatwia to wypisywanie na stronie wartości wymagających wywołania htmlspe (cid:180)cialchars. Łącze wysyłające do kontrolera ciąg kwerendy URL ?add. Służy on jako informacja o tym, że użytkownik zamierza dodać nowego autora. Pusty atrybut action. Po wysłaniu formularz staje się przekazywanym kontrolerowi żądaniem zmiany lub usunięcia danych autora. W rozdziale 4. wykorzystywaliśmy ciąg ?deletejoke w atrybucie action, wskazując w ten sposób zamiar usunięcia wpisu. Ponieważ użytkownik ma teraz możliwość wykonywania dwóch operacji, użyjemy innej metody, aby poznać dokonany wybór. Używamy funkcji htmlout z pliku helpers.inc.php, aby bezpiecznie wypisać imię i nazwisko autora. Ten formularz ma dwa przyciski wysyłania: jeden do edycji i jeden do usuwania autora. Opisujemy je jednakowym atrybutem name (o brzmieniu action). Umożliwi to kontrolerowi ustalenie, który przycisk został kliknięty, poprzez sprawdzenie powiązanej z tą nazwą war- tości ($_POST[ action ]). Rysunek 7.3 przedstawia generowaną z użyciem tego szablonu listę autorów. Rysunek 7.3. Zarz(cid:200)dzanie informacjami o autorach rozpoczyna si(cid:218) od wy(cid:258)wietlenia g(cid:239)ównej strony interfejsu Zarz(cid:200)dzanie autorami Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 167 Usuwanie autorów Gdy użytkownik kliknie jeden z przycisków Delete, nasz kontroler powinien usuwać odpowiada- jącego mu autora z bazy danych. Do wybierania autora do usunięcia służy przesyłana wraz z for- mularzem wartość id. Jak widzieliśmy wcześniej, sama operacja usuwania jest niezwykle prosta. Jednak w tym przypadku należy liczyć się z pewnym utrudnieniem — tabela joke ma kolumnę authorid, która wskazuje autora odpowiedzialnego za wpisanie dowcipu do bazy. Po usunięciu wpisu autora musimy usunąć odwołania do niego z innych tabel. Jeżeli tego zaniedbamy, baza zawierać będzie dowcipy przypisane nieistniejącym już autorom. Mamy do wyboru trzy możliwości: (cid:132) Uniemożliwić użytkownikom usuwanie autorów powiązanych z przechowywanymi w bazie dowcipami. (cid:132) Usuwać dowcipy autora jednocześnie z usuwaniem jego wpisu w bazie. (cid:132) Zmieniać wartość kolumny authorid dowcipów usuwanego autora na NULL, sygnalizując w ten sposób brak autora wpisu. Podejmując tego rodzaju działania ukierunkowane na zachowanie poprawnego układu relacji w bazie, chronimy tak zwaną spójność odwołań lub integralność odwołań bazy (ang. referential integrity). MySQL, podobnie jak większość serwerów baz danych, posiada mechanizm ograniczenia typu „klucz obcy” (ang. foreign key constraint), który pozwala utrzymywać spójność odwołań automa- tycznie. Konfigurując takie ograniczenie, można nakazać serwerowi podejmowanie jednego z trzech wymienionych działań. Automatycznymi ograniczeniami tego rodzaju zajmiemy się w rozdziale 10. Nie będziemy ich tu stosować. Gdybyśmy tak zrobili, oznaczałoby to definiowanie części mechanizmów CMS w kodzie PHP, a części — w architekturze bazy danych. Podejście takie prowadziłoby do sytuacji, w której przy jakiejkolwiek zmianie zasad usuwania autorów (na przykład wprowadzaniu reguły, że nie można usunąć autora, dopóki baza zawiera jego dowcipy) konieczne byłoby pamiętanie o wprowa- dzaniu korekt w dwóch miejscach. Zachowamy więc całą logikę operacji usuwania w kodzie PHP — ułatwi to pracę z kodem każdemu, kto będzie miał z nim do czynienia w przyszłości (łącznie z Tobą samym!). Ponieważ większość autorów życzy sobie uznania ich wkładu przy każdym wyświetlanym dowcipie, decydujemy się na wybór opcji drugiej: usuwania wszystkich powiązanych dowcipów wraz z auto- rem. Zaoszczędzi to między innymi problemu obsługi dowcipów z wartością NULL w kolumnie authorid podczas wyświetlania zawartości bazy. Ponieważ posuwamy się do usuwania dowcipów, pojawia się kolejna komplikacja. Dowcipy są przypisywane do kategorii, a informacje o przypisaniach przechowuje tabela jokecategory. Usu- nięciu dowcipu musi więc towarzyszyć usunięcie powiązanych z nim wpisów w tabeli łączącej. Poleć książkęKup książkę 168 PHP i MySQL. Od nowicjusza do wojownika ninja Ogólnie rzecz biorąc, prosta z pozoru operacja usuwania autora rozrasta się do trzech niezbędnych czynności: usunięcia autora, usunięcia jego dowcipów i usunięcia przypisań tych dowcipów do kategorii. Jak można oczekiwać, wymagany kod jest dość długi. Spróbuj prześledzić jego elementy i samo- dzielnie odtworzyć w wyobraźni jego działanie: kod w pliku chapter7/admin/authors/index.php (fragment) if (isset($_POST[ action ]) and $_POST[ action ] == Usu(cid:241) ) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; // Pobierz dowcipy autora try { $sql = SELECT id FROM joke WHERE authorid = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy pobieraniu listy dowcipów do usuni(cid:218)cia. ; include error.html.php ; exit(); } $result = $s- fetchAll(); // Usuń przypisania dowcipów do kategorii try { $sql = DELETE FROM jokecategory WHERE jokeid = :id ; $s = $pdo- prepare($sql); // Dla każdego dowcipu foreach ($result as $row) { $jokeId = $row[ id ]; $s- bindValue( :id , $jokeId); $s- execute(); } } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy usuwaniu wpisów kategorii dla dowcipu. ; include error.html.php ; exit(); } // Usuń dowcipy autora try { $sql = DELETE FROM joke WHERE authorid = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 169 $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy usuwaniu dowcipów autora. ; include error.html.php ; exit(); } // Usuń autora try { $sql = DELETE FROM author WHERE id = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = Error deleting author. ; include error.html.php ; exit(); } header( Location: . ); exit(); } Choć większość z tego kodu powinna wydawać Ci się znajoma, jest tu kilka nowych elementów (zostały one wyróżnione tłustym drukiem). Pierwszą nowością jest inicjująca dalsze działania instrukcja if: kod w pliku chapter7/admin/authors/index.php (fragment) if (isset($_POST[ action ]) and $_POST[ action ] == Usu(cid:241) ) Jak pisałem, użytkownik przekazuje żądanie usunięcia autora, klikając umieszczony przy jego nazwi- sku przycisk Usuń. Ponieważ atrybut name tego przycisku to action, możemy wykryć jego kliknięcie, sprawdzając, czy wartość $_POST[ action ] została ustawiona. Jeżeli tak, ustalamy, czy jest to wartość Usu(cid:241) . Następny nowy element to instrukcja: $result = $s- fetchAll(); kod w pliku chapter7/admin/authors/index.php (fragment) W tym miejscu skryptu wykonujemy kwerendę SELECT. Pobiera ona wszystkie dowcipy usuwanego autora. Dysponując nimi, będziemy mogli uruchomić sekwencję kwerend DELETE, po jednej dla każdego dowcipu autora, które usuną przypisania tego dowcipu do kategorii. Później wykorzystamy uzyskany zbiór wyników do usuwania samych dowcipów. Wymaga to jednak dodatkowych objaśnień. Poleć książkęKup książkę 170 PHP i MySQL. Od nowicjusza do wojownika ninja Gdy wcześniej wykonywaliśmy kwerendy SELECT, używaliśmy warunku w pętli while lub foreach do pobierania kolejnych wierszy wyników: while ($row = $result- fetch()) foreach ($result as $row) Gdy korzystamy z wyników kwerendy w taki sposób, PHP w istocie pobiera kolejny wiersz za każdym razem, gdy żąda tego pętla, po czym gdy rozpoczyna się przetwarzanie następnego, „zapo- mina” poprzednie dane. Ponieważ w pamięci nigdy nie jest przechowywana całość zbioru wyni- ków, pozwala to ekonomicznie wykorzystać zasoby serwera WWW. W większości sytuacji programista nie musi przejmować się tym, jak w rzeczywistości PHP pracuje z rekordami bazy danych. Jednak od czasu do czasu może pojawić się potrzeba przesłania do serwera MySQL kolejnej kwerendy, niezależnej od postępów pracy z przetwarzaniem wyników wcześniejszej. Z taką sytuacją mamy do czynienia tutaj: dopiero co wykonaliśmy kwerendę Zapisz pobierającą dowcipy określonego autora. W trakcie pracy z tą listą chcemy wykonać kwerendę DELETE dla każdego z nich. Jednak z punktu widzenia MySQL wciąż przetwarzamy wyniki kwerendy SELECT. Nie możemy po prostu przerwać tego i rozpocząć uruchamiania kwerend usuwających! Próba takiej operacji doprowadziłaby do zgłoszenia błędu. To właśnie miejsce dla metody fetchAll(). Użycie jej dla naszej przygotowanej instrukcji $s doprowadzi do pobrania całego zbioru wyników kwerendy i zapisania ich w tablicy PHP o nazwie $result: kod w pliku chapter7/admin/authors/index.php (fragment) $result = $s- fetchAll(); Możemy teraz przetwarzać tablicę w pętli foreach w podobny sposób jak wcześniej obiekt PDOStatement i pracować z każdym wierszem niezależnie. Różnica polega na tym, że teraz PHP dysponuje wszystkimi wynikami od razu, co pozwala przesłać do serwera MySQL kolejne kwerendy. To właśnie robi kolejny nowy fragment kodu: kod w pliku chapter7/admin/authors/index.php (fragment) // Usuń przypisania dowcipów do kategorii try { $sql = DELETE FROM jokecategory WHERE jokeid = :id ; $s = $pdo- prepare($sql); // Dla każdego dowcipu foreach ($result as $row) { $jokeId = $row[ id ]; $s- bindValue( :id , $jokeId); $s- execute(); } } Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 171 Kod ten zapewnia uruchomienie kwerendy DELETE usuwającej wpisy w tabeli jokecategory dla każ- dego z dowcipów w bazie danych. Zwróć uwagę, że nie rozpoczynamy pisania kodu od zdefinio- wania pętli foreach — najpierw przygotowujemy w bazie instrukcję SQL. Widzimy tu drugą istotną zaletę korzystania z przygotowanych instrukcji SQL (poznałeś je, czytając rozdział 4.)1. Po przygotowaniu instrukcji można korzystać z niej wiele razy, przypisując jedynie zmieniające się wartości. W tym przypadku potrzebujemy sekwencji niemal identycznych kwerend DELETE — jedyna różnica to identyfikator dowcipu w klauzuli WHERE. Użycie przygotowanej instrukcji oszczędza MySQL pracy z wielokrotną interpretacją polecenia i przygotowywaniem planu jej wyko- nania. Kod SQL zostaje odczytany i przeanalizowany raz. Prowadzi to do określenia planu jego wykonania. Plan ten jest realizowany dla kolejnych wartości id przekazywanych przez serwer WWW. Spójrz jeszcze raz na kod — po tych wyjaśnieniach powinien być bardziej zrozumiały. Najpierw przygotowywana jest instrukcja SQL. Następnie pętla foreach pracuje ze zbiorem wyników wcze- śniejszej kwerendy SELECT. Przygotowana instrukcja DELETE jest wywoływana jednokrotnie dla każdego dowcipu, po użyciu metody bindValue do przypisania symbolowi wieloznacznemu :id wartości identyfikatora. Nie czuj się zażenowany, jeżeli pełne zrozumienie działania tego kodu wymaga od Ciebie dłuższego namysłu. Jest to najbardziej złożony fragment PHP, który znajdziesz w tej książce! Gdy wiesz już dokładnie, jak działa nowy kod, przejdź do akcji i spróbuj naprawdę usunąć jednego z autorów. Użyj phpMyAdmin do weryfikacji zmian w tablicach dowcipów i przypisań do kategorii. Zdefiniowane kategorie powinny pozostać w bazie nawet, gdy nie są do nich przypisane żadne dowcipy. Potwierdzanie operacji usuwania Podejmij teraz prób(cid:218) samodzielnej pracy i rozbuduj now(cid:200) stron(cid:218) o (cid:285)(cid:200)danie potwierdzenia operacji usuwania. Jako punkt wyj(cid:258)cia mo(cid:285)esz wykorzysta(cid:202) wersj(cid:218) z archiwum kodu ksi(cid:200)(cid:285)ki. Zmodyfikuj kontroler tak, aby reago- wa(cid:239) na klikni(cid:218)cie przycisku Usu(cid:241) wy(cid:258)wietleniem kolejnego szablonu, tym razem z pro(cid:258)b(cid:200) o potwierdzenie zamiaru wykonania operacji. Gdy u(cid:285)ytkownik prze(cid:258)le ten formularz, powinno to spowodowa(cid:202) wywo(cid:239)anie kodu kontrolera, który faktycznie usuwa dane. Zwró(cid:202) uwag(cid:218), (cid:285)e nowy formularz musi przesy(cid:239)a(cid:202) ukryte pole z identyfikatorem autora do usuni(cid:218)cia. Dodawanie i zmienianie informacji o autorach Implementacja łącza Dodaj nowego autora na początku strony może opierać się na kodzie obsłu- gującym łącze Dodaj nowy dowcip z rozdziału 4. Zamiast żądać od użytkownika podania tekstu dowcipu, tym razem formularz powinien zawierać pola do wpisania imienia i nazwiska oraz adresu e-mail. 1 Dla przypomnienia, pierwszą znaczącą zaletą przygotowanych instrukcji jest możliwość korzystania z sym- boli wieloznacznych, którym następnie przypisywana jest wartość. Pozwala to przypisywać wartości wyko- rzystywane w instrukcjach bazy danych bez obaw o „wstrzyknięty” SQL. Poleć książkęKup książkę 172 PHP i MySQL. Od nowicjusza do wojownika ninja Jednak strona zarządzania autorami zawiera nową, pokrewną funkcję: modyfikacji danych autorów zapisanych wcześniej. Ponieważ zarówno dodawanie, jak i modyfikowanie rekordów wymaga podobnych formularzy, możemy upiec dwie pieczenie na jednym ogniu. Oto kod szablonu formu- larza, który posłuży zarówno do dodawania, jak i edycji autorów: kod w pliku chapter7/admin/authors/form.html.php ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/helpers.inc.php ; ? !DOCTYPE html html lang= pl head meta charset= utf-8 title ?php htmlout($pageTitle); ? /title /head body h1 ?php htmlout($pageTitle); ? /h1 form action= ? ?php htmlout($action); ? method= post div label for= name Imi(cid:218) i nazwisko: input type= text name= name id= name value= ?php htmlout($name); ? /label /div div label for= email Adres e-mail: input type= text name= email id= email value= ?php htmlout($email); ? /label /div div input type= hidden name= id value= ?php htmlout($id); ? input type= submit value= ?php htmlout($button); ? /div /form /body /html W treści tej strony wykorzystywanych jest sześć zmiennych PHP: $pageTitle określa treść tytułu i nagłówka najwyższego poziomu ( h1 ) $action $name określa wartość przekazywaną ciągiem kwerendy URL przy wysyłaniu formularza określa początkową wartość pola formularza do wpisania imienia i nazwiska autora określa początkową wartość pola formularza do wpisania adresu e-mail autora określa wartość ukrytego pola formularza zawierającego identyfikator autora w bazie danych określa treść etykiety przycisku wysyłania formularza $email $id $button Jest to zbiór zmiennych, które pozwalają nam wykorzystywać formularz dwojako: do dodawania wpisów i do modyfikowania wcześniejszych. Tabela 7.1 pokazuje wartości przypisywane zmiennym w każdej z tych sytuacji. Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 173 Tabela 7.1. Warto(cid:258)ci zmiennych dla uniwersalnego formularza autorów Zmienna $pageTitle $action $name $email $id $button Warto(cid:258)(cid:202) przy dodawaniu wpisu Warto(cid:258)(cid:202) przy zmienianiu wpisu Nowy autor addform (ciąg pusty) (ciąg pusty) (ciąg pusty) Dodaj autora Edycja autora editform imię i nazwisko adres e-mail ID autora Aktualizuj autora Oto kod kontrolera, który ładuje formularz w trybie dodawania autora po kliknięciu przycisku Dodaj nowego autora: kod w pliku chapter7/admin/authors/index.php (fragment) ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/magicquotes.inc.php ; if (isset($_GET[ add ])) { $pageTitle = Nowy autor ; $action = addform ; $name = ; $email = ; $id = ; $button = Dodaj autora ; include form.html.php ; exit(); } Gdy autor prześle formularz w tym trybie, możesz to wykryć, sprawdzając wartość $_GET[ addform ]: kod w pliku chapter7/admin/authors/index.php (fragment) if (isset($_GET[ addform ])) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $sql = INSERT INTO author SET name = :name, email = :email ; $s = $pdo- prepare($sql); $s- bindValue( :name , $_POST[ name ]); $s- bindValue( :email , $_POST[ email ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy dodawaniu nowego autora. ; include error.html.php ; exit(); Poleć książkęKup książkę 174 PHP i MySQL. Od nowicjusza do wojownika ninja } header( Location: . ); exit(); } Gdy użytkownik kliknie przycisk Edycja na liście autorów, używamy tego samego formularza, ale tym razem pobieramy z bazy informacje o autorze: kod w pliku chapter7/admin/authors/index.php (fragment) if (isset($_POST[ action ]) and $_POST[ action ] == Edycja ) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $sql = SELECT id, name, email FROM author WHERE id = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy pobieraniu danych autora. ; include error.html.php ; exit(); } $row = $s- fetch(); $pageTitle = Edycja autora ; $action = editform ; $name = $row[ name ]; $email = $row[ email ]; $id = $row[ id ]; $button = Aktualizuj autora ; include form.html.php ; exit(); } Formularz przesłany w tym trybie wykrywasz, sprawdzając wartość $_GET[ editform ]. Kod prze- twarzający przesłane dane jest podobny do stosowanego przy dodawaniu autora, ale miejsce kwe- rendy INSERT zajmuje kwerenda UPDATE. kod w pliku chapter7/admin/authors/index.php (fragment) if (isset($_GET[ editform ])) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $sql = UPDATE author SET name = :name, email = :email WHERE id = :id ; Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 175 $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- bindValue( :name , $_POST[ name ]); $s- bindValue( :email , $_POST[ email ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy aktualizowaniu danych autora. ; include error.html.php ; exit(); } header( Location: . ); exit(); } To wszystko! Wypróbuj zaktualizowany system zarządzania autorami z nowym, uniwersalnym szablonem widocznym na rysunku 7.4. Upewnij się, że działają funkcje dodawania, zmieniania i usuwania danych autorów. Jeżeli pojawią się komunikaty błędów, przejrzyj kod i sprawdź, czy nie pomyliłeś się przy jego wpisywaniu. W razie problemów użyj gotowego kodu z archiwum przykładów i porównaj go z własnym. Rysunek 7.4. Miejmy nadziej(cid:218), (cid:285)e nowy autor wy(cid:258)le co(cid:258) ciekawego… Zarz(cid:200)dzanie kategoriami Role listy autorów i listy kategorii dowcipów są w bazie danych dość podobne. Obie są przechowy- wane w odrębnych tabelach i obie służą do łączenia dowcipów w grupy. Oznacza to, że kod obsłu- gujący kategorie może być bardzo podobny do kodu pracującego z autorami. Jest tylko jedna większa różnica. Przy usuwaniu kategorii nie powinniśmy jednocześnie usuwać wszystkich przypisanych do niej dowcipów. Często należą one do innych kategorii. Możemy sprawdzać każdy kolejny dowcip i jego Poleć książkęKup książkę 176 PHP i MySQL. Od nowicjusza do wojownika ninja powiązania z kategoriami i usuwać tylko te, które nie mają żadnych przypisań. Jest to jednak dość skomplikowany i czasochłonny proces. Możemy zdecydować, że dowcipy nieprzypisane do kategorii pozostają w bazie. W pewnych sytuacjach spowoduje to, że nie będą wyświetlane (przy pewnych konfiguracjach mechanizmu wyświetlania zawartości tabeli dowcipów), pozostaną jednak w bazie, oczekując na przypisanie kategorii w przyszłości. Usuwanie kategorii pociąga za sobą jedynie usunięcie powiązanych z nią wpisów w tabeli jokecategory: kod w pliku chapter7/admin/categories/index.php (fragment) // Usuń powiązania dowcipów z tą kategorią try { $sql = DELETE FROM jokecategory WHERE categoryid = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy usuwaniu powi(cid:200)za(cid:241) dowcipów z usuwan(cid:200) kategori(cid:200). ; include error.html.php ; exit(); } // Usuń kategorię try { $sql = DELETE FROM category WHERE id = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy usuwaniu kategorii. ; include error.html.php ; exit(); } header( Location: . ); exit(); } Poza tym jednym szczegółem zarządzanie kategoriami nie różni się od zarządzania autorami. Poni- żej przedstawiony jest kod wszystkich czterech niezbędnych plików. Wykorzystuje on współużyt- kowane pliki dołączane z rozdziału 6.: db.inc.php, magicquotes.inc.php i helpers.inc.php. kod w pliku chapter7/admin/categories/index.php ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/magicquotes.inc.php ; if (isset($_GET[ add ])) { Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 177 $pageTitle = Nowa kategoria ; $action = addform ; $name = ; $id = ; $button = Dodaj kategori(cid:218) ; include form.html.php ; exit(); } if (isset($_GET[ addform ])) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $sql = INSERT INTO category SET name = :name ; $s = $pdo- prepare($sql); $s- bindValue( :name , $_POST[ name ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy dodawaniu kategorii. ; include error.html.php ; exit(); } header( Location: . ); exit(); } if (isset($_POST[ action ]) and $_POST[ action ] == Edycja ) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $sql = SELECT id, name FROM category WHERE id = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy pobieraniu informacji o kategorii. ; include error.html.php ; exit(); } $row = $s- fetch(); $pageTitle = Edycja kategorii ; $action = editform ; $name = $row[ name ]; $id = $row[ id ]; $button = Aktualizuj kategori(cid:218) ; Poleć książkęKup książkę 178 PHP i MySQL. Od nowicjusza do wojownika ninja include form.html.php ; exit(); } if (isset($_GET[ editform ])) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $sql = UPDATE category SET name = :name WHERE id = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- bindValue( :name , $_POST[ name ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy aktualizowaniu informacji o kategorii. ; include error.html.php ; exit(); } header( Location: . ); exit(); } if (isset($_POST[ action ]) and $_POST[ action ] == Usu(cid:241) ) { include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; // Usuń powiązania dowcipów z tą kategorią try { $sql = DELETE FROM jokecategory WHERE categoryid = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy usuwaniu powi(cid:200)za(cid:241) dowcipów z usuwan(cid:200) kategori(cid:200). ; include error.html.php ; exit(); } // Usuń kategorię try { $sql = DELETE FROM category WHERE id = :id ; $s = $pdo- prepare($sql); $s- bindValue( :id , $_POST[ id ]); $s- execute(); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy usuwaniu kategorii. ; include error.html.php ; exit(); Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 179 } header( Location: . ); exit(); } // Wyświetl listę kategorii include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $result = $pdo- query( SELECT id, name FROM category ); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy pobieraniu listy kategorii! ; include error.html.php ; exit(); } foreach ($result as $row) { $categories[] = array( id = $row[ id ], name = $row[ name ]); } include categories.html.php ; kod w pliku chapter7/admin/categories/categories.html.php ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/helpers.inc.php ; ? !DOCTYPE html html lang= pl head meta charset= utf-8 title Zarz(cid:200)dzanie kategoriami /title /head body h1 Zarz(cid:200)dzanie kategoriami /h1 p a href= ?add Dodaj now(cid:200) kategori(cid:218) /a /p ul ?php foreach ($categories as $category): ? li form action= method= post div ?php htmlout($category[ name ]); ? input type= hidden name= id value= ?php echo $category[ id ]; ? input type= submit name= action value= Edycja input type= submit name= action value= Usu(cid:241) /div /form /li ?php endforeach; ? /ul p a href= .. Powrót do strony g(cid:239)ównej CMS /a /p /body /html Poleć książkęKup książkę 180 PHP i MySQL. Od nowicjusza do wojownika ninja kod w pliku chapter7/admin/categories/form.html.php ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/helpers.inc.php ; ? !DOCTYPE html html lang= pl head meta charset= utf-8 title ?php htmlout($pageTitle); ? /title /head body h1 ?php htmlout($pageTitle); ? /h1 form action= ? ?php htmlout($action); ? method= post div label for= name Nazwa kategorii: input type= text name= name id= name value= ?php htmlout($name); ? /label /div div input type= hidden name= id value= ?php htmlout($id); ? input type= submit value= ?php htmlout($button); ? /div /form /body /html kod w pliku chapter7/admin/categories/error.html.php !DOCTYPE html html lang= pl head meta charset= utf-8 title B(cid:239)(cid:200)d skryptu /title /head body p ?php echo $error; ? /p /body /html Zarz(cid:200)dzanie dowcipami Poza dodawaniem, usuwaniem i modyfikowaniem dowcipów w bazie musimy mieć możliwość przypisywania im kategorii i autorów. Co więcej, dowcipów będzie zapewne znacznie więcej niż autorów czy kategorii. Próba wyświetlenia ich pełnej listy, jak to robiliśmy przy autorach i katego- riach, mogłaby doprowadzić do utworzenia mało przyjaznej strony, na której znalezienie jednego konkretnego dowcipu byłoby niemal niemożliwe. Niezbędne jest zatem zapewnienie nieco bardziej wyszukanej metody przeglądania zgromadzonych zbiorów. Poleć książkęKup książkę SYSTEM ZARZ(cid:107)DZANIA TRE(cid:165)CI(cid:107) (CMS) 181 Wyszukiwanie dowcipów Często się zapewne zdarzy, że będziemy znali kategorię, autora lub część tekstu dowcipu. Zapew- nijmy więc możliwość wyszukiwania wpisów na podstawie tego rodzaju kryteriów. Powinniśmy uzyskać w ten sposób prostą wyszukiwarkę. Formularz, który pyta administratora o znane mu informacje o poszukiwanym dowcipie, powi- nien zapewniać gotowe listy kategorii i autorów. Rozpocznijmy pisanie kodu od części kontrolera, która przygotuje te dane. kod w pliku chapter7/admin/jokes/index.php (fragment) // Wyświetl formularz wyszukiwania include $_SERVER[ DOCUMENT_ROOT ] . /includes/db.inc.php ; try { $result = $pdo- query( SELECT id, name FROM author ); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy pobieraniu listy autorów! ; include error.html.php ; exit(); } foreach ($result as $row) { $authors[] = array( id = $row[ id ], name = $row[ name ]); } try { $result = $pdo- query( SELECT id, name FROM category ); } catch (PDOException $e) { $error = B(cid:239)(cid:200)d przy pobieraniu listy kategorii! ; include error.html.php ; exit(); } foreach ($result as $row) { $categories[] = array( id = $row[ id ], name = $row[ name ]); } include searchform.html.php ; Przedstawiony kod buduje dwie tablice, z których będzie korzystał szablon searchform.html.php: $authors i $categories. Posłużą one do wyświetlenia w formularzu list rozwijanych: kod w pliku chapter7/admin/jokes/searchform.html.php ?php include_once $_SERVER[ DOCUMENT_ROOT ] . /includes/helpers.inc.php ; ? !DOCTYPE html Poleć książkęKup książkę 182 PHP i MySQL. Od nowicjusza do wojownika ninja html lang= pl head meta charset= utf-8 title Zarz(cid:200)dzanie dowcipami /title /head body h1 Zarz(cid:200)dzanie dowcipami /h1 p a href= ?add Dodaj nowy dowcip /a /p form action= method= get p Wy(cid:258)wietl dowcipy, które spe(cid:239)niaj(cid:200) nast(cid:218)puj(cid:200)ce kryteria: /p div label for= author Autor dowcipu: /label select name= author id= author option value= Dowolny autor /option ?php foreach ($authors as $author): ? option value= ?php htmlout($author[ id ]); ? ?php htmlout($author[ name ]); ? /option ?php endforeach; ? /select /div div label for= category Kategoria dowcipu: /label select name= category id= category option value= Dowolna kategoria /option ?php foreach ($categories as $category): ? option value= ?php htmlout($category[ id ]); ? ?php htmlout($category[ name ]); ? /option ?php endforeach; ? /select /div div label for= text Zawieraj(cid:200)ce tekst: /label input type= text name= text id= text /div div input type= hidden name= action value= search input type= submit value= Wyszukaj /div /form p a href= .. Powrót do strony g(cid:239)ównej CMS /a /p /body /html Jak widać, elementy option list select budujemy przy użyciu pętli PHP foreach. Wartością opcji (value) jest identyfikator autora lub kategorii. Z kolei ich etykiety tekstowe to imię i nazwisko autora lub nazwa kategorii. Obie listy rozwijane zaczynają się od opcji bez wartości. Pozwala to wyłączyć odpowiadające jej pole z kryteriów wyszukiwania. Zwróć uwagę, że atrybut method formularza ma wartość get. Pozwala to zapisać wyniki wyszukiwa- nia jako zakładkę przeglądarki — przesyłane wartości są przekazywane jako ciąg kwerendy URL. Jest to wskazane dla większości formularzy wyszukiwania. Gotowy formularz w
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

PHP i MySQL. Od nowicjusza do wojownika ninja
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ą: