Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00191 002928 12924048 na godz. na dobę w sumie
E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL - książka
E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL - książka
Autor: Liczba stron: 400
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-3213-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> php - programowanie
Porównaj ceny (książka, ebook (-25%), audiobook).

Poznaj zasady wirtualnego handlu i zarabiaj prawdziwe pieniądze

Handel elektroniczny to znakomity sposób prowadzenia działalności zarobkowej. Twoje przedsięwzięcie może odnieść prawdziwy sukces - pod warunkiem, że się do niego dobrze przygotujesz. Oto jedna z nielicznych książek na rynku dostarczających szczegółowych informacji na temat tworzenia serwisów e-commerce z wykorzystaniem PHP i MySQL. Bez względu na to, czy tworzysz dynamiczne strony internetowe od lat, czy dopiero od kilku tygodni, z pewnością znajdziesz tu mnóstwo bezcennych informacji.

Dzięki książce E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL dowiesz się, jak zaprojektować bazę danych, generować katalog produktów, zarządzać koszykiem zakupów, obsługiwać zamówienia i płatności oraz sprawić, by Twój sklep internetowy nie wymagał od Ciebie pracy ponad siły, a jednak był dochodowy. Podręcznik zawiera również omówienie tak istotnych zagadnień, jak zapewnienie bezpieczeństwa witryny oraz zadbanie o interfejs przyjazny użytkownikom, a także informacje dotyczące modułowego programowania, gotowego do dalszej rozbudowy. Przytoczone tu praktyczne przykłady pozwolą Ci spojrzeć na systemy e-commerce z możliwie jak najszerszej perspektywy.

Magia tworzenia profesjonalnych serwisów e-commerce.

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

Darmowy fragment publikacji:

