Darmowy fragment publikacji:
Tytuł oryginału: Learning PHP, MySQL JavaScript, 4th Edition
Tłumaczenie: Piotr Cieślak
ISBN: 978-83-283-0842-8
© 2015 Helion S.A.
Authorized Polish translation of the English edition of Learning PHP, MySQL JavaScript, 4th Edition,
ISBN 9781491918661 © 2015 Robin Nixon.
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.
Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane
z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie
ponoszą 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)
Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/phmyj4
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.
Pliki z przykładami omawianymi w książce można znaleźć pod adresem:
ftp://ftp.helion.pl/przyklady/phmyj4.zip
Printed in Poland.
• Kup książkę
• Poleć książkę
• Oceń książkę
• Księgarnia internetowa
• Lubię to! » Nasza społeczność
Spis tre(cid:316)ci
HTTP i HTML: podstawy wynalazku Bernersa-Lee
Procedura (cid:276)(cid:241)danie/odpowied(cid:274)
Zalety PHP, MySQL, JavaScriptu, CSS i HTML5
Zastosowanie PHP
Zastosowanie MySQL
Zastosowanie JavaScriptu
Zastosowanie CSS
I HTML5 na dok(cid:228)adk(cid:246)
Serwer WWW Apache
Kilka s(cid:228)ów o Open Source
Zgrany zespó(cid:228)
Pytania
Przedmowa .................................................................................................................. 21
1. Wst(cid:253)p do dynamicznych stron internetowych ..........................................................25
26
26
28
29
30
31
32
33
34
35
35
37
2. Konfigurowanie serwera ............................................................................................39
39
40
47
49
49
50
50
50
51
51
52
54
3. Wst(cid:253)p do PHP ...............................................................................................................55
55
56
WAMP, MAMP, LAMP — a có(cid:276) to takiego?
Instalowanie pakietu XAMPP w systemie Windows
Dodawanie elementów PHP do kodu HTML
Przyk(cid:228)ady z tej ksi(cid:241)(cid:276)ki
Testowanie instalacji
Instalowanie pakietu XAMPP w Mac OS X
Dost(cid:246)p do g(cid:228)ównego foldera
Instalowanie pakietu LAMP pod Linuksem
Praca zdalna
Logowanie
Obs(cid:228)uga FTP
Obs(cid:228)uga edytora kodu
Obs(cid:228)uga (cid:264)rodowiska IDE
Pytania
5
Kup książkęPoleć książkęPytania
Wyra(cid:276)enia
Prawda czy fa(cid:228)sz?
Litera(cid:228)y i zmienne
Operatory
Priorytet operatorów
Asocjacyjno(cid:264)(cid:232)
Operatory relacji
Wyra(cid:276)enia warunkowe
P(cid:246)tle
Sk(cid:228)adnia PHP
Zastosowanie komentarzy
Podstawowa sk(cid:228)adnia
Zmienne
Operatory
Przypisywanie warto(cid:264)ci zmiennym
Instrukcje wielowierszowe
Deklaracja typu zmiennych
Sta(cid:228)e
Sta(cid:228)e predefiniowane
Ró(cid:276)nica mi(cid:246)dzy instrukcjami echo i print
Funkcje
Zasi(cid:246)g zmiennych
57
57
58
59
63
66
68
70
71
71
72
73
74
78
4. Wyra(cid:348)enia i sterowanie dzia(cid:293)aniem programu w PHP .............................................. 81
81
81
83
84
84
86
87
91
91
92
93
95
97
98
98
100
101
102
103
104
105
105
106
5. Funkcje i obiekty w PHP ............................................................................................. 107
107
109
110
111
111
113
114
Definiowanie funkcji
Zwracanie warto(cid:264)ci
Zwracanie tablicy
Nie przekazuj argumentów przez referencj(cid:246)
Zwracanie zmiennych globalnych
Przypomnienie informacji o zasi(cid:246)gu zmiennych
Rzutowanie jawne i niejawne
Dynamiczne linkowanie w PHP
Dynamiczne linkowanie w praktyce
Pytania
P(cid:246)tla while
P(cid:246)tla do … while
P(cid:246)tla for
Przerywanie p(cid:246)tli
Instrukcja continue
Instrukcja if
Instrukcja else
Instrukcja elseif
Instrukcja switch
Operator ?
Funkcje PHP
6
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęDo(cid:228)(cid:241)czanie i wymaganie plików
Pytania
Prosty dost(cid:246)p
is_array
count
sort
shuffle
explode
extract
compact
reset
end
Pytania
Instrukcja include
Zastosowanie instrukcji include_once
Zastosowanie instrukcji require i require_once
Sprawdzanie zgodno(cid:264)ci wersji PHP
Obiekty w PHP
Terminologia
Deklarowanie klasy
Tworzenie obiektu
Odwo(cid:228)ywanie si(cid:246) do obiektów
Klonowanie obiektów
Konstruktory
Destruktory w PHP 5
Tworzenie metod
Metody statyczne w PHP 5
Deklarowanie w(cid:228)a(cid:264)ciwo(cid:264)ci
Deklarowanie sta(cid:228)ych
Zasi(cid:246)g w(cid:228)a(cid:264)ciwo(cid:264)ci i metod w PHP 5
W(cid:228)a(cid:264)ciwo(cid:264)ci i metody statyczne
Dziedziczenie
114
114
114
115
115
116
116
118
118
119
120
121
122
122
123
123
124
124
125
126
130
6. Tablice w PHP ..............................................................................................................131
131
131
133
133
134
136
139
139
139
139
140
140
141
142
143
143
143
7. PHP w praktyce .......................................................................................................... 145
145
146
148
149
149
150
150
Tablice indeksowane numerycznie
Tablice asocjacyjne
Dodawanie pozycji do tablicy przy u(cid:276)yciu s(cid:228)owa kluczowego array
Zastosowanie funkcji printf
Okre(cid:264)lanie precyzji
Dope(cid:228)nianie (cid:228)a(cid:254)cuchów tekstowych
Zastosowanie funkcji sprintf
Funkcje do obs(cid:228)ugi daty i czasu
Sta(cid:228)e zwi(cid:241)zane z dat(cid:241)
Zastosowanie funkcji checkdate
P(cid:246)tla foreach … as
Tablice wielowymiarowe
Zastosowanie funkcji do obs(cid:228)ugi tablic
Spis tre(cid:316)ci
(cid:95)
7
Kup książkęPoleć książkęObs(cid:228)uga plików
Podstawy MySQL
Podsumowanie poj(cid:246)(cid:232) dotycz(cid:241)cych baz danych
Dost(cid:246)p do MySQL z poziomu wiersza polece(cid:254)
Uruchamianie wiersza polece(cid:254)
Obs(cid:228)uga serwera z poziomu wiersza polece(cid:254)
Instrukcje MySQL
Typy danych
Sprawdzanie istnienia pliku
Tworzenie pliku
Odczytywanie zawarto(cid:264)ci plików
Kopiowanie plików
Przenoszenie pliku
Kasowanie pliku
Aktualizowanie plików
Ochrona plików przed wielokrotnym otwarciem
Odczytywanie ca(cid:228)ego pliku
Wysy(cid:228)anie plików
152
152
152
153
155
155
155
156
157
158
159
163
165
166
8. Wst(cid:253)p do MySQL ....................................................................................................... 167
167
168
168
168
172
173
177
185
185
190
198
201
201
201
203
9. Zaawansowana obs(cid:293)uga MySQL ..............................................................................205
205
206
207
207
209
212
214
214
214
215
216
217
217
218
219
Projektowanie bazy
Klucze g(cid:228)ówne, czyli kluczowy element relacyjnych baz danych
Normalizacja
Funkcje MySQL
Dost(cid:246)p do MySQL za po(cid:264)rednictwem aplikacji phpMyAdmin
Pytania
Tworzenie indeksu
Tworzenie zapyta(cid:254) do bazy MySQL
(cid:227)(cid:241)czenie tabel
Zastosowanie operatorów logicznych
Pierwsza posta(cid:232) normalna
Druga posta(cid:232) normalna
Trzecia posta(cid:232) normalna
Kiedy nie stosowa(cid:232) normalizacji
Relacje
Jeden do jednego
Jeden do wielu
Wiele do wielu
Bazy danych i anonimowo(cid:264)(cid:232)
Transakcje
Wywo(cid:228)ania systemowe
XHTML czy HTML5?
Pytania
Indeksy
Mechanizmy sk(cid:228)adowania danych z obs(cid:228)ug(cid:241) transakcji
Instrukcja BEGIN
8
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęTworzenie zapyta(cid:254) do bazy MySQL za po(cid:264)rednictwem PHP
Pytania
Proces
Tworzenie pliku logowania
Nawi(cid:241)zywanie po(cid:228)(cid:241)czenia z MySQL
Praktyczny przyk(cid:228)ad
Tablica $_POST
Usuwanie rekordu
Wy(cid:264)wietlanie formularza
Wysy(cid:228)anie zapyta(cid:254) do bazy danych
Dzia(cid:228)anie programu
Instrukcja COMMIT
Instrukcja ROLLBACK
Instrukcja EXPLAIN
Archiwizacja i przywracanie danych
Instrukcja mysqldump
Tworzenie pliku z kopi(cid:241) zapasow(cid:241)
Odtwarzanie danych z pliku kopii zapasowej
Zapisywanie danych w formacie CSV
Planowanie tworzenia kopii zapasowych
219
219
220
221
221
222
224
225
225
226
10. Korzystanie z MySQL za po(cid:316)rednictwem PHP ..........................................................227
227
227
228
229
233
235
236
237
237
238
239
239
240
241
241
242
242
243
243
245
246
247
248
249
251
252
11. Obs(cid:293)uga formularzy ...................................................................................................253
253
254
256
257
258
264
266
MySQL w praktyce
Tworzenie tabeli
Wy(cid:264)wietlanie informacji o tabeli
Usuwanie tabeli
Dodawanie danych
Odczytywanie danych
Aktualizowanie danych
Usuwanie danych
Zastosowanie opcji AUTO_INCREMENT
Wykonywanie zapyta(cid:254) pomocniczych
Zapobieganie próbom ataków
Dzia(cid:228)ania prewencyjne
Zastosowanie elementów zast(cid:246)pczych
Zapobieganie przekazywaniu niepo(cid:276)(cid:241)danych danych przez HTML
Opcja register_globals — rozwi(cid:241)zanie przestarza(cid:228)e, ale wci(cid:241)(cid:276) spotykane
Warto(cid:264)ci domy(cid:264)lne
Rodzaje pól
Oczyszczanie danych wej(cid:264)ciowych
Proceduralny wariant zastosowania mysqli
Pytania
Tworzenie formularzy
Odczytywanie przes(cid:228)anych danych
Przyk(cid:228)adowy program
Spis tre(cid:316)ci
(cid:95)
9
Kup książkęPoleć książkęFunkcje oczekuj(cid:241)ce na pe(cid:228)n(cid:241) implementacj(cid:246)
Pytania
Zastosowanie ciasteczek w PHP
Tworzenie ciasteczka
Dost(cid:246)p do ciasteczka
Usuwanie ciasteczek
Autoryzacja HTTP
Przechowywanie loginów i hase(cid:228)
„Solenie”
Obs(cid:228)uga sesji
Co nowego w HTML5?
Atrybut autocomplete
Atrybut autofocus
Atrybut placeholder
Atrybut required
Atrybuty nadpisania
Atrybuty width i height
Atrybut form
Atrybut list
Atrybuty min oraz max
Atrybut step
Pole wej(cid:264)ciowe typu color
Pola wej(cid:264)ciowe typu number i range
Selektory daty i czasu
268
269
269
269
269
270
270
270
270
271
271
271
272
272
272
272
12. Ciasteczka, sesje i autoryzacja ..................................................................................275
275
276
277
277
278
281
281
285
285
288
289
289
292
13. Zapoznanie z JavaScriptem .......................................................................................293
293
295
295
296
297
299
299
299
300
300
300
301
301
302
302
Zastosowanie skryptów w nag(cid:228)ówku dokumentu
Starsze i niestandardowe przegl(cid:241)darki
Do(cid:228)(cid:241)czanie plików JavaScript
Debugowanie kodu JavaScript
Zastosowanie komentarzy
(cid:263)redniki
Zmienne
Zmienne znakowe
Zmienne numeryczne
Tablice
Operatory
Inicjowanie sesji
Ko(cid:254)czenie sesji
Okre(cid:264)lanie czasu trwania sesji
Bezpiecze(cid:254)stwo sesji
Operatory arytmetyczne
Operatory przypisania
Operatory porównania
Pytania
JavaScript i tekst w HTML
10
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęKilka s(cid:228)ów o document.write
Ale to nie takie proste…
Kolejne zastosowanie symbolu $
Zastosowanie obiektowego modelu dokumentu
Zastosowanie funkcji console.log
Zastosowanie funkcji alert
Umieszczanie tekstu w elementach HTML
Zastosowanie funkcji document.write
Operatory logiczne
Inkrementacja i dekrementacja zmiennych
Konkatenacja (cid:228)a(cid:254)cuchów znaków
Znaki modyfikuj(cid:241)ce
Typowanie zmiennych
Funkcje
Zmienne globalne
Zmienne lokalne
Obiektowy model dokumentu
302
303
303
303
304
305
305
306
307
308
309
309
310
310
311
311
311
312
14. Wyra(cid:348)enia i sterowanie dzia(cid:293)aniem programu w JavaScripcie .............................. 313
313
314
315
315
316
316
319
320
321
322
322
322
323
324
325
325
326
326
327
327
328
329
15. Funkcje, obiekty i tablice w JavaScripcie .................................................................. 331
331
331
332
Wyra(cid:276)enia
Litera(cid:228)y i zmienne
Operatory
Priorytet operatorów
Asocjacyjno(cid:264)(cid:232)
Operatory relacji
Instrukcja with
Zdarzenie onerror
Konstrukcja try … catch
Wyra(cid:276)enia warunkowe
Funkcje w JavaScripcie
Definiowanie funkcji
Tablica arguments
Pytania
Instrukcja if
Instrukcja else
Instrukcja switch
Operator ?
P(cid:246)tle
P(cid:246)tle while
P(cid:246)tle do … while
P(cid:246)tle for
Przerywanie p(cid:246)tli
Instrukcja continue
Typowanie jawne
Pytania
Spis tre(cid:316)ci
(cid:95)
11
Kup książkęPoleć książkęWeryfikowanie wprowadzonych danych przy u(cid:276)yciu JavaScriptu
Dokument validate.html (cz(cid:246)(cid:264)(cid:232) pierwsza)
Dokument validate.html (cz(cid:246)(cid:264)(cid:232) druga)
Wyra(cid:276)enia regularne
Zwracanie warto(cid:264)ci
Zwracanie tablicy
Obiekty w JavaScripcie
Deklarowanie klasy
Tworzenie obiektu
Dost(cid:246)p do obiektów
S(cid:228)owo kluczowe prototype
Tablice w JavaScripcie
Tablice numeryczne
Tablice asocjacyjne
Tablice wielowymiarowe
Zastosowanie metod do obs(cid:228)ugi tablic
333
334
335
335
337
337
337
339
340
341
341
342
346
16. Weryfikacja danych i obs(cid:293)uga b(cid:293)(cid:253)dów w JavaScripcie i PHP ...................................349
349
350
352
355
355
356
357
357
358
358
358
361
362
362
363
364
369
17. Zastosowanie technologii Ajax ..................................................................................371
372
372
374
378
380
384
385
18. Wst(cid:253)p do CSS .............................................................................................................387
388
388
389
389
Dopasowywanie za pomoc(cid:241) metaznaków
Dopasowanie „rozmyte”
Grupowanie przy u(cid:276)yciu nawiasów
Klasy znaków
Okre(cid:264)lanie zakresu
Zaprzeczenie
Kilka bardziej skomplikowanych przyk(cid:228)adów
Podsumowanie metaznaków
Modyfikatory ogólne
Zastosowanie wyra(cid:276)e(cid:254) regularnych w JavaScripcie
Zastosowanie wyra(cid:276)e(cid:254) regularnych w PHP
Twój pierwszy program Ajax
Zastosowanie metody GET zamiast POST
Przesy(cid:228)anie (cid:276)(cid:241)da(cid:254) XML
Zastosowanie platform Ajax
Importowanie arkusza stylów
Importowanie stylów CSS z poziomu HTML
Style zagnie(cid:276)d(cid:276)one
Zastosowanie identyfikatorów ID
Ponowne wy(cid:264)wietlenie formularza po weryfikacji w PHP
Pytania
Czym jest Ajax?
Zastosowanie obiektu XMLHttpRequest
Pytania
Pytania
12
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęZastosowanie klas
Zastosowanie (cid:264)redników
Regu(cid:228)y CSS
Wiele deklaracji
Zastosowanie komentarzy
Rodzaje stylów
Style domy(cid:264)lne
Style u(cid:276)ytkownika
Zewn(cid:246)trzne arkusze stylów
Style wewn(cid:246)trzne
Style bezpo(cid:264)rednie
Selektory CSS
Selektor typu
Selektor potomka
Selektor dziecka
Selektor identyfikatora
Selektor klasy
Selektor atrybutu
Selektor uniwersalny
Selekcja grupowa
Dziedziczenie kaskadowe
(cid:273)ród(cid:228)a stylów
Metody definiowania regu(cid:228)
Selektory arkuszy stylów
Obliczanie specyficzno(cid:264)ci
Ró(cid:276)nica mi(cid:246)dzy elementami div i span
Jednostki miar
Fonty i typografia
font-family
font-style
font-size
font-weight
Zarz(cid:241)dzanie stylami tekstu
Efekty tekstowe
Odst(cid:246)py
Wyrównanie
Wielko(cid:264)(cid:232) znaków
Wci(cid:246)cia
Kolory w CSS
Skrócone okre(cid:264)lenia kolorów
Gradienty
Rozmieszczanie elementów
Po(cid:228)o(cid:276)enie bezwzgl(cid:246)dne
Po(cid:228)o(cid:276)enie wzgl(cid:246)dne
Po(cid:228)o(cid:276)enie sta(cid:228)e
Pseudoklasy
Skracanie regu(cid:228)
389
389
390
390
391
391
392
392
393
393
393
393
393
393
394
395
396
396
397
398
398
398
399
399
400
401
403
405
405
406
406
407
407
407
408
408
408
408
408
409
410
411
411
412
412
413
415
Spis tre(cid:316)ci
(cid:95)
13
Kup książkęPoleć książkęDopasowywanie fragmentów (cid:228)a(cid:254)cuchów
Selektory atrybutów
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) box-sizing
T(cid:228)a w CSS3
Wiele obrazów w tle
Ramki w CSS3
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) border-color
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) border-radius
Cienie
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) overflow
Uk(cid:228)ad wielokolumnowy
Kolory i przezroczysto(cid:264)(cid:232)
Definiowanie marginesów
Definiowanie ramek
Definiowanie odst(cid:246)pu
Zawarto(cid:264)(cid:232) obiektu
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) background-clip
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) background-origin
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) background-size
Zastosowanie w(cid:228)a(cid:264)ciwo(cid:264)ci auto
416
416
418
419
420
420
19. Zaawansowane regu(cid:293)y CSS w CSS3 ..........................................................................423
423
423
425
425
425
427
427
428
428
430
430
430
433
434
434
435
436
436
437
437
437
438
438
438
439
439
440
441
442
443
443
444
444
444
445
446
20. Dost(cid:253)p do CSS z poziomu JavaScriptu ..................................................................... 449
449
449
450
W(cid:228)a(cid:264)ciwo(cid:264)ci przej(cid:264)(cid:232)
Czas trwania przej(cid:264)cia
Opó(cid:274)nienie przej(cid:264)cia
Dynamika przej(cid:264)cia
Skrócona sk(cid:228)adnia
Efekty tekstowe
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) text-shadow
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) text-overflow
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) word-wrap
Kolory HSL
Kolory HSLA
Kolory RGB
Kolory RGBA
W(cid:228)a(cid:264)ciwo(cid:264)(cid:232) opacity
Fonty internetowe
Fonty Google
Przekszta(cid:228)cenia
Przekszta(cid:228)cenia 3D
Przej(cid:264)cia
Ponowne spotkanie z funkcj(cid:241) getElementById
Model pude(cid:228)kowy i uk(cid:228)ad strony
Pytania
Pytania
Funkcja O
Funkcja S
14
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęPytania
Dlaczego jQuery?
Do(cid:228)(cid:241)czanie jQuery
Funkcja C
Do(cid:228)(cid:241)czanie opisanych funkcji
Dost(cid:246)p do w(cid:228)a(cid:264)ciwo(cid:264)ci CSS z poziomu JavaScriptu
Usuwanie elementów
Inne sposoby na dodawanie i usuwanie elementów
Zastosowanie przerwa(cid:254)
Niektóre typowe w(cid:228)a(cid:264)ciwo(cid:264)ci
Inne w(cid:228)a(cid:264)ciwo(cid:264)ci
JavaScript w kodzie HTML
S(cid:228)owo kluczowe this
(cid:227)(cid:241)czenie zdarze(cid:254) i obiektów w skrypcie
Odwo(cid:228)ywanie si(cid:246) do innych zdarze(cid:254)
Dodawanie nowych elementów
Zastosowanie przerwania setTimeout
Anulowanie opó(cid:274)nienia
Zastosowanie przerwania setInterval
Animacje na bazie przerwa(cid:254)
451
451
452
452
453
455
455
456
456
457
459
459
460
460
461
461
463
464
21. Wprowadzenie do jQuery .........................................................................................467
467
468
468
469
469
470
471
471
471
472
473
473
474
474
474
474
475
476
477
477
478
479
480
481
482
484
485
486
Zdarzenia blur i focus
S(cid:228)owo kluczowe this
Zdarzenia click i dblclick
Zdarzenie keypress
Przemy(cid:264)lane programowanie
Zdarzenie mousemove
Inne zdarzenia myszy
Inne metody zwi(cid:241)zane z obs(cid:228)ug(cid:241) myszy
Zdarzenie submit
Wybór odpowiedniej wersji
Pobieranie
Zastosowanie sieci dostarczania tre(cid:264)ci (CDN)
Zawsze najnowsza wersja
Dostosowywanie jQuery
Obs(cid:228)uga zdarze(cid:254)
Oczekiwanie na gotowo(cid:264)(cid:232) dokumentu
Funkcje i w(cid:228)a(cid:264)ciwo(cid:264)ci zwi(cid:241)zane ze zdarzeniami
Selektory
Metoda css
Selektor elementów
Selektor identyfikatorów
Selektor klas
(cid:227)(cid:241)czenie selektorów
Sk(cid:228)adnia jQuery
Prosty przyk(cid:228)ad
Unikanie konfliktów mi(cid:246)dzy bibliotekami
Spis tre(cid:316)ci
(cid:95)
15
Kup książkęPoleć książkęEfekty specjalne
U(cid:276)ycie jQuery bez selektorów
Metoda $.each
Metoda $.map
Manipulowanie drzewem DOM
Ró(cid:276)nica mi(cid:246)dzy metodami text i html
Metody val i attr
Dodawanie i usuwanie elementów
Dynamiczne stosowanie klas
Modyfikowanie wymiarów
Metody width i height
Metody innerWidth i innerHeight
Metody outerWidth i outerHeight
Nawigowanie w obr(cid:246)bie drzewa DOM
Ukrywanie i wy(cid:264)wietlanie
Metoda toggle
Stopniowe zanikanie i wy(cid:264)wietlanie
Przesuwanie elementów w gór(cid:246) i w dó(cid:228)
Animacje
Zatrzymywanie animacji
Elementy nadrz(cid:246)dne
Elementy potomne
Elementy siostrzane
Wybieranie poprzedzaj(cid:241)cych i kolejnych elementów
Przetwarzanie selekcji w jQuery
Metoda is
487
488
489
489
490
491
494
494
495
496
496
499
499
499
502
502
502
503
506
507
508
509
511
512
512
513
514
514
514
515
515
516
516
516
22. Wst(cid:253)p do HTML5 ....................................................................................................... 519
520
521
523
524
524
525
525
525
525
526
Obiekt canvas
Geolokacja
D(cid:274)wi(cid:246)k i filmy
Formularze
Magazyn danych
Web workers
Aplikacje sieciowe
Mikrodane
Podsumowanie
Pytania
Zastosowanie technologii Ajax
Zastosowanie metody post
Zastosowanie metody get
Rozszerzenia
jQuery User Interface
Inne rozszerzenia
jQuery Mobile
Pytania
16
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęTworzenie elementu canvas i dost(cid:246)p do niego
Umieszczanie napisów na elemencie canvas
Rysowanie linii
W(cid:228)asno(cid:264)(cid:232) lineWidth
W(cid:228)asno(cid:264)ci lineCap i lineJoin
W(cid:228)asno(cid:264)(cid:232) miterLimit
Metoda strokeText
W(cid:228)asno(cid:264)(cid:232) textBaseLine
W(cid:228)asno(cid:264)(cid:232) font
W(cid:228)asno(cid:264)(cid:232) textAlign
Metoda fillText
Metoda measureText
Funkcja toDataURL
Okre(cid:264)lanie formatu obrazu
Metoda fillRect
Metoda clearRect
Metoda strokeRect
(cid:227)(cid:241)czenie wymienionych instrukcji
Metoda createLinearGradient
Szczegó(cid:228)owe informacje o metodzie addColorStop
Metoda createRadialGradient
Wype(cid:228)nianie wzorkami
23. Obiekt canvas w HTML5 ............................................................................................527
527
529
530
530
531
531
531
532
534
535
536
538
538
539
539
539
540
541
541
541
541
543
543
544
544
544
545
546
548
549
550
552
552
554
555
555
555
556
557
557
558
559
560
561
562
Metoda drawImage
Skalowanie obrazu
Wybieranie fragmentu obrazu
Kopiowanie z elementu canvas
Tworzenie cieni
Kre(cid:264)lenie (cid:264)cie(cid:276)ek
Metody moveTo i lineTo
Metoda stroke
Metoda rect
Wype(cid:228)nianie obszarów
Metoda clip
Metoda isPointInPath
Zastosowanie krzywych
Metoda arc
Metoda arcTo
Metoda quadraticCurveTo
Metoda bezierCurveTo
Obs(cid:228)uga obrazków
Przetwarzanie obrazu na poziomie pikseli
Metoda getImageData
Tablica data
Metoda putImageData
Metoda createImageData
Spis tre(cid:316)ci
(cid:95)
17
Kup książkęPoleć książkęPodsumowanie
Pytania
25.
Magazyn lokalny
Zastosowanie magazynu lokalnego
Obiekt localStorage
Zaawansowane efekty graficzne
W(cid:228)asno(cid:264)(cid:232) globalCompositeOperation
W(cid:228)asno(cid:264)(cid:232) globalAlpha
Przekszta(cid:228)cenia
Metoda scale
Metody save i restore
Metoda rotate
Metoda translate
Metoda transform
Metoda setTransform
O kodekach
Element audio
Wsparcie dla przegl(cid:241)darek nieobs(cid:228)uguj(cid:241)cych HTML5
Element video
Kodeki wideo
Obs(cid:228)uga starszych przegl(cid:241)darek
562
562
564
564
564
566
566
567
568
570
570
571
24. Filmy i d(cid:346)wi(cid:253)k w HTML5 ............................................................................................573
574
575
577
578
578
581
Podsumowanie
583
Pytania
583
Inne funkcje HTML5 ...................................................................................................585
585
Geolokacja i us(cid:228)ugi GPS
586
Inne sposoby lokalizacji
586
Geolokacja i HTML5
590
590
591
593
594
596
598
601
603
603
604
26. Zastosowanie wszystkich omówionych technologii ...............................................605
605
606
606
606
608
609
611
611
Web workers
Aplikacje offline
Technologia przeci(cid:241)gnij i upu(cid:264)(cid:232)
Komunikacja mi(cid:246)dzy dokumentami
Mikrodane
Inne znaczniki HTML5
Podsumowanie
Pytania
functions.php
Funkcje
header.php
setup.php
index.php
signup.php
Projektowanie serwisu spo(cid:228)eczno(cid:264)ciowego
Strona WWW z przyk(cid:228)adami
18
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęSprawdzanie dost(cid:246)pno(cid:264)ci nazwy u(cid:276)ytkownika
Logowanie
checkuser.php
login.php
profile.php
Dodawanie tekstu O mnie
Dodawanie zdj(cid:246)cia profilowego
Przetwarzanie obrazu
Wy(cid:264)wietlanie bie(cid:276)(cid:241)cego profilu
members.php
Wy(cid:264)wietlanie profilu u(cid:276)ytkownika
Dodawanie i usuwanie znajomych
Wy(cid:264)wietlanie listy wszystkich u(cid:276)ytkowników
friends.php
messages.php
logout.php
styles.css
javascript.js
613
614
614
615
616
617
617
618
618
621
622
622
622
623
626
629
629
632
A Odpowiedzi na pytania kontrolne ............................................................................635
B Zasoby internetowe ..................................................................................................653
653
653
654
654
654
654
655
655
C S(cid:293)owa z grupy stopwords w MySQL .........................................................................657
D Funkcje MySQL ........................................................................................................... 661
661
663
668
E Selektory, obiekty i metody jQuery .......................................................................... 671
Selektory jQuery
671
Obiekty jQuery
674
Metody jQuery
676
Skorowidz ..................................................................................................................689
Informacje na temat PHP
Informacje na temat MySQL
Informacje na temat JavaScriptu
Informacje na temat CSS
Informacje na temat HTML5
Informacje na temat technologii AJAX
Inne ciekawe strony WWW
Serwisy informacyjne wydawnictwa O’Reilly
Funkcje do obs(cid:228)ugi (cid:228)a(cid:254)cuchów znaków
Funkcje do obs(cid:228)ugi daty
Funkcje do obs(cid:228)ugi czasu
Spis tre(cid:316)ci
(cid:95)
19
Kup książkęPoleć książkę20
(cid:95)
Spis tre(cid:316)ci
Kup książkęPoleć książkęROZDZIA(cid:292) 10.
Korzystanie z MySQL
za po(cid:316)rednictwem PHP
Je(cid:264)li zapozna(cid:228)e(cid:264) si(cid:246) z poprzednimi rozdzia(cid:228)ami, to powiniene(cid:264) ju(cid:276) sprawnie pos(cid:228)ugiwa(cid:232) si(cid:246)
MySQL i PHP. W tym rozdziale dowiesz si(cid:246), w jaki sposób po(cid:228)(cid:241)czy(cid:232) te dwie technologie za
pomoc(cid:241) wbudowanych funkcji PHP umo(cid:276)liwiaj(cid:241)cych bezpo(cid:264)redni dost(cid:246)p do MySQL.
Tworzenie zapyta(cid:295) do bazy MySQL
za po(cid:316)rednictwem PHP
Zasadniczym powodem stosowania PHP jako interfejsu dla MySQL jest mo(cid:276)liwo(cid:264)(cid:232) sformato-
wania wyników zwróconych przez zapytania SQL w sposób pozwalaj(cid:241)cy na wy(cid:264)wietlenie ich
na stronie internetowej. Je(cid:264)li mo(cid:276)esz si(cid:246) zalogowa(cid:232) do MySQL za pomoc(cid:241) nazwy u(cid:276)ytkowni-
ka i has(cid:228)a, to mo(cid:276)esz to zrobi(cid:232) tak(cid:276)e poprzez PHP.
Ró(cid:276)nica polega na tym, (cid:276)e zamiast korzysta(cid:232) z wiersza polece(cid:254) MySQL do wprowadzania in-
strukcji i wy(cid:264)wietlania wyników, b(cid:246)dziesz tworzy(cid:228) zapytania w postaci (cid:228)a(cid:254)cuchów znaków,
przekazywane do MySQL. Wynik zwrócony przez baz(cid:246) nie zostanie sformatowany tak jak
w przypadku pracy z wierszem polece(cid:254), lecz b(cid:246)dzie mia(cid:228) posta(cid:232) pewnej struktury, któr(cid:241) PHP
potrafi zinterpretowa(cid:232). Za pomoc(cid:241) instrukcji PHP mo(cid:276)na odczytywa(cid:232) dane z tej struktury i wy-
(cid:264)wietla(cid:232) je na stronie WWW.
W tym rozdziale z poprzednich wyda(cid:254) ksi(cid:241)(cid:276)ki opisywa(cid:228)em stary sposób dost(cid:246)pu
do bazy danych MySQL, wykorzystuj(cid:241)cy funkcj(cid:246) mysql; dopiero w kolejnym roz-
dziale omawia(cid:228)em nowsze rozszerzenie o nazwie mysqli. Ale jak to mówi(cid:241), czas
nie stoi w miejscu; liczba systemów ze starszymi wersjami kodu i oprogramowa-
nia powinna by(cid:232) ju(cid:276) relatywnie ma(cid:228)a, w tym wydaniu postanowi(cid:228)em wi(cid:246)c od ra-
zu przyst(cid:241)pi(cid:232) do omawiania nowszego rozszerzenia — które obecnie sta(cid:228)o si(cid:246) ju(cid:276)
praktycznie standardem.
Proces
Proces komunikacji z MySQL za pomoc(cid:241) PHP wygl(cid:241)da tak:
1. nawi(cid:241)zanie po(cid:228)(cid:241)czenia z MySQL i wybór bazy danych,
227
Kup książkęPoleć książkę 2. utworzenie zapytania,
3. wykonanie zapytania,
4. pozyskanie rezultatów i wy(cid:264)wietlenie ich na stronie internetowej,
5. powtórzenie kroków od 2. do 4. a(cid:276) do uzyskania wszystkich potrzebnych danych,
6. roz(cid:228)(cid:241)czenie z MySQL.
Ju(cid:276) za chwil(cid:246) zajmiemy si(cid:246) tymi punktami krok po kroku, przede wszystkim jednak powinie-
ne(cid:264) skonfigurowa(cid:232) procedur(cid:246) logowania w bezpieczny sposób, by utrudni(cid:232) postronnym oso-
bom przechwycenie danych dost(cid:246)powych do bazy.
Tworzenie pliku logowania
Wi(cid:246)kszo(cid:264)(cid:232) stron internetowych napisanych w PHP sk(cid:228)ada si(cid:246) z wielu skryptów wymagaj(cid:241)cych
dost(cid:246)pu do MySQL, a tym samym — loginu oraz has(cid:228)a. Maj(cid:241)c to na uwadze, dobrze jest utwo-
rzy(cid:232) osobny plik zawieraj(cid:241)cy te informacje i do(cid:228)(cid:241)cza(cid:232) go do plików strony za ka(cid:276)dym razem,
gdy b(cid:246)dzie to konieczne. Przyk(cid:228)ad 10.1 przedstawia tego rodzaju plik, który nazwa(cid:228)em login.php.
Przyk(cid:228)ad 10.1. Plik login.php
?php // login.php
$hn = localhost ;
$db = publications ;
$un = u(cid:285)ytkownik ;
$pw = has(cid:239)o ;
?
Przepisz podany przyk(cid:228)ad, zast(cid:246)puj(cid:241)c tymczasowe warto(cid:264)ci, takie jak u(cid:285)ytkownik i has(cid:239)o, rze-
czywistymi parametrami dost(cid:246)powymi do bazy MySQL, a nast(cid:246)pnie zapisz plik w folderze
z projektem, który skonfigurowa(cid:228)e(cid:264) w rozdziale 2. Ju(cid:276) za chwil(cid:246) z niego skorzystamy.
Nazwa hosta localhost powinna by(cid:232) poprawna, je(cid:264)li pracujesz na MySQL zainstalowanym na
lokalnym komputerze, a je(cid:276)eli wykonywa(cid:228)e(cid:264) (cid:232)wiczenia opisane w poprzednich rozdzia(cid:228)ach,
to na serwerze powinna si(cid:246) znajdowa(cid:232) baza danych o nazwie publications.
Znaczniki ?php oraz ? s(cid:241) bardzo wa(cid:276)ne zw(cid:228)aszcza w przypadku pliku login.php przedstawio-
nego w przyk(cid:228)adzie 10.1, bo wiersze pomi(cid:246)dzy nimi mog(cid:241) by(cid:232) zinterpretowane wy(cid:228)(cid:241)cznie ja-
ko kod PHP. Je(cid:264)li by(cid:264) je pomin(cid:241)(cid:228), a kto(cid:264) odwo(cid:228)a(cid:228)by si(cid:246) do tego pliku bezpo(cid:264)rednio na Twojej
stronie internetowej, to zosta(cid:228)by on po prostu wy(cid:264)wietlony w przegl(cid:241)darce i zdradzi(cid:228) Twoje
sekrety. Dzi(cid:246)ki zastosowaniu znaczników intruz zobaczy tylko pust(cid:241) stron(cid:246). Tak przygotowa-
ny plik b(cid:246)dzie mo(cid:276)na poprawnie do(cid:228)(cid:241)cza(cid:232) do innych plików PHP.
Zmienna $hn informuje PHP, do jakiego serwera ma si(cid:246) odwo(cid:228)a(cid:232) przy po(cid:228)(cid:241)czeniu z baz(cid:241) da-
nych. To konieczne, gdy(cid:276) za po(cid:264)rednictwem PHP mo(cid:276)esz nawi(cid:241)za(cid:232) po(cid:228)(cid:241)czenie z dowoln(cid:241) baz(cid:241)
danych MySQL dost(cid:246)pn(cid:241) z poziomu Twojego systemu, w tym tak(cid:276)e z serwerami w interne-
cie. Na potrzeby przyk(cid:228)adów opisanych w tym rozdziale u(cid:276)yjemy jednak lokalnego serwera
i zamiast podawa(cid:232) pe(cid:228)n(cid:241) nazw(cid:246) domeny, tak(cid:241) jak mysql.mojserwer.com, wpiszemy po prostu
localhost (lub adres IP 127.0.0.1).
W zmiennej $db podajemy nazw(cid:246) bazy, której b(cid:246)dziemy u(cid:276)ywa(cid:232) — w tym przypadku b(cid:246)dzie
to baza publications, któr(cid:241) zapewne utworzy(cid:228)e(cid:264) w rozdziale 8., b(cid:241)d(cid:274) baza udost(cid:246)pniona przez
administratora serwera (wówczas musisz oczywi(cid:264)cie odpowiednio zmodyfikowa(cid:232) plik login.php).
228 (cid:95)
Rozdzia(cid:293) 10. Korzystanie z MySQL za po(cid:316)rednictwem PHP
Kup książkęPoleć książkęKolejn(cid:241) zalet(cid:241) umieszczenia danych logowania w jednym miejscu jest (cid:228)atwo(cid:264)(cid:232) ak-
tualizacji projektu przy zmianie has(cid:228)a: mo(cid:276)esz to robi(cid:232) tak cz(cid:246)sto, jak tylko masz
ochot(cid:246), bo niezale(cid:276)nie od liczby plików PHP odwo(cid:228)uj(cid:241)cych si(cid:246) do MySQL b(cid:246)dziesz
musia(cid:228) wprowadzi(cid:232) poprawk(cid:246) tylko w jednym miejscu.
Nawi(cid:233)zywanie po(cid:293)(cid:233)czenia z MySQL
Po zapisaniu pliku login.php mo(cid:276)na go do(cid:228)(cid:241)czy(cid:232) za pomoc(cid:241) dyrektywy require_once do dowol-
nego pliku z kodem PHP, który b(cid:246)dzie wymaga(cid:228) dost(cid:246)pu do bazy danych. Takie rozwi(cid:241)zanie
jest o tyle lepsze od u(cid:276)ycia instrukcji include, (cid:276)e nieodnalezienie pliku z danymi logowania
spowoduje wy(cid:264)wietlenie komunikatu o krytycznym b(cid:228)(cid:246)dzie. A wierz mi, brak pliku z danymi
logowania do bazy jest krytycznym b(cid:228)(cid:246)dem.
Ponadto zastosowanie dyrektywy require_once zamiast require oznacza, (cid:276)e plik zostanie wczy-
tany tylko wtedy, je(cid:264)li nie zosta(cid:228) do(cid:228)(cid:241)czony ju(cid:276) wcze(cid:264)niej, co pozwala zapobiec marnowaniu
zasobów na niepotrzebne odwo(cid:228)ania do dysku twardego. Przyk(cid:228)ad 10.2 przedstawia niezb(cid:246)d-
ny fragment kodu.
Przyk(cid:228)ad 10.2. Nawi(cid:241)zywanie po(cid:228)(cid:241)czenia z serwerem MySQL za po(cid:264)rednictwem mysqli
?php
require_once login.php ;
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn- connect_error) die($conn- connect_error);
?
W tym przyk(cid:228)adzie zosta(cid:228) utworzony nowy obiekt o nazwie $conn poprzez wywo(cid:228)anie meto-
dy mysqli, do której zosta(cid:228)y przekazane argumenty zaczerpni(cid:246)te z pliku login.php. Za obs(cid:228)ug(cid:246)
b(cid:228)(cid:246)dów odpowiada odwo(cid:228)anie do w(cid:228)a(cid:264)ciwo(cid:264)ci $conn- connect_error.
Funkcja die oddaje nieocenione us(cid:228)ugi podczas programowania w PHP, ale na ser-
werze produkcyjnym warto przygotowa(cid:232) specjalne komunikaty o b(cid:228)(cid:246)dach, któ-
re b(cid:246)d(cid:241) znacznie przyja(cid:274)niejsze w odbiorze. W takich przypadkach nie przerywa
si(cid:246) dzia(cid:228)ania programu PHP, ale odpowiednio formatuje komunikat i wy(cid:264)wietla
go po zwyk(cid:228)ym zako(cid:254)czeniu pracy programu, na przyk(cid:228)ad tak:
function mysql_fatal_error($msg)
{
$msg2 = mysql_error();
echo _END
Niestety nie uda(cid:239)o si(cid:218) zrealizowa(cid:202) zadania.
Komunikat b(cid:239)(cid:218)du:
p $msg: $msg2 /p
Kliknij przycisk Wstecz w przegl(cid:200)darce i spróbuj ponownie.
W razie dalszych problemów prosimy o wys(cid:239)anie
a href= mailto:admin@serwer.com maila do administratora /a .
Dzi(cid:218)kujemy.
_END;
}
Operator - oznacza, (cid:276)e element po jego prawej stronie jest w(cid:228)a(cid:264)ciwo(cid:264)ci(cid:241) albo metod(cid:241) obiektu
znajduj(cid:241)cego si(cid:246) po stronie lewej. Gdyby w tym przypadku w(cid:228)a(cid:264)ciwo(cid:264)(cid:232) connect_error mia(cid:228)a
Tworzenie zapyta(cid:295) do bazy MySQL za po(cid:316)rednictwem PHP
(cid:95)
229
Kup książkęPoleć książkęjak(cid:241)(cid:264) warto(cid:264)(cid:232), oznacza(cid:228)oby to wyst(cid:241)pienie b(cid:228)(cid:246)du. Wywo(cid:228)ujemy wi(cid:246)c funkcj(cid:246) die, która wy(cid:264)wie-
tli t(cid:246) warto(cid:264)(cid:232) — zawiera ona informacje o napotkanym b(cid:228)(cid:246)dzie.
Obiekt $conn b(cid:246)dzie u(cid:276)ywany w kolejnych przyk(cid:228)adach do uzyskania dost(cid:246)pu do bazy MySQL.
Konstruowanie i wykonywanie zapytania
Aby wys(cid:228)a(cid:232) zapytanie do MySQL przy u(cid:276)yciu PHP, wystarczy u(cid:276)y(cid:232) metody query obiektu po-
(cid:228)(cid:241)czenia. Przyk(cid:228)ad 10.3 ilustruje, jak to zrobi(cid:232).
Przyk(cid:228)ad 10.3. Wysy(cid:228)anie zapytania do bazy za po(cid:264)rednictwem mysqli
?php
$query = SELECT * FROM classics ;
$result = $conn- query($query);
if (!$result) die($conn- error);
?
W tym przypadku zmiennej $query zosta(cid:228) przypisany (cid:228)a(cid:254)cuch tekstowy zawieraj(cid:241)cy zapytanie
do wykonania. Zmienna ta zosta(cid:228)a nast(cid:246)pnie przekazana do metody query obiektu $conn. Z kolei
metoda ta zwraca rezultat, który trafia do obiektu $result. Je(cid:264)li warto(cid:264)(cid:232) $result wynosi FALSE,
to znaczy, (cid:276)e wyst(cid:241)pi(cid:228) jaki(cid:264) b(cid:228)(cid:241)d, którego opis zosta(cid:228) zapisany we w(cid:228)a(cid:264)ciwo(cid:264)ci error obiektu
po(cid:228)(cid:241)czenia. W takim przypadku wywo(cid:228)ana zostaje funkcja die, która ten b(cid:228)(cid:241)d wy(cid:264)wietli.
Wszystkie dane zwrócone przez MySQL trafi(cid:241) do obiektu $result w postaci, w której mo(cid:276)na
je (cid:228)atwo przetwarza(cid:232).
Pobieranie rezultatu
Po zwróceniu rezultatu do obiektu $result mo(cid:276)esz pobra(cid:232) z niego potrzebne dane po kolei
przy u(cid:276)yciu metody fetch_assoc tego obiektu. Przyk(cid:228)ad 10.4 stanowi po(cid:228)(cid:241)czenie i rozszerzenie
dotychczasowych przyk(cid:228)adów. Jest to ju(cid:276) kompletny program, który mo(cid:276)esz przepisa(cid:232) i uru-
chomi(cid:232), aby pozyska(cid:232) z bazy potrzebne dane (rysunek 10.1). Zalecam zapisanie go pod na-
zw(cid:241) query.php w tym samym folderze co plik login.php (albo wykorzystanie pliku pobranego
z darmowego archiwum przyk(cid:228)adów, dost(cid:246)pnego na stronie lpmj.net).
Przyk(cid:228)ad 10.4. Zwracanie zawarto(cid:264)ci poszczególnych komórek
?php // query.php
require_once login.php ;
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn- connect_error) die($conn- connect_error);
$query = SELECT * FROM classics ;
$result = $conn- query($query);
if (!$result) die($conn- error);
$rows = $result- num_rows;
for ($j = 0 ; $j $rows ; ++$j)
{
$result- data_seek($j);
echo Autor: . $result- fetch_assoc()[ author ] . br ;
$result- data_seek($j);
echo Tytu(cid:239): . $result- fetch_assoc()[ title ] . br ;
$result- data_seek($j);
echo Kategoria: . $result- fetch_assoc()[ category ] . br ;
$result- data_seek($j);
echo Rok: . $result- fetch_assoc()[ year ] . br ;
230
(cid:95)
Rozdzia(cid:293) 10. Korzystanie z MySQL za po(cid:316)rednictwem PHP
Kup książkęPoleć książkęRysunek 10.1. Rezultat dzia(cid:228)ania programu query.php z przyk(cid:228)adu 10.4
$result- data_seek($j);
echo ISBN: . $result- fetch_assoc()[ isbn ] . br br ;
}
$result- close();
$conn- close();
?
W opisanym przyk(cid:228)adzie w celu odwo(cid:228)ania si(cid:246) do odpowiedniego wiersza danych przy ka(cid:276)-
dej iteracji p(cid:246)tli u(cid:276)yli(cid:264)my metody data_seek obiektu $result. Nast(cid:246)pnie wykorzystali(cid:264)my meto-
d(cid:246) fetch_assoc do pobrania warto(cid:264)ci przechowywanych w poszczególnych komórkach i wresz-
cie warto(cid:264)ci te wy(cid:264)wietlili(cid:264)my przy u(cid:276)yciu instrukcji echo.
Zapewne zgodzisz si(cid:246) ze mn(cid:241), (cid:276)e takie wyszukiwanie danych jest do(cid:264)(cid:232) uci(cid:241)(cid:276)liwe i powinna
by(cid:232) jaka(cid:264) skuteczniejsza metoda na osi(cid:241)gni(cid:246)cie podobnego efektu. Taki sposób rzeczywi(cid:264)cie
istnieje i polega na pobieraniu ca(cid:228)ych wierszy danych naraz.
W rozdziale 9. przeczyta(cid:228)e(cid:264) o pierwszej, drugiej i trzeciej postaci normalnej bazy
danych i by(cid:232) mo(cid:276)e zwróci(cid:228)e(cid:264) uwag(cid:246) na fakt, (cid:276)e tabela classics nie spe(cid:228)nia warun-
ków tych postaci, poniewa(cid:276) zawiera ona informacje o autorze i o ksi(cid:241)(cid:276)ce. Wynika
to z faktu, (cid:276)e tabela classics zosta(cid:228)a utworzona jeszcze przed omówieniem kwestii
normalizacji. Jednak na potrzeby zilustrowania metod dost(cid:246)pu do MySQL z po-
ziomu PHP ta tabela zupe(cid:228)nie wystarczy i pozwoli nam unikn(cid:241)(cid:232) (cid:276)mudnego wpi-
sywania kolejnych danych — proponuj(cid:246) wi(cid:246)c si(cid:246) ni(cid:241) pos(cid:228)u(cid:276)y(cid:232).
Tworzenie zapyta(cid:295) do bazy MySQL za po(cid:316)rednictwem PHP
(cid:95)
231
Kup książkęPoleć książkęPobieranie wiersza danych
Aby pobra(cid:232) ca(cid:228)y wiersz danych naraz, nale(cid:276)y zast(cid:241)pi(cid:232) p(cid:246)tl(cid:246) for z przyk(cid:228)adu 10.4 tak(cid:241), jaka
zosta(cid:228)a wyró(cid:276)niona pogrubieniem w przyk(cid:228)adzie 10.5. Po wykonaniu tej zmiany powiniene(cid:264)
uzyska(cid:232) taki sam efekt, jaki zosta(cid:228) pokazany wcze(cid:264)niej na rysunku 10.1. Tak zmodyfikowany
plik mo(cid:276)esz zapisa(cid:232) pod nazw(cid:241) fetchrow.php.
Przyk(cid:228)ad 10.5. Odczytywanie zawarto(cid:264)ci kolejnych wierszy
?php //fetchrow.php
require_once login.php ;
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn- connect_error) die($conn- connect_error);
$query = SELECT * FROM classics ;
$result = $conn- query($query);
if (!$result) die($conn- error);
$rows = $result- num_rows;
for ($j = 0 ; $j $rows ; ++$j)
{
$result- data_seek($j);
$row = $result- fetch_array(MYSQLI_ASSOC);
echo Autor: . $row[ author ] . br ;
echo Tytu(cid:239): . $row[ title ] . br ;
echo Kategoria: . $row[ category ] . br ;
echo Rok: . $row[ year ] . br ;
echo ISBN: . $row[ isbn ] . br br ;
}
$result- close();
$conn- close();
?
W tak zmodyfikowanym przyk(cid:228)adzie mamy do czynienia z pi(cid:246)ciokrotnie mniejsz(cid:241) liczb(cid:241) od-
wo(cid:228)a(cid:254) do obiektu $result (w porównaniu z poprzednim kodem), a w ramach ka(cid:276)dej iteracji
p(cid:246)tli nast(cid:246)puje tylko jedno takie odwo(cid:228)anie, poniewa(cid:276) przy u(cid:276)yciu metody fetch_array s(cid:241) po-
bierane ca(cid:228)e wiersze kodu. Metoda ta zwraca ca(cid:228)y wiersz danych w postaci tablicy, która w na-
szym programie jest nast(cid:246)pnie przypisywana do zmiennej $row.
Zale(cid:276)nie od przekazanych do niej warto(cid:264)ci metoda fetch_array mo(cid:276)e zwróci(cid:232) trzy rodzaje tablic:
MYSQLI_NUM
Tablica numeryczna. Poszczególne kolumny pojawiaj(cid:241) si(cid:246) w tablicy zgodnie z kolejno(cid:264)ci(cid:241),
w jakiej zosta(cid:228)y utworzone w tabeli (z uwzgl(cid:246)dnieniem pó(cid:274)niejszych zmian). W naszym
przypadku na zerowej pozycji tablicy znajduje si(cid:246) kolumna Author, na pierwszej kolumna
Title i tak dalej.
MYSQLI_ASSOC
Tablica asocjacyjna. Ka(cid:276)dy klucz stanowi nazw(cid:246) kolumny. Poniewa(cid:276) w tym przypadku do
danych trzeba si(cid:246) odwo(cid:228)ywa(cid:232) za po(cid:264)rednictwem nazwy kolumny (a nie numeru indeksu),
warto korzysta(cid:232) z tego wariantu zawsze, gdy to mo(cid:276)liwe, aby u(cid:228)atwi(cid:232) sobie debugowanie
programu, a innym programistom — interpretacj(cid:246) kodu.
MYSQLI_BOTH
Tablica asocjacyjna i numeryczna.
Tablice asocjacyjne s(cid:241) zwykle bardziej praktyczne od numerycznych, gdy(cid:276) umo(cid:276)liwiaj(cid:241) odwo-
(cid:228)ywanie si(cid:246) do kolumn za pomoc(cid:241) nazw, na przyk(cid:228)ad $row[ author ], dzi(cid:246)ki czemu nie trzeba
232
(cid:95)
Rozdzia(cid:293) 10. Korzystanie z MySQL za po(cid:316)rednictwem PHP
Kup książkęPoleć książkęzapami(cid:246)tywa(cid:232), na którym miejscu w tabeli znajduje si(cid:246) potrzebna kolumna. W przyk(cid:228)adowym
skrypcie zosta(cid:228)a u(cid:276)yta tablica asocjacyjna, o czym (cid:264)wiadczy argument MYSQLI_ASSOC.
Zamykanie po(cid:293)(cid:233)czenia
Po zako(cid:254)czeniu wykonywania skryptu PHP zwolni pami(cid:246)(cid:232) zaalokowan(cid:241) na potrzeby obiek-
tów, wi(cid:246)c w przypadku niewielkich programów na ogó(cid:228) nie trzeba si(cid:246) troszczy(cid:232) o samodzielne
zarz(cid:241)dzanie pami(cid:246)ci(cid:241). Jednak w przypadku wi(cid:246)kszej liczby rezultatów albo du(cid:276)ych porcji da-
nych dobrze jest zwolni(cid:232) pami(cid:246)(cid:232), której program ju(cid:276) nie potrzebuje, aby unikn(cid:241)(cid:232) problemów
z jego dalszym dzia(cid:228)aniem.
Jest to szczególnie istotne na cz(cid:246)sto odwiedzanych stronach, gdy(cid:276) ilo(cid:264)(cid:232) pami(cid:246)ci zajmowanej
w trakcie sesji mo(cid:276)e raptownie rosn(cid:241)(cid:232). Zwró(cid:232) uwag(cid:246) na metody close dla obiektów $result
oraz $conn, które w poprzednich skryptach by(cid:228)y wywo(cid:228)ywane w sytuacji, gdy dany obiekt prze-
sta(cid:228) ju(cid:276) by(cid:232) potrzebny.
$result- close();
$conn- close();
Najlepiej by(cid:228)oby zamkn(cid:241)(cid:232) ka(cid:276)dy obiekt z wynikami zapytania, gdy przestanie by(cid:232)
u(cid:276)ywany, a nast(cid:246)pnie zamkn(cid:241)(cid:232) obiekt po(cid:228)(cid:241)czenia w chwili, gdy komunikacja z ser-
werem MySQL stanie si(cid:246) zb(cid:246)dna. Takie rozwi(cid:241)zanie gwarantuje zwolnienie zaso-
bów do systemu tak szybko, jak to mo(cid:276)liwe, to za(cid:264) przek(cid:228)ada si(cid:246) na p(cid:228)ynne dzia-
(cid:228)anie MySQL i eliminuje wszelkie w(cid:241)tpliwo(cid:264)ci co do tego, czy PHP sam zwróci
zaj(cid:246)t(cid:241) pami(cid:246)(cid:232), zanim b(cid:246)dzie ponownie potrzebna.
Praktyczny przyk(cid:293)ad
Pora na napisanie pierwszego programu, który za pomoc(cid:241) PHP b(cid:246)dzie umieszcza(cid:228) dane w ta-
beli MySQL i usuwa(cid:228) je stamt(cid:241)d. Sugeruj(cid:246), aby(cid:264) przyk(cid:228)ad 10.6 zapisa(cid:228) w roboczym folderze
z dokumentami WWW pod nazw(cid:241) sqltest.php. Przyk(cid:228)ad dzia(cid:228)ania programu zosta(cid:228) zilustro-
wany na rysunku 10.2.
Przyk(cid:228)ad 10.6. Wstawianie i usuwanie danych przy u(cid:276)yciu programu sqltest.php
?php // sqltest.php
require_once login.php ;
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn- connect_error) die($conn- connect_error);
if (isset($_POST[ delete ]) isset($_POST[ isbn ]))
{
$isbn = get_post($conn, isbn );
$query = DELETE FROM classics WHERE isbn= $isbn ;
$result = $conn- query($query);
if (!$result) echo Instrukcja DELETE nie powiod(cid:239)a si(cid:218): $query br .
$conn- error . br br ;
}
if (isset($_POST[ author ])
isset($_POST[ title ])
isset($_POST[ category ])
isset($_POST[ year ])
isset($_POST[ isbn ]))
{
$author = get_post($conn, author );
Praktyczny przyk(cid:293)ad
(cid:95)
233
Kup książkęPoleć książkęRysunek 10.2. Rezultat dzia(cid:228)ania programu sqltest.php z przyk(cid:228)adu 10.8
$title = get_post($conn, title );
$category = get_post($conn, category );
$year = get_post($conn, year );
$isbn = get_post($conn, isbn );
$query = INSERT INTO classics VALUES .
( $author , $title , $category , $year , $isbn ) ;
$result = $conn- query($query);
if (!$result) echo Instrukcja INSERT nie powiod(cid:239)a si(cid:218): $query br .
$conn- error . br br ;
}
echo _END
form action= sqltest.php method= post pre
Autor input type= text name= author
Tytu(cid:239) input type= text name= title
Kategoria input type= text name= category
Rok input type= text name= year
ISBN input type= text name= isbn
input type= submit value= DODAJ REKORD
/pre /form
_END;
$query = SELECT * FROM classics ; $result = $conn- query($query);
if (!$result) die ( Brak dost(cid:218)pu do bazy danych: . $conn- error);
$rows = $result- num_rows;
for ($j = 0 ; $j $rows ; ++$j)
{
$result- data_seek($j);
$row = $result- fetch_array(MYSQLI_NUM);
234 (cid:95)
Rozdzia(cid:293) 10. Korzystanie z MySQL za po(cid:316)rednictwem PHP
Kup książkęPoleć książkę echo _END
pre
Autor $row[0]
Tytu(cid:239) $row[1]
Kategoria $row[2]
Rok $row[3]
ISBN $row[4]
/pre
form action= sqltest.php method= post
input type= hidden name= delete value= yes
input type= hidden name= isbn value= $row[4]
input type= submit value= USU(cid:148) REKORD /form
_END;
}
$result- close();
$conn- close();
function get_post($conn, $var)
{
return $conn- real_escape_string($_POST[$var]);
}
?
W przyk(cid:228)adzie 10.6 zosta(cid:228) u(cid:276)yty typowy formularz HTML. W rozdziale 11. za-
poznasz si(cid:246) ze szczegó(cid:228)owymi informacjami na temat formularzy — tymczasem
przyjmij, (cid:276)e uzna(cid:228)em ich znajomo(cid:264)(cid:232) za co(cid:264) oczywistego, i skup si(cid:246) przede wszyst-
kim na komunikacji z baz(cid:241) danych.
Sk(cid:228)adaj(cid:241)cy si(cid:246) z ponad 80 linii program mo(cid:276)e sprawia(cid:232) wra(cid:276)enie skomplikowanego, ale nie
obawiaj si(cid:246) — wi(cid:246)kszo(cid:264)(cid:232) kodu pozna(cid:228)e(cid:264) ju(cid:276) w przyk(cid:228)adzie 10.5, a jego dzia(cid:228)anie jest stosun-
kowo proste.
Najpierw program sprawdza, czy u(cid:276)ytkownik podj(cid:241)(cid:228) jakie(cid:264) dzia(cid:228)ania, a nast(cid:246)pnie — zgodnie
z nimi — umieszcza w tabeli classics w bazie publications nowy rekord albo usuwa jeden z ist-
niej(cid:241)cych. Niezale(cid:276)nie od akcji podj(cid:246)tej przez u(cid:276)ytkownika program wy(cid:264)wietla w przegl(cid:241)darce
wszystkie aktualne wiersze tabeli. Przeanalizujmy dzia(cid:228)anie programu.
Pierwsza cz(cid:246)(cid:264)(cid:232) nowego kodu rozpoczyna si(cid:246) od wywo(cid:228)ania funkcji isset, która sprawdza, czy
wype(cid:228)nione zosta(cid:228)y wszystkie pola umo(cid:276)liwiaj(cid:241)ce dodanie nowego rekordu lub usuni(cid:246)cie go.
Je(cid:264)li tak, to w ka(cid:276)dym z wierszy w ramach instrukcji if jest wywo(cid:228)ywana funkcja get_post,
która zosta(cid:228)a zdefiniowana na ko(cid:254)cu programu. Funkcja ta pe(cid:228)ni prost(cid:241), ale bardzo wa(cid:276)n(cid:241)
funkcj(cid:246): zbiera i przesy(cid:228)a dane z przegl(cid:241)darki.
Tablica $_POST
W jednym z poprzednich rozdzia(cid:228)ów wspomnia(cid:228)em, (cid:276)e dane wprowadzone przez u(cid:276)ytkow-
nika w przegl(cid:241)darce s(cid:241) wysy(cid:228)ane za po(cid:264)rednictwem metody GET albo POST. Na ogó(cid:228) lepsza jest
metoda POST, której tutaj u(cid:276)yli(cid:264)my (poniewa(cid:276) pozwala unikn(cid:241)(cid:232) wy(cid:264)wietlania niepo(cid:276)(cid:241)danych
danych na pasku adresu przegl(cid:241)darki). Serwer WWW gromadzi wszystkie dane podane przez
u(cid:276)ytkownika (nawet je(cid:264)li mowa o formularzu sk(cid:228)adaj(cid:241)cym si(cid:246) ze stu pól) i umieszcza je w ta-
blicy o nazwie $_POST.
Tablica $_POST ma charakter asocjacyjny — z tego rodzaju tablicami zetkn(cid:241)(cid:228)e(cid:264) si(cid:246) ju(cid:276) w roz-
dziale 6. W zale(cid:276)no(cid:264)ci od tego, czy formularz zosta(cid:228) skonfigurowany z u(cid:276)yciem metody POST,
Praktyczny przyk(cid:293)ad
(cid:95)
235
Kup książkęPoleć książkęczy GET, dane z niego trafi(cid:241) do tablicy asocjacyjnej $_POST albo $_GET. Informacje zawarte w oby-
dwu mog(cid:241) by(cid:232) odczytywane w identyczny sposób.
Ka(cid:276)demu polu formularza jest przypisywany element tablicy o nazwie zgodnej z nazw(cid:241) tego
pola. To oznacza, (cid:276)e je(cid:264)li w formularzu znajduje si(cid:246) pole o nazwie isbn, w tablicy $_POST po-
jawi si(cid:246) element, którego klucz b(cid:246)dzie nosi(cid:228) nazw(cid:246) isbn. Program w PHP mo(cid:276)e odczyta(cid:232) za-
warto(cid:264)(cid:232) takiego pola poprzez odwo(cid:228)anie w postaci $_POST[ isbn ] albo $_POST[ isbn ] (w tym
przypadku pojedynczy i podwójny cudzys(cid:228)ów b(cid:246)dzie mia(cid:228) ten sam efekt).
Je(cid:264)li sk(cid:228)adnia $_POST wydaje Ci si(cid:246) skomplikowana, mo(cid:276)esz po prostu skorzysta(cid:232) z rozwi(cid:241)za-
nia przedstawionego w przyk(cid:228)adzie 10.6: skopiuj dane wprowadzone przez u(cid:276)ytkownika do
innych zmiennych, a potem mo(cid:276)esz zapomnie(cid:232) o tablicy $_POST. To rozwi(cid:241)zanie jest cz(cid:246)sto sto-
sowane w programach PHP — na samym pocz(cid:241)tku pobiera si(cid:246) dane z wszystkich pól tablicy
$_POST, a potem j(cid:241) ignoruje.
Nie ma powodu, by modyfikowa(cid:232) elementy tablicy $_POST. Jej rola ogranicza si(cid:246)
do wymiany informacji mi(cid:246)dzy przegl(cid:241)dark(cid:241) a programem i z tego wzgl(cid:246)du lepiej
najpierw przenie(cid:264)(cid:232) zawarte w niej dane do w(cid:228)asnych zmiennych.
Wró(cid:232)my do wspomnianej funkcji get_post: zauwa(cid:276), (cid:276)e ka(cid:276)da informacja jest najpierw podda-
wana dzia(cid:228)aniu funkcji real_escape_string w celu usuni(cid:246)cia dowolnych znaków, które haker
móg(cid:228)by wykorzysta(cid:232) do w(cid:228)amania si(cid:246) do bazy lub zmodyfikowania jej zawarto(cid:264)ci.
function get_post($conn, $var)
{
return $conn- real_escape_string($_POST[$var]);
}
Usuwanie rekordu
Przed sprawdzeniem, czy u(cid:276)ytkownik wpisa(cid:228) nowe dane do wprowadzenia do bazy, program
weryfikuje warto(cid:264)(cid:232) zmiennej $_POST[ delete ]. Je(cid:264)li taka warto(cid:264)(cid:232) istnieje, to znaczy, (cid:276)e u(cid:276)yt-
kownik klikn(cid:241)(cid:228) przycisk USU(cid:253) REKORD, aby usun(cid:241)(cid:232) jeden z istniej(cid:241)cych rekordów z bazy.
W takim przypadku przekazywana jest ponadto warto(cid:264)(cid:232) zmiennej $isbn.
Jak zapewne pami(cid:246)tasz, numer ISBN jednoznacznie identyfikuje ka(cid:276)dy rekord. Formularz
HTML uwzgl(cid:246)dnia ten numer w zawartym w zmiennej $query zapytaniu DELETE FROM, które
jest nast(cid:246)pnie przekazywane do metody query obiektu $conn, sk(cid:241)d trafia do MySQL.
Je(cid:264)li zmienna $_POST[ delete ] nie ma warto(cid:264)ci (co oznacza, (cid:276)e nie trzeba usuwa(cid:232) danych z ba-
zy), sprawdzana jest zawarto(cid:264)(cid:232) zmiennej $_POST[ author ] i pozosta(cid:228)ych. Je(cid:264)li wszystkim zo-
sta(cid:228)a przypisana warto(cid:264)(cid:232), to do zmiennej $query trafia zapytanie w postaci INSERT INTO z pi(cid:246)-
cioma danymi do umieszczenia w bazie. Zmienna ta jest nast(cid:246)pnie przekazywana do metody
query, która mo(cid:276)e zwróci(cid:232) warto(cid:264)(cid:232) TRUE albo FALSE. W przypadku warto(cid:264)ci FALSE generowany
jest komunikat b(cid:228)(cid:246)du, który trafia do w(cid:228)a(cid:264)ciwo(cid:264)ci error obiektu $conn i mo(cid:276)e zosta(cid:232) wy(cid:264)wie-
tlony na przyk(cid:228)ad tak:
if (!$result) echo Instrukcja INSERT nie powiod(cid:239)a si(cid:218): $query br .
$conn- error . br br ;
236
(cid:95)
Rozdzia(cid:293) 10. Korzystanie z MySQL za po(cid:316)rednictwem PHP
Kup książkęPoleć książkęWy(cid:316)wietlanie formularza
Nast(cid:246)pna cz(cid:246)(cid:264)(cid:232) kodu odpowiada za wy(cid:264)wietlenie niewielkiego formularza, widocznego w gór-
nej cz(cid:246)(cid:264)ci rysunku 10.2. Zapewne pami(cid:246)tasz z poprzednich rozdzia(cid:228)ów konstrukcj(cid:246) echo _END…
_END, która powoduje wy(cid:264)wietlenie w przegl(cid:241)darce wszystkiego, co znajduje si(cid:246) mi(cid:246)dzy znacz-
nikami _END.
Zamiast u(cid:276)ywa(cid:232) instrukcji echo, mo(cid:276)na by(cid:228)oby przerwa(cid:232) program PHP za pomo-
c(cid:241) znacznika ? , umie(cid:264)ci(cid:232) w pliku niezb(cid:246)dny fragment dokumentu HTML, a po-
tem wstawi(cid:232) znacznik ?, aby wróci(cid:232) do kodu PHP. Obrana metoda zale(cid:276)y tylko
od preferencji programisty, ja jednak zawsze zalecam zrealizowanie ca(cid:228)ej operacji
w kodzie PHP. Powody ku temu mam nast(cid:246)puj(cid:241)ce:
(cid:120) Umieszczanie tylko kodu PHP w plikach .php jest korzystne podczas debugo-
wania (tak(cid:276)e przez innych programistów). Nie ma wówczas potrzeby szuka(cid:232)
wydzielonych fragmentów HTML.
(cid:120) Je(cid:264)li chcia(cid:228)by(cid:264) wy(cid:264)wietli(cid:232) warto(cid:264)(cid:232) zmiennej PHP w obr(cid:246)bie kodu HTML, mo-
(cid:276)esz po prostu wpisa(cid:232) jej nazw(cid:246). Je(cid:264)li zamkn(cid:241)(cid:228)by(cid:264) blok kodu PHP, musia(cid:228)-
by(cid:264) najpierw zainicjowa(cid:232) nowy blok, wy(cid:264)wietli(cid:232) zmienn(cid:241), a potem wróci(cid:232)
do HTML.
Fragment kodu HTML z formularzem po prostu przekierowuje jego dzia(cid:228)anie na plik sqltest.
php. To oznacza, (cid:276)e po wys(cid:228)aniu formularza zawarto(cid:264)(cid:232) jego pól trafia z powrotem do pliku
sqltest.php, czyli naszego programu. Formularz zosta(cid:228) ponadto skonfigurowany tak, by pola
by(cid:228)y wysy(cid:228)ane metod(cid:241) POST, a nie GET. Ten wybór jest podyktowany faktem, (cid:276)e w przypadku
metody GET dane s(cid:241) do(cid:228)(cid:241)czane do przesy(cid:228)anego adresu URL, co mo(cid:276)e powodowa(cid:232) ma(cid:228)y ba(cid:228)a-
gan w pasku adresu przegl(cid:241)darki. Poza tym metoda GET umo(cid:276)liwia (cid:228)atw(cid:241) ingerencj(cid:246) w prze-
sy(cid:228)ane dane, a tym samym pozwala na podejmowanie prób w(cid:228)amania si(cid:246) na serwer. Z tego
wzgl(cid:246)du zawsze gdy tylko jest to mo(cid:276)liwe, lepiej u(cid:276)ywa(cid:232) metody POST, która ma zarazem t(cid:246)
zalet(cid:246), (cid:276)e ukrywa wysy(cid:228)ane dane.
Poni(cid:276)ej pól formularza HTML znajduje si(cid:246) przycisk wysy(cid:228)ania danych z napisem DODAJ RE-
KORD. Zwró(cid:232) uwag(cid:246) na zastosowanie znaczników pre i /pre , które zosta(cid:228)y u(cid:276)yte w celu
wymuszenia fontu o sta(cid:228)ej szeroko(cid:264)ci znaków, co pozwala na eleganckie wyrównanie poszcze-
gólnych wpisów w formularzu. Ponadto w obr(cid:246)bie znaczników pre s(cid:241) uwzgl(cid:246)dniane znaki
ko(cid:254)ca linii.
Wysy(cid:293)anie zapyta(cid:295) do bazy danych
Nast(cid:246)pnie kod wraca do znajomego „terytorium” z przyk(cid:228)adu 10.5 — do bazy MySQL jest wy-
sy(cid:228)ane zapytanie o wszystkie rekordy z tabeli classics:
$query = SELECT * FROM classics ;
$result = $conn- query($query);
W dalszej kolejno(cid:264)ci zmiennej $rows jest przypisywana warto(cid:264)(cid:232) odzwierciedlaj(cid:241)ca liczb(cid:246) wier-
szy w tabeli:
$rows = $result- num_rows;
Praktyczny przyk(cid:293)ad
(cid:95)
237
Kup książkęPoleć książkęNa podstawie warto(cid:264)ci zmiennej $rows jest inicjalizowana p(cid:246)tla for, która s(cid:228)u(cid:276)y do wy(cid:264)wietla-
nia zawarto(cid:264)ci poszczególnych wierszy. W ka(cid:276)dej iteracji tej p(cid:246)tli wywo(cid:228)ywana jest metoda
data_seek obiektu $result, która odczytuje porcj(cid:246) interesuj(cid:241)cych nas danych:
$result- data_seek($j);
Nast(cid:246)pnie tablica $row jest wype(cid:228)niana poszczególnymi wierszami danych przy u(cid:276)yciu meto-
dy fetch_array obiektu $result. Do metody jest przekazywana sta(cid:228)a MYSQLI_NUM, która wymusza
zwrócenie tablicy numerycznej (a nie asocjacyjnej):
$row = $result- fetch_array(MYSQLI_NUM);
Po umieszczeniu danych w tablicy $row ich wy(cid:264)wietlenie jest ju(cid:276) proste. U(cid:276)y(cid:228)em w tym celu
konstrukcji heredoc z instrukcjami echo i z zastosowaniem znaczników pre , które umo(cid:276)liwia-
j(cid:241) estetyczne wyrównanie poszczególnych wierszy.
Po ka(cid:276)dym wy(cid:264)wietlonym rekordzie mamy do czynienia z kolejnym formularzem, który rów-
nie(cid:276) przekierowuje u(cid:276)ytkownika do pliku sqltest.php (czyli do tego samego programu). Ten
formularz zawiera dwa ukryte pola: delete oraz isbn. Pole delete ma warto(cid:264)(cid:232) yes, za(cid:264) warto(cid:264)(cid:232)
pola isbn jest okre(cid:264)lana na podstawie zawarto(cid:264)ci pola tablicy $row[4], w którym jest przecho-
wywany numer ISBN dla danego rekordu.
Formularz ko(cid:254)czy przycisk wysy(cid:228)ania danych z napisem USU(cid:253) REKORD. Nast(cid:246)pnie nawias
klamrowy zamyka p(cid:246)tl(cid:246), która b(cid:246)dzie powtarzana a(cid:276) do wy(cid:264)wietlenia wszystkich rekordów.
Gdy tak si(cid:246) stanie, wywo(cid:228)ywane s(cid:241) metody close obiektów $result oraz $conn w celu zamkni(cid:246)-
cia po(cid:228)(cid:241)czenia i zwolnienia zasobów dla PHP.
$result- close();
$conn- close();
Wreszcie na ko(cid:254)cu kodu znajduje si(cid:246) definicja funkcji get_post, której ju(cid:276) wcze(cid:264)niej si(cid:246) przy-
gl(cid:241)dali(cid:264)my. I to ju(cid:276) koniec struktury naszego pierwszego programu PHP umo(cid:276)liwiaj(cid:241)cego ko-
munikacj(cid:246) z baz(cid:241) danych. Przekonajmy si(cid:246), co on potrafi.
Po wprowadzeniu kodu (i poprawieniu ewentualnych pomy(cid:228)ek) spróbuj wprowadzi(cid:232) nast(cid:246)-
puj(cid:241)ce informacje do kolejnych pól formularza, aby doda(cid:232) do bazy nowy rekord po(cid:264)wi(cid:246)cony
ksi(cid:241)(cid:276)ce Moby Dick:
Herman Melville
Moby Dick
Fiction
1851
9780199535729
Dzia(cid:293)anie programu
Po wys(cid:228)aniu powy(cid:276)szych danych do bazy za pomoc(cid:241) przycisku DODAJ REKORD przewi(cid:254)
zawarto(cid:264)(cid:232) strony w dó(cid:228), aby wy(cid:264)wietli(cid:232) nowy rekord. Efekt powinien wygl(cid:241)da(cid:232) podobnie jak
na rysunku 10.3.
Przekonajmy si(cid:246) teraz, jak dzia(cid:228)a usuwanie danych z bazy, na podstawie przyk(cid:228)adowego re-
kordu, który wpiszemy tylko w tym celu. Wprowad(cid:274) cyfr(cid:246) 1 w ka(cid:276)dym z pi(cid:246)ciu pól z infor-
macjami o nowej ksi(cid:241)(cid:276)ce i kliknij przycisk DODAJ REKORD. Je(cid:264)li teraz przewiniesz zawarto(cid:264)(cid:232)
okna w dó(cid:228), zobaczysz nowy wpis sk(cid:228)adaj(cid:241)cy si(cid:246) z samych jedynek. Oczywi(cid:264)cie taki rekord nie
jest nam w tabeli do niczego potrzebny, kliknij wi(cid:246)c znajduj(cid:241)cy si(cid:246) pod nim przycisk USU(cid:253)
238 (cid:95)
Rozdzia(cid:293) 10. Korzystanie z MySQL za po(cid:316)rednictwem PHP
Kup książkęPoleć książkęRysunek 10.3. Po dodaniu do bazy ksi(cid:241)(cid:276)ki „Moby Dick”
REKORD i ponownie przewi(cid:254) zawarto(cid:264)(cid:232) okna w dó(cid:228), aby si(cid:246) przekona(cid:232), (cid:276)e rekord rzeczywi-
(cid:264)cie zosta(cid:228) usuni(cid:246)ty.
Przy za(cid:228)o(cid:276)eniu, (cid:276)e wszystko przebieg(cid:228)o zgodnie z planem, za pomoc(cid:241) opisanego
programu mo(cid:276)esz dodawa(cid:232) i usuwa(cid:232) rekordy z bazy. Wykonaj kilka tego typu
operacji, ale zostaw w tabeli dotychczasowe informacje o ksi(cid:241)(cid:276)kach (w tym rekord
z ksi(cid:241)(cid:276)k(cid:241) Moby Dick), bo b(cid:246)dziemy ich jeszcze potrzebowa(cid:232). Spróbuj dwukrotnie
doda(cid:232) rekord zawieraj(cid:241)cy same jedynki — przy drugiej próbie pojawi si(cid:246) komuni-
kat b(cid:228)(cid:246)du wynikaj(cid:241)cy z faktu, (cid:276)e w bazie istnieje ju(cid:276) ksi(cid:241)(cid:276)ka o ISBN wynosz(cid:241)cym 1.
MySQ
Pobierz darmowy fragment (pdf)