E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL Autor: Larry Ullman Tłumaczenie: Aleksander Lamża ISBN: 978-83-246-3213-8 Tytuł oryginału: Effortless E-Commerce with PHP and MySQL Format: 168×237, stron: 400 Poznaj zasady wirtualnego handlu i zarabiaj prawdziwe pieniądze • Jak stworzyć doskonałą witrynę sklepu internetowego? • Jak zapewnić maksymalne bezpieczeństwo Twojej strony? • Jak przeprowadzać sprzedaż i zarządzać stanem magazynowym? Handel elektroniczny to znakomity sposób prowadzenia działalności zarobkowej. Twoje przedsięwzięcie może odnieść prawdziwy sukces – pod warunkiem, że się do niego dobrze przygotujesz. Oto jedna z nielicznych książek na rynku dostarczających szczegółowych informacji na temat tworzenia serwisów e-commerce z wykorzystaniem PHP i MySQL. Bez względu na to, czy tworzysz dynamiczne strony internetowe od lat, czy dopiero od kilku tygodni, z pewnością znajdziesz tu mnóstwo bezcennych informacji. Dzięki książce E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL dowiesz się, jak zaprojektować bazę danych, generować katalog produktów, zarządzać koszykiem zakupów, obsługiwać zamówienia i płatności oraz sprawić, by Twój sklep internetowy nie wymagał od Ciebie pracy ponad siły, a jednak był dochodowy. Podręcznik zawiera również omówienie tak istotnych zagadnień, jak zapewnienie bezpieczeństwa witryny oraz zadbanie o interfejs przyjazny użytkownikom, a także informacje dotyczące modułowego programowania, gotowego do dalszej rozbudowy. Przytoczone tu praktyczne przykłady pozwolą Ci spojrzeć na systemy e-commerce z możliwie jak najszerszej perspektywy. • Wybór technologii internetowych • Struktura i projekt witryny • Zarządzanie zawartością witryny • Tworzenie kont użytkowników • Łączenie różnych systemów płatniczych • Sprzedaż wirtualnych produktów • Tworzenie bezpiecznego środowiska serwera i baz danych • Tworzenie paneli administracyjnych • Zasady składania zamówień Magia tworzenia profesjonalnych serwisów e-commerce Idź do • Spis treści • Przykładowy rozdział • Skorowidz Katalog książek • Katalog online • Zamów drukowany katalog Twój koszyk • Dodaj do koszyka Cennik i informacje • Zamów informacje o nowościach • Zamów cennik Czytelnia • Fragmenty książek online Kontakt Helion SA ul. Kościuszki 1c 44-100 Gliwice tel. 32 230 98 63 e-mail: helion@helion.pl © Helion 1991–2011 SPIS TRE¥CI Wprowadzenie ....................................................................................................13 Czym jest handel elektroniczny? ........................................................................13 Podstawowe informacje o ksi¡Ŝce .....................................................................14 Wykorzystane technologie ............................................................................................ 15 Gdzie szukaø pomocy? ................................................................................................. 15 Wymagania .........................................................................................................16 Podstawowe umiej¤tnoĿci ............................................................................................. 16 Serwer internetowy ....................................................................................................... 16 Jeszcze kilka drobiazgów .............................................................................................. 16 CZ}¥m I: PODSTAWY ............................................................17 Rozdzia© 1. Od czego zacz¡ö? .........................................................................19 OkreĽlanie celów biznesowych ..........................................................................20 Analiza kwestii prawnych ...................................................................................21 Prawo paĬstwowe i mi¤dzynarodowe ........................................................................... 21 ZgodnoĿø z PCI ............................................................................................................. 23 Wybór technologii internetowych .......................................................................23 Wybór hostingu ...................................................................................................26 MoŞliwoĿci hostingu ...................................................................................................... 26 Hosting, który polecam ................................................................................................. 29 Jak znaleŜø dobrego us¨ugodawc¤? ............................................................................. 30 Korzystanie z systemu p©atnoĽci ........................................................................31 Systemy przetwarzania p¨atnoĿci .................................................................................. 31 Bramki p¨atnoĿci ............................................................................................................ 32 Który system p¨atnoĿci wybraø? ................................................................................... 33 6 ~ E-COMMERCE. GENIALNIE PROSTE TWORZENIE SERWISÓW W PHP I MYSQL Proces tworzenia witryny ...................................................................................34 Planowanie witryny ....................................................................................................... 35 Projekt HTML ................................................................................................................ 35 Projekt bazy danych ...................................................................................................... 36 Programowanie ............................................................................................................. 38 Testowanie .................................................................................................................... 40 Uruchamianie ................................................................................................................ 42 Utrzymywanie ................................................................................................................ 42 Udoskonalanie ............................................................................................................... 43 Rozdzia© 2. Podstawy bezpieczeĪstwa ...........................................................45 Teoria bezpieczeĪstwa .......................................................................................45 ŝadna witryna nie jest bezpieczna ................................................................................ 46 Celem nigdy nie jest zapewnienie maksymalnego bezpieczeĬstwa ............................. 47 BezpieczeĬstwo uŞytkowników ..................................................................................... 48 Wymagania PCI ...................................................................................................50 BezpieczeĪstwo serwera ....................................................................................52 Wp¨yw hostingu na bezpieczeĬstwo ............................................................................. 53 BezpieczeĬstwo PHP i serwera WWW ......................................................................... 54 BezpieczeĬstwo bazy danych ....................................................................................... 57 Bezpieczne transakcje ........................................................................................59 Typowe s©abe punkty ..........................................................................................63 Ochrona informacji ........................................................................................................ 63 Ochrona uŞytkownika .................................................................................................... 64 Ochrona witryny ............................................................................................................ 65 CZ}¥m II: SPRZEDA¿ WIRTUALNYCH PRODUKTÓW ...........71 Rozdzia© 3. Pierwsza witryna — struktura i projekt ........................................73 Projekt bazy danych ...........................................................................................74 Organizacja plików na serwerze .........................................................................77 ¨¡czenie si¥ z baz¡ danych ................................................................................81 Plik konfiguracyjny .............................................................................................83 SPIS TRE¥CI ~ 7 Szablon HTML .....................................................................................................88 Tworzenie pliku nag¨ówka ............................................................................................. 89 Dodawanie dynamicznych funkcjonalnoĿci do nag¨ówka ............................................. 90 Tworzenie pliku stopki ................................................................................................... 93 Dodawanie dynamicznych funkcjonalnoĿci do stopki ................................................... 94 Tworzenie strony g¨ównej ............................................................................................. 96 Rozdzia© 4. Konta uŜytkowników ....................................................................99 Definiowanie funkcji pomocniczych ...................................................................99 Tworzenie pól formularza ............................................................................................ 100 Ochrona hase¨ ............................................................................................................. 104 Przekierowanie przegl darki ....................................................................................... 106 Zak©adanie kont ............................................................................................... 108 Tworzenie podstawowej struktury skryptu .................................................................. 108 Tworzenie formularza .................................................................................................. 110 Przetwarzanie danych z formularza ............................................................................ 111 Logowanie ........................................................................................................ 118 Przetwarzanie danych z formularza ............................................................................ 118 Tworzenie formularza .................................................................................................. 120 Wylogowanie .................................................................................................... 122 Zarz¡dzanie has©ami ........................................................................................ 123 Odzyskiwanie has¨a .................................................................................................... 123 Zmiana has¨a ............................................................................................................... 127 Zwi¥kszenie poziomu bezpieczeĪstwa ........................................................... 130 Rozdzia© 5. Zarz¡dzanie zawartoĽci¡ witryny ...............................................133 Tworzenie konta administratora ...................................................................... 133 Dodawanie stron .............................................................................................. 134 Tworzenie podstawowego skryptu .............................................................................. 134 Dodawanie edytora WYSIWYG ................................................................................... 139 WyĽwietlanie zawartoĽci strony ...................................................................... 143 Przygotowanie skryptu category.php .......................................................................... 143 Przygotowanie skryptu page.php ................................................................................ 147 Dodawanie plików PDF .................................................................................... 149 Konfigurowanie serwera .............................................................................................. 150 Tworzenie skryptu PHP ............................................................................................... 152 8 ~ E-COMMERCE. GENIALNIE PROSTE TWORZENIE SERWISÓW W PHP I MYSQL WyĽwietlanie plików PDF ................................................................................ 159 Przygotowanie skryptu pdfs.php ................................................................................. 159 Przygotowanie skryptu view_pdf.php ......................................................................... 160 Rozdzia© 6. Korzystanie z systemu PayPal ...................................................165 Ogólne informacje o systemie PayPal ............................................................. 165 Obs¨uga p¨atnoĿci w systemie PayPal ........................................................................ 167 Przyciski systemu p¨atnoĿci ........................................................................................ 168 Testowanie systemu PayPal ............................................................................ 169 Rejestrowanie w us¨udze Sandbox ............................................................................. 170 Tworzenie kont testowych ........................................................................................... 171 Tworzenie przycisku .................................................................................................... 174 Integracja systemu PayPal z witryn¡ .............................................................. 177 Aktualizacja skryptu rejestrowania .............................................................................. 177 Tworzenie skryptu thanks.php .................................................................................... 178 Tworzenie skryptu cancel.php .................................................................................... 180 Testowanie witryny .......................................................................................... 181 Korzystanie z mechanizmu IPN ....................................................................... 183 Aktywowanie mechanizmu IPN ................................................................................... 184 Aktualizacja skryptu rejestrowania .............................................................................. 184 Tworzenie skryptu ipn.php .......................................................................................... 185 Aktualizacja skryptu thanks.php .................................................................................. 191 Odnawianie kont .............................................................................................. 191 Uruchamianie witryny ...................................................................................... 192 CZ}¥m III: SPRZEDA¿ RZECZYWISTYCH PRODUKTÓW ....195 Rozdzia© 7. Druga witryna — struktura i projekt ...........................................197 Kilka s©ów o witrynie ........................................................................................ 197 Co b¤dziemy sprzedawaø? ......................................................................................... 197 Zakupy bez rejestracji ................................................................................................. 199 Implementowanie architektury MVC ........................................................................... 199 Zwi¤kszenie bezpieczeĬstwa ...................................................................................... 201 SPIS TRE¥CI ~ 9 Projekt bazy danych ........................................................................................ 201 Tabele produktów ........................................................................................................ 202 Tabele klientów ........................................................................................................... 203 Podstawowy kod SQL ................................................................................................. 205 Konfiguracja serwera ....................................................................................... 208 Organizacja plików na serwerze .................................................................................. 208 Dostosowanie serwera ................................................................................................ 209 Pliki pomocnicze .............................................................................................. 216 § czenie z baz  danych .............................................................................................. 216 Plik konfiguracyjny ...................................................................................................... 217 Szablon HTML witryny ..................................................................................... 218 Nowe moŜliwoĽci bazy MySQL ........................................................................ 221 Predefiniowane zapytania ........................................................................................... 222 Procedury sk¨adowane ................................................................................................ 225 Rozdzia© 8. Tworzenie katalogu ....................................................................229 Przygotowanie bazy danych ............................................................................ 229 Wype¨nianie tabel za pomoc  SQL-a .......................................................................... 230 Rzut oka na kwerendy procedur sk¨adowanych ......................................................... 233 Tworzenie procedur sk¨adowanych ............................................................................ 239 Dokonywanie zakupów z poziomu kategorii ................................................... 243 Tworzenie skryptu shop.php ....................................................................................... 243 Tworzenie plików widoku ............................................................................................ 245 WyĽwietlanie listy produktów .......................................................................... 249 Tworzenie skryptu browse.php ................................................................................... 249 Tworzenie plików widoku ............................................................................................ 251 Tworzenie widoku dla braku produktów ...................................................................... 255 Informowanie o dost¥pnoĽci ........................................................................... 256 WyĽwietlanie promocyjnych cen ....................................................................... 258 Uaktualnianie procedury sk¨adowanej ........................................................................ 259 Aktualizowanie skryptu product_functions.inc.php ..................................................... 261 Aktualizowanie pliku list_products.html ...................................................................... 262 Aktualizowanie pliku list_coffees.html ......................................................................... 263 WyróŜnianie promocji ...................................................................................... 263 Tworzenie strony g¨ównej ........................................................................................... 263 Tworzenie stron s¨uŞ cych do sprzedaŞy ................................................................... 266 10 ~ E-COMMERCE. GENIALNIE PROSTE TWORZENIE SERWISÓW W PHP I MYSQL Rozdzia© 9. Tworzenie koszyka na zakupy ....................................................269 Definiowanie procedur sk©adowanych ............................................................ 269 Dodawanie produktów ................................................................................................ 270 Usuwanie produktów ................................................................................................... 271 Aktualizowanie koszyka .............................................................................................. 271 Pobieranie zawartoĿci koszyka ................................................................................... 273 Definiowanie funkcji pomocniczych ................................................................ 274 Budowanie koszyka na zakupy ........................................................................ 275 Tworzenie skryptu PHP ............................................................................................... 275 Tworzenie plików widoku ............................................................................................ 279 Budowanie przechowalni ................................................................................. 283 Tworzenie skryptu PHP ............................................................................................... 283 Tworzenie plików widoku ............................................................................................ 285 Obliczanie kosztów wysy©ki ............................................................................. 287 Rozdzia© 10. Sk©adanie zamówienia ................................................................289 Authorize.net ................................................................................................... 289 Tworzenie konta próbnego .............................................................................. 291 Przygotowanie witryny .................................................................................... 293 Nowy szablon HTML ................................................................................................... 293 Funkcja pomocnicza ................................................................................................... 295 Tworzenie procedur .................................................................................................... 298 Pobieranie danych do wysy©ki ......................................................................... 306 Tworzenie skryptu PHP ............................................................................................... 307 Tworzenie plików widoku ............................................................................................ 314 Pobieranie danych posiadacza rachunku ........................................................ 321 Tworzenie podstawowego skryptu PHP ..................................................................... 322 Tworzenie pliku widoku ............................................................................................... 323 Sprawdzanie danych z formularza .............................................................................. 327 Obs©uga karty kredytowej ................................................................................ 332 Tworzenie pliku gateway_setup.php ........................................................................... 333 Tworzenie pliku gateway_process.php ....................................................................... 334 Analiza odpowiedzi serwera ........................................................................................ 337 Uaktualnienie pliku billing.php ..................................................................................... 338 SPIS TRE¥CI ~ 11 Finalizacja zamówienia .................................................................................... 341 Tworzenie skryptu PHP ............................................................................................... 341 Tworzenie pliku widoku ............................................................................................... 343 Testowanie strony ........................................................................................... 344 Uruchomienie strony ....................................................................................... 345 Rozdzia© 11. Administrowanie witryn¡ ............................................................347 Konfigurowanie serwera .................................................................................. 348 Uwierzytelnianie dost¤pu ............................................................................................ 348 Tworzenie szablonu .................................................................................................... 348 Korzystanie z menu Superfish ..................................................................................... 352 Aktualizowanie funkcji create_form_input() ................................................................. 354 Dodawanie produktów ..................................................................................... 355 Dodawanie innych produktów ..................................................................................... 355 Dodawanie kawy ......................................................................................................... 363 Zmiana stanu magazynowego ......................................................................... 367 Definiowanie promocji ..................................................................................... 371 Przegl¡danie zamówieĪ ................................................................................... 376 WyĿwietlanie wszystkich zamówieĬ ............................................................................ 377 Przegl danie jednego zamówienia .............................................................................. 379 Dostarczanie zamówieĪ ................................................................................... 384 Tworzenie skryptu gateway_setup_admin.php ........................................................... 384 Aktualizowanie skryptu view_order.php ...................................................................... 384 Skorowidz ........................................................................................................389 9 TWORZENIE KOSZYKA NA ZAKUPY W poprzednim rozdziale zosta¨ opracowany katalog produktów zawieraj cy przyciski s¨uŞ ce do dodawania wybranych produktów do koszyka na zakupy. Teraz przyszed¨ czas na zaimplementowanie koszyka. Dobrze zaprojektowany koszyk pozwala klientom wyĿwietliø wszystkie wybrane przez nich produkty, w ¨atwy sposób usun ø wskazane pozycje lub zmieniø iloĿø, a takŞe przejĿø do etapu realizacji zamówienia. Projektowana witryna ma posiadaø równieŞ funkcj¤ „przechowalni”, do której klient moŞe dodaø produkty, ale nie musi ich od razu zamawiaø. G¨ówna uwaga w tym rozdziale skupi si¤ na zaimplementowaniu koszyka i przechowalni. Musisz jednak zacz ø od zdefiniowania nowych procedur sk¨adowanych. Na koĬcu rozdzia¨u s  omówione zagadnienia zwi zane z róŞnymi moŞliwoĿciami uwzgl¤dnienia kosztów wysy¨ki oraz inne dodatkowe funkcje, które moŞna zaimplementowaø. DEFINIOWANIE PROCEDUR SK’ADOWANYCH PoniewaŞ w projekcie witryny zosta¨ zastosowany wzorzec MVC, prac¤ nad koszykiem rozpoczniemy od zaprojektowania modelu, czyli bazy danych. W tym rozdziale zostanie opisanych osiem nowych procedur sk¨adowanych: cztery dla koszyka na zakupy i cztery dla przechowalni. Tylko dwie z nich s  skomplikowane porównywalnie do tych opisanych w rozdziale 8., „Tworzenie katalogu”, jednak tym razem w procedurach znajdzie si¤ wi¤cej tzw. logiki. PoniewaŞ tabele carts i wish_lists maj  tak  sam  struktur¤ i b¤d  wykorzystywane w ten sam sposób, opisz¤ tylko procedury dla koszyka. Aby utworzyø procedury dla przechowalni, wystarczy zmieniø nazw¤ tabeli cart na wish_list. 270 ~ ROZDZIA’ 9 Dodawanie produktów Wskazówka Sposób tworzenia procedur sk¨adowanych w bazie danych jest opisany w rozdziale 8. Procedura sk¨adowana add_to_cart() b¤dzie wywo¨ywana po Ş daniu zg¨oszonym przez klienta wk¨adaj cego produkt do koszyka. Procedurze trzeba przekazaø cztery argumenty: unikalny identyfikator uŞytkownika, typ produktu (kawa lub inne) i jego identyfikator, a takŞe iloĿø. Dodatkowo, jeĿli w koszyku nie ma jeszcze danego produktu, procedura powinna go dodaö, natomiast jeĿli juŞ jest, powinna tylko zwi¥kszyö jego iloĽö. PoniŞej znajduje si¤ kod procedury i jego objaĿnienie: DELIMITER $$ CREATE PROCEDURE add_to_cart (uid CHAR(32), type VARCHAR(6), pid MEDIUMINT, ´qty TINYINT) BEGIN DECLARE cid INT; SELECT id INTO cid FROM carts WHERE user_session_id=uid AND product_type=type ´AND product_id=pid; IF cid 0 THEN UPDATE carts SET quantity=quantity+qty, date_modified=NOW( ) WHERE id=cid; ELSE INSERT INTO carts (user_session_id, product_type, product_id, quantity) ´VALUES (uid, type, pid, qty); END IF; END$$ DELIMITER ; Wskazówka Pe¨ny kod SQL i pozosta¨e pliki moŞesz pobraø ze strony www.DMCInsights.com/ecom/. Najpierw, tak jak to juŞ robiliĿmy, zmieniamy symbol zakoĬczenia definicji na dwa znaki dolara ($$). Nast¤pnie jest definiowana sygnatura procedury, czyli jej nazwa i lista argumentów. Pierwszy argument (uid) to identyfikator sesji uŞytkownika, który b¤dzie si¤ sk¨ada¨ z dok¨adnie 32 znaków. Kolejny (type) to typ produktu, który moŞe mieø d¨ugoĿø do szeĿciu znaków (w naszym przypadku nazwy obu typów maj  po cztery znaki: kawa i inne). Dwa ostatnie argumenty to identyfikator produktu (pid) oraz iloĿø (qty). Wskazówka Symbol zakoĬczenia definicji procedury musi byø zmieniony na coĿ innego niŞ znak Ŀrednika. Aby w procedurze sprawdziø, czy dany produkt znajduje si¤ juŞ w koszyku, konieczne jest wprowadzenie dodatkowej, wewn¤trznej zmiennej. MoŞna j  zadeklarowaø za pomoc  instrukcji DECLARE, po której TWORZENIE KOSZYKA NA ZAKUPY ~ 271 nast¤puje nazwa zmiennej i typ danych MySQL. W kodzie jest tworzona zmienna cid (skrót od cart ID, czyli identyfikator koszyka). Uwaga Zmienne musz  byø deklarowane bezpoĿrednio pod instrukcj  BEGIN. Kwerenda SELECT poszukuje w tabeli carts okreĿlonego produktu. JeĿli go znajdzie, zapisuje jego identyfikator (id) do zmiennej cid, za co odpowiada konstrukcja SELECT...INTO. Po kwerendzie SELECT znajduje si¤ instrukcja warunkowa IF-ELSE, która — w zaleŞnoĿci od wartoĿci zmiennej cid — wykonuje zapytanie UPDATE lub INSERT. WartoĿø cid wi¤ksza od zera oznacza, Şe produkt juŞ jest w koszyku, wi¤c trzeba jedynie zaktualizowaø iloĿø. W przeciwnym przypadku do tabeli jest wstawiany nowy rekord. Kolumna date_modified jest uaktualniana tylko w przypadku wykonania zapytania UPDATE. Usuwanie produktów Wskazówka Argumenty przekazywane do procedur sk¨adowanych mog  byø wykorzystywane w kwerendach, tak samo jak w przypadku predefiniowanych zapytaĬ, co oznacza, Şe ¨aĬcuchy tekstowe nie mog  byø umieszczane w cudzys¨owach. Procedura sk¨adowana usuwaj ca produkt z koszyka jest najprostsz  z wszystkich czterech opisanych w tym rozdziale. Wymaga przekazania trzech z czterech argumentów zdefiniowanych w procedurze add_to_cart() (z oczywistych wzgl¤dów podczas usuwania produktu nie jest wymagane podanie jego iloĿci). Procedura wykonuje tylko jedn  kwerend¤ DELETE: DELIMITER $$ CREATE PROCEDURE remove_from_cart (uid CHAR(32), type VARCHAR(6), pid MEDIUMINT) BEGIN DELETE FROM carts WHERE user_session_id=uid AND product_type=type AND ´product_id=pid; END$$ DELIMITER ; Aktualizowanie koszyka Wskazówka S  dwie moŞliwoĿci usuni¤cia produktu z koszyka: klikni¤cie linku usuwaj cego lub wpisanie zera w polu iloĿci. 272 ~ ROZDZIA’ 9 Procedura sk¨adowana aktualizuj ca koszyk b¤dzie wywo¨ywana po klikni¤ciu przez uŞytkownika przycisku Aktualizuj koszyk znajduj cego si¤ na stronie koszyka (rysunek 9.1). Procedura przyjmuje te same cztery parametry co add_to_cart(), ale nie musi sprawdzaø, czy produkt juŞ istnieje w tabeli (poniewaŞ produkt musi znajdowaø si¤ w bazie, by by¨ wyĿwietlony w koszyku). JeĿli jednak uŞytkownik w polu iloĿci wpisze zero, procedura powinna usun ø taki produkt. Zamiast umieszczaø w tej procedurze kod usuwaj cy produkt, wywo¨amy procedur¤ remove_from_cart() realizuj c  to zadanie. Rysunek 9.1 DELIMITER $$ CREATE PROCEDURE update_cart (uid CHAR(32), type VARCHAR(6), pid MEDIUMINT, ´qty TINYINT) BEGIN IF qty 0 THEN UPDATE carts SET quantity=qty, date_modified=NOW( ) WHERE user_session_id=uid ´AND product_type=type AND product_id=pid; ELSEIF qty = 0 THEN CALL remove_from_cart (uid, type, pid); END IF; END$$ DELIMITER ; TWORZENIE KOSZYKA NA ZAKUPY ~ 273 Wskazówka Za kaŞdym razem, gdy w tabelach carts lub wish_lists zmieni si¤ iloĿø jakiegoĿ produktu (ale nie zostanie on usuni¤ty), zaktualizowana zostanie równieŞ data modyfikacji (date_modified). Pobieranie zawartoĂci koszyka Czwarta i ostatnia procedura sk¨adowana (dla koszyka) wykonuje kwerend¤ SELECT pobieraj c  ca¨  zawartoĿø koszyka. StopnieĬ skomplikowania kwerendy zaleŞy od tego, jak duŞo informacji chcesz uzyskaø, jednak jej podstawowa budowa przypomina kwerendy zwi zane z promocjami, opisane w rozdziale 8. Zapytanie ¨ czy dwie kwerendy SELECT za pomoc  instrukcji UNION: pierwsza to z¨ czenie JOIN czterech tabel, a druga — aŞ pi¤ciu. W poniŞszym kodzie kwerenda jest przedstawiona w czytelny sposób z podzia¨em na wiersze. Procedura wymaga podania jedynie jednego argumentu, którym jest identyfikator sesji uŞytkownika. DELIMITER $$ CREATE PROCEDURE get_shopping_cart_contents (uid CHAR(32)) BEGIN SELECT CONCAT( I , ncp.id) AS sku, c.quantity, ncc.category, ncp.name, ncp.price, ncp.stock, sales.price AS sale_price FROM carts AS c INNER JOIN non_coffee_products AS ncp ON c.product_id=ncp.id INNER JOIN non_coffee_categories AS ncc ON ncc.id=ncp.non_coffee_category_id LEFT OUTER JOIN sales ON (sales.product_id=ncp.id AND sales.product_type= inne AND ((NOW( ) BETWEEN sales.start_date AND sales.end_date) OR (NOW( ) sales.start_date ´AND sales.end_date IS NULL)) ) WHERE c.product_type= inne AND c.user_session_id=uid UNION SELECT CONCAT( K , sc.id), c.quantity, gc.category, CONCAT_WS( - , s.size, sc.caf_decaf, sc.ground_whole), sc.price, sc.stock, ´sales.price FROM carts AS c INNER JOIN specific_coffees AS sc ON c.product_id=sc.id INNER JOIN sizes AS s ON s.id=sc.size_id INNER JOIN general_coffees AS gc ON gc.id=sc.general_coffee_id LEFT OUTER JOIN sales ON (sales.product_id=sc.id AND sales.product_type= kawa AND ((NOW( ) BETWEEN sales.start_date AND sales.end_date) OR (NOW( ) sales.start_date ´AND sales.end_date IS NULL)) ) WHERE c.product_type= kawa AND c.user_session_id=uid; END$$ DELIMITER ; Na rysunku 9.2 widaø efekt wywo¨ania procedury. Zwróø uwag¤, Şe kwerenda zwraca domyĿln  cen¤ (w kolumnie price), stan magazynowy (stock) i cen¤ promocyjn  (sale_price), jeŞeli obowi zuje dla danego produktu. Te informacje b¤d  wykorzystane póŜniej. 274 ~ ROZDZIA’ 9 Rysunek 9.2 DEFINIOWANIE FUNKCJI POMOCNICZYCH Zanim przejdziemy do tworzenia koszyka na zakupy, przygotujemy dwie funkcje pomocnicze, które b¤d  potrzebne w skrypcie koszyka. Pierwsza funkcja przyjmuje dwie ceny — normaln  oraz promocyjn  — i zwraca t¤, która powinna byø uwzgl¤dniona w koszyku: function get_just_price($regular, $sales) { if ((0 $sales) ($sales $regular)) { return number_format($sales, 2); } else { return number_format($regular, 2); } } Podobny kod znajduje si¤ w funkcji get_price() zdefiniowanej w rozdziale 8., ale tam jest zwracana wartoĿø liczbowa ceny (bez Şadnego kontekstu). Druga funkcja przetwarza numer SKU na dwie wartoĿci, np. K12 zostanie zamienione na kawa i 12. Ta operacja b¤dzie cz¤sto potrzebna, poniewaŞ w bazie danych kaŞdy produkt jest opisany typem i identyfikatorem. Funkcja ta przyjmuje jeden argument — numer SKU — i zwraca dwuelementow  tablic¤: function parse_sku($sku) { // Wydziel pierwszy znak: $type_abbr = substr($sku, 0, 1); // Wydziel pozostaáe znaki: $pid = substr($sku, 1); // SprawdĨ typ: if ($type_abbr == K ) { $sp_type = kawa ; } elseif ($type_abbr == I ) { $sp_type = inne ; TWORZENIE KOSZYKA NA ZAKUPY ~ 275 } else { $sp_type = NULL; } // SprawdĨ identyfikator produktu: $pid = (filter_var($pid, FILTER_VALIDATE_INT, array( min_range = 1))) ? ´$pid : NULL; // Zwróü wartoĞci: return array($sp_type, $pid); } // Koniec funkcji parse_sku(). Numer SKU jest dzielony na cz¤Ŀci za pomoc  dwóch funkcji substr(). Nast¤pnie na podstawie pierwszego znaku numeru SKU (który moŞe przyj ø dwie wartoĿci: K dla kawy i I dla innych produktów) jest ustalany typ (zmienna $sp_type). JeŞeli nie jest spe¨niony Şaden warunek, zmiennej $sp_type jest przypisywana wartoĿø NULL. Druga cz¤Ŀø numeru SKU musi byø liczb  ca¨kowit  co najmniej równ  1. Do sprawdzenia jej poprawnoĿci s¨uŞy funkcja filter_var(). JeŞeli liczba jest prawid¨owa, jest przypisywana zmiennej $pid, a w przeciwnym przypadku przyjmuje wartoĿø NULL. Na koniec obie wartoĿci s  zwracane jako tablica, wi¤c w kodzie wywo¨uj cym t¤ funkcj¤ trzeba zastosowaø instrukcj¤ list(): list($type, $id) = parse_sku($sku); Funkcja list() przypisuje zmiennym $type i $id wartoĿci z tablicy zwróconej przez wyraŞenie z prawej strony przypisania, czyli funkcj¤ parse_sku(). Najbardziej odpowiednim miejscem dla tych dwóch funkcji jest skrypt product_functions.inc.php znajduj cy si¤ w katalogu includes. Przed przejĿciem do kolejnego etapu koniecznie umieĿø tam te funkcje. BUDOWANIE KOSZYKA NA ZAKUPY Po zdefiniowaniu procedur sk¨adowanych i funkcji pomocniczych musisz si¤ zaj ø utworzeniem trzech plików: „ cart.php, który wykonuje wszystkie niezb¤dne operacje (jest kontrolerem), „ cart.html, który jest plikiem widoku dla koszyka, „ emptycart.html, który jest plikiem widoku dla pustego koszyka. Utworzysz teraz te pliki, rozpoczynaj c od skryptu PHP. Tworzenie skryptu PHP Skrypty PHP opracowane w rozdziale 8., dzi¤ki zastosowaniu procedur sk¨adowanych i do¨ czanych plików HTML, by¨y bardzo krótkie i stosunkowo „czyste”. Ca¨y plik cart.php sk¨ada si¤ tylko z 50 wierszy kodu, 276 ~ ROZDZIA’ 9 w¨ czaj c w to komentarze i puste wiersze! Wi¤kszoĿø kodu odpowiada za uruchomienie odpowiednich procedur sk¨adowanych w zaleŞnoĿci od sposobu wywo¨ania skryptu. 1. W edytorze lub IDE utwórz nowy skrypt PHP i zapisz go w g¨ównym katalogu serwera WWW pod nazw  cart.php. 2. Do¨ cz plik konfiguracyjny: ?php require ( ./includes/config.inc.php ); 3. SprawdŜ, czy jest juŞ ustawiony identyfikator sesji uŞytkownika, a jeŞeli nie — utwórz go. if (isset($_COOKIE[ SESSION ] )) { $uid = $_COOKIE[ SESSION ]; } else { $uid = md5(uniqid( biped ,true)); } Ta witryna korzysta tylko z jednego ciasteczka do obs¨ugi zarówno koszyka, jak i przechowalni. Ciasteczko ma nazw¤ SESSION. ChociaŞ nie s  tu stosowane prawdziwe sesje PHP, nazwa wskazuje przeznaczenie ciasteczka. JeĿli ciasteczko istnieje, jego wartoĿø jest przypisywana zmiennej $uid. W przeciwnym przypadku musi zostaø utworzony nowy identyfikator sesji. S¨uŞy do tego kombinacja funkcji uniqid() i md5(). Wskazówka Funkcja md5() zwraca ¨aĬcuch tekstowy o d¨ugoĿci 32 znaków. 4. WyĿlij ciasteczko: setcookie( SESSION , $uid, time()+(60*60*24*30)); Gdy uŞytkownik powraca na stron¤ albo pojawia si¤ na niej pierwszy raz, ciasteczko musi zostaø przes¨ane. Dla nowych uŞytkowników jest to oczywiste, natomiast w przypadku powracaj cych klientów chodzi o zaktualizowanie ciastka, tak by by¨o d¨uŞej waŞne. Przy przedstawionych ustawieniach termin waŞnoĿci ciasteczka mija po 30 dniach od daty utworzenia. Uwaga Ciasteczka musz  zostaø przes¨ane do przegl darki internetowej jako pierwsze. 5. Do¨ cz plik nag¨ówka: $page_title = Kawy Ăwiata – koszyk na zakupy ; include ( ./includes/header.html ); 6. Do¨ cz skrypty odpowiedzialne za po¨ czenie z baz  danych oraz funkcje pomocnicze: require (MYSQL); include ( ./includes/product_functions.inc.php ); TWORZENIE KOSZYKA NA ZAKUPY ~ 277 7. JeĿli w adresie URL znajduje si¤ wartoĿø SKU, podziel j  na cz¤Ŀci: if (isset($_GET[ sku ] )) { list($sp_type, $pid) = parse_sku($_GET[ sku ] ); } Dzi¤ki wywo¨aniu funkcji parse_sku() numer SKU, który moŞe byø przekazany w adresie URL, zostanie podzielony na dwie cz¤Ŀci: typ produktu oraz jego identyfikator. 8. SprawdŜ, czy produkt ma byø dodany do koszyka: if (isset ($sp_type, $pid, $_GET[ action ] ) ($_GET[ action ] == add ) ) { $r = mysqli_query($dbc, CALL add_to_cart( $uid , $sp_type , $pid, 1) ); Wskazówka Za pomoc  funkcji isset() moŞna za jednym razem sprawdziø istnienie wielu zmiennych. Ca¨a logika tego skryptu opiera si¤ na d¨ugiej instrukcji warunkowej IF-ELSEIF, sprawdzaj cej róŞne moŞliwoĿci wywo¨ania skryptu. Pierwsz  moŞliwoĿci  jest klikni¤cie przycisku Do koszyka, co powoduje utworzenie adresu URL o postaci np. http://nazwahosta/cart.php?sku=C8 action=add. W tym przypadku numer SKU zostanie podzielony na wartoĿci $sp_type i $pid, a zmienna $_GET[ action ] b¤dzie równa add. JeĿli wszystkie warunki s  spe¨nione, jest wywo¨ywana procedura sk¨adowana add_to_cart() i przekazywany jest jej identyfikator uŞytkownika ($uid), typ ($sp_type) i identyfikator produktu ($pid) oraz iloĿø wynosz ca 1. Wskazówka JeĿli chcesz umoŞliwiø klientom dodawanie do koszyka wi¤kszych iloĿci produktu za jednym razem, musia¨byĿ pobraø t¤ wartoĿø z adresu URL, sprawdziø j  i przekazaø procedurze add_to_cart(). 9. SprawdŜ, czy produkt ma zostaø usuni¤ty z koszyka: } elseif (isset ($sp_type, $pid, $_GET[ action ] ) ($_GET[ action ] ´== remove ) ) { $r = mysqli_query($dbc, CALL remove_from_cart( $uid , $sp_type , $pid) ); Warunek sprawdzany za pomoc  funkcji isset() jest podobny do poprzedniego (dla dodawania produktów). JeĿli wartoĿø $_GET[ action ] jest równa remove, wywo¨ywana jest procedura sk¨adowana remove_from_cart(). Do takiej sytuacji dojdzie po klikni¤ciu przez uŞytkownika linku UsuĬ z koszyka (patrz rysunek 9.1). 10. SprawdŜ, czy produkt ma zostaø przeniesiony do koszyka: } elseif (isset ($sp_type, $pid, $_GET[ action ], $_GET[ qty ] ) ´($_GET[ action ] == move ) ) { $qty = (filter_var($_GET[ qty ], FILTER_VALIDATE_INT, array( min_range = 1))) ´? $_GET[ qty ] : 1; 278 ~ ROZDZIA’ 9 $r = mysqli_query($dbc, CALL add_to_cart( $uid , $sp_type , $pid, $qty) ); $r = mysqli_query($dbc, CALL remove_from_wish_list( $uid , $sp_type , $pid) ); Klient ma moŞliwoĿø przenoszenia produktów mi¤dzy koszykiem i przechowalni . JeĿli coĿ znajduje si¤ w przechowalni i jest przenoszone do koszyka, wykonywana jest podobna operacja do dodawania do koszyka. Mi¤dzy tymi dzia¨aniami s  jednak dwie istotne róŞnice. Po pierwsze, brana jest pod uwag¤ równieŞ liczba produktów, czyli jeĿli w przechowalni by¨y np. trzy kubki, do koszyka zostan  przeniesione wszystkie trzy. Po drugie, po przeniesieniu produktu do koszyka, musi on zostaø usuni¤ty z przechowalni. Aby to wszystko zadzia¨a¨o, w instrukcji warunkowej jest sprawdzane istnienie wartoĿci $_GET[ qty ] oraz to, czy $_GET[ action ] jest równe move. Nast¤pnie jest sprawdzana poprawnoĿø wartoĿci iloĿci (liczba ca¨kowita nie mniejsza niŞ 1). Wyniki wszystkich procedur sk¨adowanych wywo¨ywanych w skrypcie s  przypisywane zmiennej $r, mimo Şe tak naprawd¤ jest uŞywany wynik tylko jednej z nich (mowa o procedurze zwracaj cej zawartoĿø koszyka). Mimo to lepiej przypisywaø wyniki do zmiennej, poniewaŞ u¨atwia to debugowanie. JeĿli w czasie pracy nad skryptem pojawi  si¤ problemy, po wywo¨aniu procedury moŞesz wpisaø nast¤puj cy kod: if (!$r) echo mysqli_error($dbc); 11. SprawdŜ, czy zosta¨ przes¨any formularz: } elseif (isset($_POST[ quantity ] )) { Wszystkie poprzednie warunki korzysta¨y z Ş daĬ typu GET, natomiast ta strona moŞe byø równieŞ wywo¨ana za pomoc  Ş dania POST. Do tego typu sytuacji dojdzie, gdy uŞytkownik zmieni iloĿø produktów w koszyku i przeĿle formularz koszyka. 12. PrzejdŜ w p¤tli przez wszystkie przes¨ane pozycje koszyka: foreach ($_POST[ quantity ] as $sku = $qty) { list($sp_type, $pid) = parse_sku($sku); if (isset($sp_type, $pid)) { $qty = (filter_var($qty, FILTER_VALIDATE_INT, array( min_range = 0))) ? ´$qty : 1; $r = mysqli_query($dbc, CALL update_cart( $uid , $sp_type , $pid, $qty) ); } } W $_POST[ quantity ] znajduje si¤ tablica elementów w postaci SKU = iloĂÊ. Dla kaŞdego elementu w $_POST[ quantity ] musi zostaø zaktualizowany odpowiedni produkt w koszyku. W tym celu najpierw jest przetwarzany i sprawdzany numer SKU, a nast¤pnie sprawdzana jest iloĿø. WartoĿø ta zostanie uŞyta, jeĿli jest to liczba ca¨kowita równa co najmniej 0 (poniewaŞ klient moŞe wpisaø zero, by usun ø produkt z koszyka). JeĿli z jakiegoĿ powodu klient wprowadzi nieprawid¨ow  wartoĿø, zostanie zastosowana domyĿlna, wynosz ca 1. Na koĬcu jest wywo¨ywana procedura sk¨adowana update_cart() z prawid¨owymi argumentami. 13. ZakoĬcz g¨ówn  instrukcj¤ warunkow  i pobierz zawartoĿø koszyka: } // Koniec gáównej instrukcji warunkowej IF. $r = mysqli_query($dbc, CALL get_shopping_cart_contents( $uid ) ); Bez wzgl¤du na wykonan  akcj¤ zawsze jest wyĿwietlana aktualna zawartoĿø koszyka. TWORZENIE KOSZYKA NA ZAKUPY ~ 279 14. Do¨ cz w¨aĿciwy plik widoku: if (mysqli_num_rows($r) 0) { include ( ./views/cart.html ); } else { // Pusty koszyk! include ( ./views/emptycart.html ); } 15. ZakoĬcz kod strony: include ( ./includes/footer.html ); 16. Zapisz plik. Tworzenie plików widoku Uwaga Oba pliki widoków musz  byø oczywiĿcie zapisane w katalogu views. Koszyk na zakupy uŞywa dwóch plików widoku: jeden s¨uŞy do wyĿwietlania produktów, a drugi informuje o tym, Şe koszyk jest pusty. Ten ostatni — emptycart.html — jest bardzo prosty (rysunek 9.3): !-- początek bloku -- div class= box alt div class= left-top-corner div class= right-top-corner ´ div class= border-top /div /div /div div class= border-left ´ div class= border-right div class= inner h2 Twój koszyk /h2 p Twój koszyk jest pusty. /p /div /div /div div class= left-bot-corner div class= right-bot-corner ´ div class= border-bot /div /div /div /div !-- koniec bloku -- Rysunek 9.3 Drugi plik widoku jest troch¤ bardziej skomplikowany. Musi wyĿwietlaø wszystkie produkty zwrócone przez procedur¤ sk¨adowan , czyli produkty dodane do koszyka. Jednak lista musi byø formularzem HTML, tak by uŞytkownik móg¨ zaktualizowaø iloĿø. Ponadto kaŞdy produkt powinien byø uzupe¨niony linkami do funkcji usuwania z koszyka i przenoszenia do przechowalni. Poza tym musz  byø obliczane i wyĿwietlane informacje o wartoĿci poszczególnych pozycji koszyka oraz o wartoĿci ca¨ego koszyka (na rysunku 9.4 jest przedstawiona pocz tkowa wersja tego widoku, a koĬcow  moŞna zobaczyø na rysunku 9.1). 280 ~ ROZDZIA’ 9 Rysunek 9.4 1. W edytorze lub IDE utwórz nowy plik HTML i zapisz go w katalogu views pod nazw  cart.html. 2. Rozpocznij blok HTML i nag¨ówek: div class= box alt div class= left-top-corner div class= right-top-corner div class= border-top /div /div /div div class= border-left ´ div class= border-right div class= inner h2 Twój koszyk /h2 p Uĝyj tego formularza do zmiany zawartoĂci koszyka. Moĝesz zmieniÊ iloĂci, ´caïkowicie usunÈÊ produkty z koszyka albo przenieĂÊ je do przechowalni, ´by zamówiÊ je póěniej. Koszt dostawy i obsïugi zamówienia jest podany nad ´wartoĂciÈ koszyka. JeĂli chcesz zïoĝyÊ zamówienie, kliknij przycisk Zïóĝ ´zamówienie. Zostaniesz przeniesiony do bezpiecznej strony, na której ´sfinalizujesz zakupy. /p Przygotowuj c tekst na stron¤ koszyka, musisz go odpowiednio wywaŞyø, by zawiera¨ najwaŞniejsze informacje, ale nie by¨ zbyt d¨ugi. Pami¤taj, Şe podstawow  funkcj  strony koszyka na zakupy jest sk¨onienie klienta do z¨oŞenia zamówienia! 3. Rozpocznij kod formularza: form action= /cart.php method= POST Formularz odsy¨a dane z powrotem do skryptu cart.php za pomoc  metody POST. WartoĿø atrybutu action rozpoczyna si¤ od ukoĿnika, by wskazaø, Şe skrypt cart.php znajduje si¤ w g¨ównym katalogu serwera WWW. Akurat w tym przypadku nie jest on niezb¤dny, ale w wielu innych tak, wi¤c zastosowa¨em go w celu zachowania spójnoĿci i konsekwencji. 4. Rozpocznij definicj¤ tabeli: table border= 0 cellspacing= 8 cellpadding= 6 tr TWORZENIE KOSZYKA NA ZAKUPY ~ 281 th align= center Produkt /th th align= center IloĂÊ /th th align= right Cena /th th align= right WartoĂÊ /th th align= center Opcje /th /tr Do wyĿwietlenia zawartoĿci koszyka stosuj¤ stary, sprawdzony sposób z tabel . W tym przypadku potrzebnych jest pi¤ø kolumn. 5. Rozpocznij blok kodu PHP: ?php $total = 0; W bloku kodu PHP zmienna $total jest inicjowana wartoĿci  0, tak by ca¨kowita wartoĿø koszyka zosta¨a prawid¨owo obliczona. 6. Pobierz kaŞd  pozycj¤ koszyka: while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) { $price = get_just_price($row[ price ], $row[ sale_price ] ); $subtotal = $price * $row[ quantity ]; Wskazówka Ze wzgl¤dów bezpieczeĬstwa cena jest zawsze pobierana z bazy danych, tak by klient nie móg¨ jej w Şaden sposób zmieniø. W p¤tli najpierw jest okreĿlana obowi zuj ca cena, za co odpowiada funkcja get_just_price(), której przekazuje si¤ normaln  i promocyjn  cen¤ produktu. Nast¤pnie jest obliczana wartoĿø danej pozycji koszyka jako iloczyn ceny i iloĿci. 7. WyĿwietl wiersz tabeli: echo tr td . $row[ category ] . :: . $row[ name ] . /td td align= center input type= text name= quantity[ . $row[ sku ] . ] ´value= . $row[ quantity ] . size= 2 / /td td align= right . $price . zï /td td align= right . number_format($subtotal, 2) . zï /td td align= right a href= /wishlist.php?sku= . $row[ sku ] . action=move qty= . ´$row[ quantity ] . PrzenieĂ do przechowalni /a br / a href= /cart.php?sku= . ´$row[ sku ] . action=remove Usuñ z koszyka /a /td /tr ; Dla kaŞdej pozycji koszyka jest tworzony osobny wiersz tabeli. W pierwszej kolumnie jest wyĿwietlana nazwa, która sk¨ada si¤ z nazwy kategorii i produktu, tak samo, jak by¨o na stronach z produktami. W drugiej kolumnie znajduje si¤ iloĿø, przy czym jest to wartoĿø, któr  moŞna edytowaø, wi¤c jest wyĿwietlana w polu formularza. Nazwa kaŞdego pola jest tworzona wed¨ug schematu quantity[sku], wi¤c po wys¨aniu formularza b¤dzie dost¤pna wartoĿø zarówno SKU, jak i nowo ustawionej iloĿci (rysunek 9.5). 282 ~ ROZDZIA’ 9 Rysunek 9.5 W dwóch kolejnych kolumnach jest wyĿwietlana cena i wartoĿø. W pi tej kolumnie s  umieszczone dwa linki. Pierwszy s¨uŞy do przenoszenia pozycji koszyka do przechowalni i przekazuje skryptowi wishlist.php wartoĿø SKU, bieŞ c  iloĿø i akcj¤ move. Drugi link prowadzi do tego samego skryptu (cart.php) i powoduje usuni¤cie pozycji z koszyka. 8. Dodaj komunikat o b¨¤dzie, jeĿli w magazynie nie ma wystarczaj cej iloĿci produktu: if ($row[ stock ] $row[ quantity ] ) { echo tr class= error td colspan= 5 align= center W magazynie zostaïo ´tylko . $row[ stock ] . sztuk produktu . $row[ name ] . . Zmieñ iloĂÊ ´okreĂlonÈ w zamówieniu, usuñ caïkowicie tÚ pozycjÚ lub przenieĂ jÈ do ´przechowalni. /td /tr ; } JeĿli klient chce zamówiø wi¤cej sztuk jakiegoĿ produktu, niŞ aktualnie jest w magazynie, musi zostaø powiadomiony o problemie (rysunek 9.6). W takiej sytuacji klient poznaje stan magazynowy i jest proszony o samodzielne rozwi zanie problemu. W kolejnym rozdziale zmodyfikujesz kod, tak by produkty, których jest za ma¨o, by¨y automatycznie usuwane z zamówienia. Rysunek 9.6 9. Do zmiennej $total dodaj wartoĿø pozycji ($subtotal) i zakoĬcz p¤tl¤: $total += $subtotal; } // Koniec pĊtli WHILE 10. W tabeli wyĿwietl ca¨kowit  wartoĿø koszyka ($total) i zakoĬcz blok kodu PHP: echo tr td colspan= 3 align= right strong WartoĂÊ /strong /td td align= right $ . number_format($total, 2) . /td td nbsp; /td /tr ; ? TWORZENIE KOSZYKA NA ZAKUPY ~ 283 11. ZakoĬcz definicj¤ tabeli i utwórz dwa przyciski: /table br / p align= center input type= submit value= Aktualizuj koszyk class= button / /form /p br / p align= center a href= https:// ?php echo BASE_URL; ? checkout.php?session= ´ ?php echo $uid; ? class= button Zïóĝ zamówienie /a /p /div Pierwszy przycisk s¨uŞy do przes¨ania formularza (w celu zaktualizowania iloĿci). Klikni¤cie drugiego przycisku powoduje rozpocz¤cie procesu finalizowania zamówienia. Link ten kieruje do skryptu checkout.php poprzez bezpieczne po¨ czenie HTTPS. Aby wygenerowaø adres, jest wymagana wartoĿø sta¨ej BASE_URL. Zwróø uwag¤, Şe w adresie jest przekazywany identyfikator sesji uŞytkownika, tak wi¤c w skrypcie checkout.php b¤dzie moŞna z niego skorzystaø. O tym, Şe jest to niezb¤dne, przekonasz si¤ w kolejnym rozdziale. Uwaga Proces finalizowania zamówienia musi si¤ odbywaø na bezpiecznych stronach, tak by klient czu¨ si¤ bezpiecznie! 12. ZakoĬcz kod strony: /div /div div class= left-bot-corner div class= right-bot-corner ´ div class= border-bot /div /div /div /div !-- koniec bloku -- 13. Zapisz plik i przetestuj go w przegl darce internetowej. Ca¨a funkcjonalnoĿø witryny, z wyj tkiem przechowalni, powinna juŞ dzia¨aø, wi¤c moŞesz j  przetestowaø. W sklepie moŞesz juŞ dodawaø produkty do koszyka, a na stronie koszyka moŞesz aktualizowaø iloĿø produktów i je usuwaø. BUDOWANIE PRZECHOWALNI Procedury sk¨adowane uŞywane w zarz dzaniu przechowalni  s  w zasadzie identyczne z tymi, które s  stosowane w koszyku na zakupy. To samo dotyczy skryptu PHP i plików HTML — b¤d  prawie wiernymi kopiami juŞ napisanych. Przedstawi¤ je tu w ca¨oĿci, wi¤c jeĿli chcesz poznaø szczegó¨y, wróø do opisu ich odpowiedników dla koszyka na zakupy. Tworzenie skryptu PHP Skrypt wishlist.php zapisany w g¨ównym katalogu serwera WWW róŞni si¤ od cart.php tylko czterema elementami: „ tytu¨em strony, „ nazw  wywo¨ywanej procedury sk¨adowanej, „ innymi plikami widoków, „ brakiem instrukcji warunkowej sprawdzaj cej dodawanie produktów. 284 ~ ROZDZIA’ 9 Tak naprawd¤, poza ostatni  róŞnic , skrypt dla przechowalni moŞesz przygotowaø metod  „wyszukaj i zamieĬ”, traktuj c jako baz¤ kod skryptu cart.php. Ostatnia róŞnica polega na tym, Şe w tym skrypcie produkty s  dodawane do przechowalni przez przeniesienie ich z koszyka na zakupy. ?php // wishlist.php require ( ./includes/config.inc.php ); if (isset($_COOKIE[ SESSION ] )) { $uid = $_COOKIE[ SESSION ]; } else { $uid = md5(uniqid( biped ,true)); } setcookie( SESSION , $uid, time( )+(60*60*24*30)); $page_title = Kawy Ăwiata - przechowalnia ; include ( ./includes/header.html ); require (MYSQL); include ( ./includes/product_functions.inc.php ); if (isset($_GET[ sku ] )) { list($sp_type, $pid) = parse_sku($_GET[ sku ] ); } if (isset ($sp_type, $pid, $_GET[ action ] ) ($_GET[ action ] == remove )) { $r = mysqli_query($dbc, CALL remove_from_wish_list( $uid , $sp_type , $pid) ); } elseif (isset ($sp_type, $pid, $_GET[ action ], $_GET[ qty ] ) ($_GET[ action ] ´== move ) ) { $qty = (filter_var($_GET[ qty ], FILTER_VALIDATE_INT, array( min_range = 1))) ´? $_GET[ qty ] : 1; $r = mysqli_query($dbc, CALL add_to_wish_list( $uid , $sp_type , $pid, $qty) ); $r = mysqli_query($dbc, CALL remove_from_cart( $uid , $sp_type , $pid) ); } elseif (isset($_POST[ quantity ] )) { foreach ($_POST[ quantity ] as $sku = $qty) { list($sp_type, $pid) = parse_sku($sku); if (isset($sp_type, $pid)) { $qty = (filter_var($qty, FILTER_VALIDATE_INT, array( min_range = 0))) ? ´$qty : 1; $r = mysqli_query($dbc, CALL update_wish_list( $uid , $sp_type , $pid, ´$qty) ); } } } $r = mysqli_query($dbc, CALL get_wish_list_contents( $uid ) ); if (mysqli_num_rows($r) 0) { include ( ./views/wishlist.html ); } else { include ( ./views/emptylist.html ); } include ( ./includes/footer.html ); ? TWORZENIE KOSZYKA NA ZAKUPY ~ 285 Tworzenie plików widoku Uwaga OczywiĿcie oba pliki widoku musz  byø zapisane w katalogu views. Gdy przechowalnia klienta jest pusta, uŞywany jest plik widoku emptylist.html (rysunek 9.7). Rysunek 9.7 !-- początek bloku -- div class= box alt div class= left-top-corner div class= right-top-corner ´ div class= border-top /div /div /div div class= border-left ´ div class= border-right div class= inner h2 Twoja przechowalnia /h2 p Twoja przechowalnia jest pusta. /p /div /div /div div class= left-bot-corner div class= right-bot-corner ´ div class= border-bot /div /div /div /div !-- koniec bloku -- Plik widoku wishlist.html wyĿwietla list¤ produktów w tabeli HTML. Podobnie jak w koszyku na zakupy, tu równieŞ zawartoĿø listy moŞna modyfikowaø na kilka sposobów: „ zmieniaj c iloĿø produktów, „ przenosz c do koszyka na zakupy, „ usuwaj c z przechowalni. Inaczej niŞ w skrypcie koszyka, na stronie przechowalni nie s  wyĿwietlane ani informacje o wartoĿci wszystkich produktów, ani link do strony zatwierdzania zamówienia (rysunek 9.8). Z kolei zamiast informowania o niewystarczaj cym stanie magazynowym na stronie przechowalni pojawia si¤ jedynie komunikat z informacj  o koĬcz cych si¤ zapasach, co w zamyĿle ma sk¨oniø klienta do natychmiastowego zamówienia danego produktu (rysunek 9.9). div class= box alt div class= left-top-corner div class= right-top-corner ´ div class= border-top /div /div /div div class= border-left ´ div class= border-right div class= inner h2 Twoja przechowalnia /h2 p Uĝyj tego formularza do zmiany zawartoĂci przechowalni. Moĝesz zmieniÊ iloĂci, ´caïkowicie usunÈÊ produkty z przechowalni albo przenieĂÊ je do koszyka na zakupy. /p form action= /wishlist.php method= POST table border= 0 cellspacing= 8 cellpadding= 6 286 ~ ROZDZIA’ 9 Rysunek 9.8 Rysunek 9.9 tr th align= center Produkt /th th align= center IloĂÊ /th th align= right Cena /th th align= right WartoĂÊ /th th align= center Opcje /th /tr ?php while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) { $price = get_just_price($row[ price ], $row[ sale_price ] ); $subtotal = $price * $row[ quantity ]; echo tr td . $row[ category ] . :: . $row[ name ] . /td td align= center input type= text name= quantity[ . $row[ sku ] . ] ´value= . $row[ quantity ] . size= 2 / /td td align= right $ . number_format($price, 2) . /td td align= right $ . number_format($subtotal, 2) . /td td align= right a href= /cart.php?sku= . $row[ sku ] . action=move qty= . ´$row[ quantity ] . PrzenieĂ do koszyka /a br / a href= /wishlist.php? ´sku= . $row[ sku ] . action=remove Usuñ z przechowalni /a /td /tr ; // SprawdĨ status: if ( ($row[ stock ] 0) ($row[ stock ] 10)) { echo tr class= error td colspan= 5 align= center W magazynie zostaïo ´tylko . $row[ stock ] . sztuk produktu . $row[ name ] . . /td /tr ; } TWORZENIE KOSZYKA NA ZAKUPY ~ 287 } // Koniec pĊtli WHILE. ? /table p align= center input type= submit value= Aktualizuj przechowalniÚ ´class= button / /form /p /div /div /div div class= left-bot-corner ´ div class= right-bot-corner div class= border-bot /div /div /div /div !--koniec bloku -- OBLICZANIE KOSZTÓW WYSY’KI Do koszyka warto dodaø przydatn  funkcj¤ podaj c  koszt wysy¨ki. Dla wielu klientów op¨aty za transport i obs¨ug¤ zamówienia s  istotnym czynnikiem, który moŞe decydowaø o dokonaniu zakupu. Koszty te mog  byø sta¨e lub moŞna je uzaleŞniø od: „ wagi przesy¨anych produktów, „ odleg¨oĿci mi¤dzy nadawc  a odbiorc , „ wymiarów paczki (przes¨anie np. mebli wi Şe si¤ z duŞymi kosztami), „ wielkoĿci zamówienia. W witrynie zostanie zastosowane ostatnie kryterium. Przede wszystkim musisz zdefiniowaø funkcj¤ obliczaj c  koszty wysy¨ki wed¨ug ustalonej zaleŞnoĿci. Za¨óŞmy, Şe ustalamy pewien bazowy koszt, który trzeba przeznaczyø na wynagrodzenie pracownika kompletuj cego i pakuj cego zamówienie. Do tego naleŞy doliczyø koszt cz¤Ŀciowo zaleŞny od wielkoĿci zamówienia — co prawda wi¤ksze zamówienia wi Ş  si¤ z wi¤ksz  i ci¤Şsz  przesy¨k , jednak równieŞ wi¤cej si¤ na nich zarabia. Z tego wzgl¤du koszty wysy¨ki zdefiniujemy tak, by by¨y odwrotnie proporcjonalne do wielkoĿci zamówienia (okreĿlanego na podstawie ca¨kowitej wartoĿci zamówienia). W zwi zku z tym funkcja moŞe wygl daø nast¤puj co: function get_shipping($total = 0) { // Ustal bazowe koszty obsáugi zamówienia: $shipping = 3; // Ustal wspóáczynnik zaleĪny od caákowitej wartoĞci zamówienia: if ($total 50) { $rate = .25; } elseif ($total 100) { $rate = .20; } elseif ($total 200) { $rate = .18; } elseif ($total 500) { $rate = .16; } else { $rate = .15; } // Oblicz caákowity koszt przesyáki: $shipping = $shipping + ($total * $rate); // Zwróü caákowity koszt przesyáki: return number_format($shipping, 2); } // Koniec funkcji get_shipping( ). 288 ~ ROZDZIA’ 9 Jak si¤ moŞesz domyĿlaø, funkcj¤ naleŞy umieĿciø w pliku product_functions.inc.php, tak by by¨a dost¤pna dla wielu skryptów (np. cart.php czy checkout.php, który zostanie utworzony w kolejnym rozdziale). Aby skorzystaø z tej funkcji w skrypcie cart.php (w przechowalni nie jest wyĿwietlana ca¨kowita wartoĿø zamówienia), dodaj poniŞszy kod przed wierszem wyĿwietlaj cym ca¨kowit  wartoĿø koszyka (rysunek 9.10). Rysunek 9.10 $shipping = get_shipping($total); $total += $shipping; echo tr td colspan= 3 align= right strong Transport i obsïuga /strong /td td align= right . $shipping . zï /td td nbsp; /td /tr ; SKOROWIDZ ?=, 114 127.0.0.1, 57 777, 150 A Account, 345 Add Bank Account, 173 Credit Card, 173 add_to_cart, 277 addslashes, 83, 309, 328, 339 administracja witryn , 347 administrator, 107 kontakt, 36 konto, 133 uprawnienia, 57 Adobe Dreamweaver, 16 adres, 301, 309, 329 e-mail, 203, 301, 311, 320 walidacja, 113, 119 klienta, 312 mechanizm przepisywania, 215 pocztowy, 203 przyjazny, 212 URL, 212 witryny, 84 weryfikacja, 34 Advanced Integration Method, 290, 292 PHP Debugger, 41 After how many cycles should billing stop?, 175 AIM, 290, 292, 335, 337 aktualizowanie koszyka, 272 aktywacja konta, 117 SSL, 215 algorytm tworzenia skrótów, 105 allow, 211 ALTER, 58 ROUTINE, 228, 260 Alternative PHP Cache, 41 American Express, 23 numer karty, 328 anonimowa funkcja, 353 anulowanie p¨atnoĿci, 176 Apache, 15, 16, 54, 348 ApacheBench, 40 APC, 41 APD, 41 Aptana Studio, 16 argument nazwa, 300 procedura sk¨adowana, 241 wchodz cy, 300 wychodz cy, 300 asercje sprawdzaj ce nast¤pstwo znaków, 114 atak brute force, 65 CSRF, 68 DoS, 65 hakerów, , 47, 56 przez wstrzykiwanie kodu SQL, 82 przez wymuszanie sesji, 131 si¨owy, 65 s¨ownikowy, 105 SQL Injection, 66 wzrost zagroŞenia, 47 XSS, 64, 137 zapobieganie, 65 Authorize.net, 32, 289, 330, 332, 337 konto rzeczywiste, 345 pola odpowiedzi, 338 testowania funkcji, 292 uruchomienie systemu p¨atnoĿci, 345 autoryzowanie p¨atnoĿci, 338 B back_log, 38 backtrace, 85 basename, 91 390 ~ E-COMMERCE. GENIALNIE PROSTE TWORZENIE SERWISÓW W PHP I MYSQL baza danych, 57, 269 bezpieczeĬstwo, 58 blo
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

E-commerce. Genialnie proste tworzenie serwisów w PHP i MySQL
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ą: