E N C Y K L O P E D I E
Z O N E R
P R E S S
VELKÁ KNIHA
PHP 5 a MySQL kompendium znalostí pro zaćátećníky i profesionály
NOVÉ, TōE TōETÍ VYDÁNÍ TōET
W. J a s o n G i l m o r e
Velká kniha PHP 5 a MySQL Kompendium znalostí pro začátečníky i profesionály – NOVÉ, TŘETÍ VYDÁNÍ
W. Jason Gilmore
Beginning PHP and MySQL: From Novice to Professional, Fourth Edition W. Jason Gilmore Original edition copyright © 2010 by W. Jason Gilmore. Czech edition copyright © 2011 by ZONER software, a.s. All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright the publisher. Copyright originálního vydání © 2010 W. Jason Gilmore. Copyright českého vydání © 2011 ZONER software, a.s. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení držitele autorských práv.
Velká kniha PHP 5 a MySQL (nové, třetí vydání) Autor: W. Jason Gilmore Copyright © ZONER software, a.s. Vydání třetí, v roce 2011. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR1114 ZONER software, a.s. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP a obálka: Miroslav Kučera a Lenka Křížová Fotografie na obálce: Jana Vališová
Zdrojové soubory ke stažení: http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar
Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, a.s Nové sady 18, 602 00 Brno tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz
ISBN: 978-80-7413-163-9
3
Stručný obsah Kapitola 1
Úvod do PHP
27
Kapitola 2
Konfigurace prostředí
35
Kapitola 3
Základy PHP
65
Kapitola 4
Funkce
111
Kapitola 5
Pole
121
Kapitola 6
Objektově orientované PHP
149
Kapitola 7
Pokročilé schopnosti OOP
171
Kapitola 8
Obsluha chyb a výjimek
187
Kapitola 9
Řetězce a regulární výrazy
203
Kapitola 10
Práce se souborovým a s operačním systémem
239
Kapitola 11
PEAR
265
Kapitola 12
Datum a čas
275
Kapitola 13
Práce s HTML formuláři
293
Kapitola 14
Autentizace uživatelů
307
Kapitola 15
Upload souborů
323
Kapitola 16
Networking
335
Kapitola 17
PHP a LDAP
353
Kapitola 18
Obsluha relací
367
Kapitola 19
Šablony se Smarty
385
Kapitola 20
Webové služby
407
Kapitola 21
Zabezpečení webu
421
Kapitola 22
Ajax a PHP
431
4 Kapitola 23
Budování webů pro celý svět
443
Kapitola 24
Zend Framework
451
Kapitola 25
Úvod do MySQL
469
Kapitola 26
Instalace a konfigurace MySQL
477
Kapitola 27
Klienti pro MySQL
493
Kapitola 28
Ukládací enginy MySQL a datové typy
513
Kapitola 29
Zabezpečení MySQL
539
Kapitola 30
Používání PHP s MySQL
565
Kapitola 31
Úvod do PDO
585
Kapitola 32
Uložené rutiny
603
Kapitola 33
Triggery MySQL
623
Kapitola 34
Pohledy MySQL
633
Kapitola 35
Databázové dotazy v praxi
645
Kapitola 36
Indexy a vyhledávání
663
Kapitola 37
Transakce
677
Kapitola 38
Import a export dat
687
Rejstřík
701
5
Obsah O autorovi
25
O odborném recenzentovi
25
Poděkování
25
Úvod
26
Zdrojové kódy
26
Kapitola 1
Úvod do PHP
Historie
27 28
PHP 4
28
PHP 5
29
PHP 5.3
30
PHP 6
30
Všeobecné vlastnosti jazyka
31
Praktičnost
31
Vyspělost
32
Možnosti
32
Cena
33
Shrnutí
Kapitola 2
33
Konfigurace prostředí
Předběžné kroky před vlastní instalací
35 36
Stažení Apache
36
Stažení PHP
36
Stažení dokumentace
37
Instalace Apache a PHP na Linuxu
38
Instalace Apache a PHP na Windows
39
Instalace IIS a PHP na Windows
41
Otestování instalace
41
Konfigurace PHP
43
Konfigurace PHP v čase sestavování na Linuxu
43
Přizpůsobení distribuce sestavené pro Windows
44
Konfigurace při běhu
44
Správa konfiguračních direktiv PHP
44
Konfigurační direktivy PHP
46
6 Volba editoru kódu
60
Adobe Dreamweaver CS5
60
Notepad++
61
PDT (PHP Development Tools)
61
Zend Studio
61
Výběr poskytovatele webhostingu Sedm otázek potenciálnímu poskytovateli webhostingu Shrnutí
Kapitola 3
61 62 63
Základy PHP
Vkládání kódu PHP do webových stránek
65 65
Výchozí syntaxe
66
Krátké značky
66
Styl <script>
67
Styl ASP
67
Vkládání několika bloků kódu
67
Komentáře
68
Syntaxe jediného řádku z C++
68
Syntaxe shellu
68
Komentář na několika řádcích ve stylu C
68
Výstup dat do prohlížeče
69
Příkaz print()
69
Příkaz echo()
70
Příkaz printf()
71
Příkaz sprintf()
72
Datové typy podporované PHP
72
Skalární datové typy
73
Složené datové typy
74
Konverze mezi datovými typy pomocí přetypování
76
Žonglování s typy
77
Funkce vztahující se k typům
77
Funkce ověřující, zda je proměnná daného typu
78
Identifikátory
79
Proměnné
79
Deklarace proměnné
80
Obor proměnné
81
Superglobální proměnné PHP
84
7 Proměnné proměnné Konstanty
88 88
Definice konstanty Výrazy
89 89
Operandy
89
Operátory
90
Interpretace řetězců
96
Uvozovky
96
Posloupnosti řídicích znaků
96
Apostrofy
97
Složené závorky
98
Syntaxe Heredoc
98
Syntaxe Nowdoc Řídící struktury
98 99
Podmínkové příkazy
99
Příkazy pro cyklus
101
Příkazy pro vkládání souborů
107
Shrnutí
Kapitola 4
110
Funkce
111
Volání funkcí
111
Vytvoření funkce
112
Předávání argumentů hodnotou
113
Předávání argumentů odkazem
113
Výchozí hodnoty argumentů
114
Funkcionalita Type Hinting
115
Návratové hodnoty funkcí
115
Rekurzivní funkce
117
Knihovny funkcí
119
Shrnutí
120
Kapitola 5
Pole
Co je pole?
121 121
Vytvoření pole
123
Vytváření polí funkcí array()
123
Extrakce polí s konstrukcí list()
124
8 Plnění polí předdefinovaným rozsahem hodnot
125
Test, zda se jedná o pole
125
Výstup obsahu pole
126
Tisk polí pro testovací potřeby
127
Přidávání a odstraňování prvků pole
127
Přidání hodnoty před pole
127
Přidání hodnoty na konec pole
128
Odstranění hodnoty na začátku pole
128
Odstranění hodnoty z konce pole
128
Vyhledávání prvků v poli
129
Vyhledání hodnoty v poli
129
Získávání klíčů z pole
130
Získávání hodnot z pole Procházení polí
130 130
Získání aktuálního klíče z pole
131
Získání aktuální hodnoty z pole
131
Získání aktuálního klíče a hodnoty z pole
132
Posouvání ukazatele pole
132
Předávání hodnot pole do funkce Zjištění velikosti a jedinečných hodnot pole
133 134
Zjištění velikosti pole
134
Zjištění četností hodnot v poli
135
Zjištění jedinečných hodnot v poli
135
Setřídění prvků polí
136
Opačné pořadí prvků pole
136
Prohození klíčů a hodnot v poli
136
Setřídění prvků v poli
137
Zkombinování, sloučení, extrakce a porovnání polí
141
Slučování polí
141
Slučování polí s rekurzívním přidáváním polí
142
Zkombinování pole klíčů a pole hodnot do jediného pole
142
Řez z pole
143
Pole prvků odstraněných z pole
143
Průnik polí
144
Průnik asociativních polí
145
Rozdíl polí
145
Rozdíl asociativních polí
146
Další užitečné funkce pro práci s poli
146
9 Vrácení náhodné sady klíčů
146
Zamíchání prvků pole
147
Součet hodnot polí
147
Členění pole na části
147
Shrnutí
Kapitola 6
148
Objektově orientované PHP
Výhody plynoucí z OOP Zapouzdření
149 149 149
Dědění
150
Polymorfismus
150
Klíčové pojmy OOP
151
Třídy
151
Objekty
152
Vlastnosti
152
Konstanty
158
Metody
159
Konstruktory a destruktory
162
Konstruktory
163
Destruktory
165
Statické členy tříd
166
Klíčové slovo instanceof
167
Pomocné funkce
167
Vytváření aliasu pro třídu
168
Existence třídy
168
Určení kontextu objektu
168
Pole metod třídy
168
Pole vlastností třídy
168
Pole deklarovaných tříd
168
Pole vlastností objektu
169
Určení rodičovské třídy objektu
169
Existence rozhraní
169
Určení typu objektu
169
Určení typu podtřídy objektu
169
Existence metody
169
Automatické načítání objektů
170
Shrnutí
170
10 Kapitola 7
Pokročilé schopnosti OOP
171
Schopnosti OOP nepodporované v PHP
172
Klonování objektů
172
Příklad klonování Metoda __clone() Dědění
172 174 175
Dědění třídy
175
Dědění a konstruktory
177
Dědění a pozdní statické vázání Rozhraní
179 180
Implementace jediného rozhraní Implementace několika rozhraní
181 182
Abstraktní třídy
183
Úvod do jmenných prostorů
183
Shrnutí
186
Kapitola 8
Obsluha chyb a výjimek
Konfigurační direktivy
187 188
Nastavení žádané úrovně citlivosti na chyby
188
Zobrazování chyb do prohlížeče
189
Zobrazování chyb při startu
190
Protokolování chyb
190
Identifikace protokolovacího souboru
190
Nastavení maximální délky protokolu
190
Ignorování opakujících se chyb
190
Ignorování chyb pocházejících ze stejného umístění
190
Uložení nejnovější chybové zprávy do proměnné
190
Protokolování chyb
191
Inicializace výbavy PHP pro protokolování
191
Otevření připojení pro potřeby protokolování
191
Uzavření protokolovacího připojení
192
Odeslání zprávy na cíl protokolování
192
Obsluha výjimek
193
Proč je obsluha výjimek tak skvělá
193
Implementace obsluhy výjimek v PHP
195
Výjimky standardní knihovny PHP
200
Shrnutí
201
11 Kapitola 9
Řetězce a regulární výrazy
Regulární výrazy
203 204
Syntaxe regulárních výrazů ve stylu POSIX
204
Funkce PHP pro práci s regulárními výrazy – rozšířený styl POSIX
206
Funkce PHP pro regulární výrazy – ve stylu Perl
209
Funkce PHP pro práci s regulárními výrazy – kompatibilní s Perlem
212
Další funkce pro práci s řetězci
217
Určování délky řetězce
217
Porovnávání dvou řetězců
218
Manipulace s velikostmi písmen
220
Převádění řetězců do HTML a z HTML
221
Alternativy pro funkce regulárních výrazů
226
Rozklad řetězce na prvky podle předem definovaných znaků
226
Rozklad řetězce podle předem definovaného oddělovače
227
Převod pole na řetězec
227
Komplexnější rozklad řetězce
228
Nalezení posledního výskytu podřetězce v řetězci
228
Nahrazení všech výskytů řetězce jiným řetězcem
229
Získání části řetězce
230
Vrácení části řetězce na základě předem definovaného offsetu
230
Četnost výskytu podřetězce v řetězci
231
Nahrazení části řetězce jiným řetězcem
231
Doplňování a zkracování řetězce
232
Počítání znaků a slov
233
Balíček PEAR: Validate_US Instalace balíku Validate_US Jak se používá balík Validate_US Shrnutí
Kapitola 10
235 236 236 237
Práce se souborovým a s operačním systémem
Soubory a adresáře
239 240
Rozklad cest k adresářům
240
Zjišťování velikosti souboru, adresáře a disku
242
Časy posledního přístupu a modifikace Práce se soubory Pojem zdroj
244 246 246
12 Rozpoznání znaků pro nový řádek
246
Rozpoznání konce souboru
246
Otevření a uzavření souboru
247
Čtení ze souboru
249
Zapisování do souboru
255
Přesouvání ukazatele souboru
255
Čtení obsahu adresářů
256
Vykonávání příkazů shellu
257
Odstranění adresáře
257
Přejmenování souboru
258
Nastavení časů poslední modifikace a přístupu k souboru
259
Vykonávání programů na systémové úrovni
259
Dezinfekce vstupů od uživatele
259
Funkce PHP pro spouštění programů
261
Shrnutí
Kapitola 11
263
PEAR
Ukázka síly PEAR: konverze číselných formátů Instalace a aktualizace PEAR
265 266 266
Instalace PEAR
267
PEAR a hostitelské firmy
268
Aktualizace PEAR
268
Manažer balíků PEAR
268
Prohlídka nainstalovaných balíků
269
Získání dalších informací o nainstalovaném balíku
269
Instalace balíků PEAR
270
Zahrnutí balíku do skriptu
272
Upgrade balíků
272
Odinstalování balíku
273
Přechod na starší verzi balíku
273
Úvod do Pyrus
274
Instalace Pyrus Shrnutí
Kapitola 12
274 274
Datum a čas
Časové razítko Unixu
275 275
13 Knihovna PHP pro datum a čas
276
Ověřování platnosti data
276
Formátování data a času
277
Práce s časovými razítky
281
Řešení běžných úloh souvisejících s datem a časem
283
Zobrazení lokalizovaného data a času
283
Zobrazení data poslední modifikace webové stránky
287
Počet dní aktuálního měsíce
287
Počet dní specifikovaného měsíce
288
Určení data vzdáleného x dní od aktuálního data
288
Vylepšená výbava pro datum a čas v PHP 5.1
289
Konstruktor DateTime
289
Formátování data
290
Nastavení data po vytvoření instance
290
Nastavení času po vytvoření instance
290
Modifikace data a času
291
Výpočet rozdílu mezi dvěma daty
291
Shrnutí
Kapitola 13
291
Práce s HTML formuláři
PHP a webové formuláře Jednoduchý příklad Ověřování platnosti dat formuláře
293 293 294 295
Odstranění souboru
295
Skriptování přes weby
296
Desinfekce uživatelského vstupu
297
Validace a dezinfekce dat s rozšířením Filter
300
Práce s vícehodnotovými komponentami formuláře
301
Těžíme z předností PEAR: HTML_QuickForm2
303
Instalace HTML_QuickForm2
303
Vytvoření a validace jednoduchého formuláře
304
Shrnutí
Kapitola 14
306
Autentizace uživatelů
Autentizace HTTP Využití schopnosti .htaccess Apache
307 307 308
14 Autentizace prostřednictvím PHP
309
Proměnné autentizace
309
Užitečné funkce
310
Způsoby autentizace v PHP
311
Záležitosti kolem uživatelských hesel
317
Otestování síly hesla s knihovnou CrackLib
317
Jednorázová URL a obnova hesla
319
Shrnutí
Kapitola 15
321
Upload souborů
323
Nahrávání souborů přes protokol HTTP
323
Nahrávání souborů na server s PHP
324
Direktivy PHP pro nahrávání souborů a zdroje
324
Pole $_FILES
326
Funkce PHP pro nahrávání na server
326
Chybové zprávy týkající se nahrávání
328
Nahrání souboru: jednoduchý příklad
329
Využívání předností PEAR: HTTP_Upload
330
Instalace HTTP_Upload
330
Upload souboru
330
Získání dalších informací o nahraném souboru
331
Nahrávání více souborů najednou Shrnutí
Kapitola 16
332 333
Networking
DNS, služby a servery
335 336
DNS
336
Služby
340
Práce s e-mailem
342
Konfigurační direktivy
342
Odesílání e-mailů skriptem PHP
343
Běžné síťové úkoly
348
Ping na server
348
Vytvoření skeneru portů
349
Vytvoření převaděče síťových adres
350
Testování šířky pásma uživatele
351
Shrnutí
352
15 Kapitola 17
PHP a LDAP
PHP a LDAP
353 354
Konfigurace LDAP pro PHP
354
Připojení k LDAP serveru
354
Získávání dat LDAP
357
Počet získaných položek
360
Řazení LDAP záznamů
360
Vkládání dat LDAP
361
Aktualizace dat LDAP
362
Odstraňování dat LDAP
363
Manipulace s DN
364
Obsluha chyb
365
Shrnutí
Kapitola 18
366
Obsluha relací
Co je obsluha relace? Proces obsluhy relace Konfigurační direktivy
367 367 368 368
Správa média úložiště relace
369
Nastavení cesty k souborům relace
369
Zapnutí relace automaticky
369
Nastavení názvu relace
370
Volba cookies nebo přepisování URL
370
Automatizace přepisování URL
370
Nastavení doby života cookie relace
370
Nastavení platné URL cesty pro cookie relace
370
Nastavení způsobu ukládání do cache na stránkách se zapnutou relací Práce s relacemi
371 372
Odstartování relace
372
Likvidace relace
373
Nastavení a získání ID relace
373
Vytváření a odstraňování proměnných relace
373
Zakódování a dekódování dat relace
374
Obsluha relace – praktické příklady
376
Automatické přihlašování vracejících se uživatelů
376
Seznam naposledy prohlížených dokumentů
378
16 Vytváření vlastních obsluh relace Včlenění vlastních funkcí relace do logiky PHP Vlastní obsluha relace založená na MySQL Shrnutí
Kapitola 19
380 381 381 384
Šablony se Smarty
385
Šablonovací systém? Co to je?
386
Úvod do Smarty
387
Instalace Smarty
388
Pracujeme se Smarty
389
Prezentační logika Smarty
391
Komentáře
391
Modifikátory proměnné
391
Řídící struktury
394
Příkazy
398
Vytváření konfiguračních souborů
400
Metoda configLoad
401
Odkazy na konfigurační proměnné
401
Používání CSS ve spolupráci se Smarty
402
Ukládání stránek do cache
403
Doba života stránek uložených v cache
403
Eliminace režijních nákladů na zpracování s is_cached()
404
Cachování více verzí jedné šablony
404
Několik slov závěrem k ukládání do cache
405
Shrnutí
Kapitola 20
406
Webové služby
Proč webové služby? RSS (Real Simple Syndication)
407 408 409
Syntaxe RSS
410
Úvod do SimplePie
412
Instalace SimplePie
412
Rozklad souboru RSS se SimplePie
413
Rozklad více souborů RSS
414
SimpleXML Funkce SimpleXML
415 416
17 Rozklad XML
417
Shrnutí
Kapitola 21
420
Zabezpečení webu
Bezpečná konfigurace PHP Konfigurační parametry vztahující se k bezpečnosti Skrývání konfiguračních detailů
421 422 422 424
Skrývání Apache
424
Skrytí PHP
425
Skrývání citlivých dat
426
Skrytí kořenu dokumentů
426
Zamítnutí přístupu k souborům s určitými příponami
427
Šifrování dat
427
Šifrovací funkce PHP
427
MCrypt
428
Shrnutí
Kapitola 22
430
Ajax a PHP
431
Úvod do Ajaxu
431
Úvod do jQuery
433
Instalace jQuery
433
Jednoduchý příklad
433
Reakce na události
434
jQuery a DOM
435
Kontrola existence uživatelského jména
437
Skript pro kontrolu existence uživatelského jména
439
Integrace funkcionality Ajaxu
440
Shrnutí
Kapitola 23
441
Budování webů pro celý svět
Překládání webů s Gettext
443 444
Krok 1: aktualizace skriptů webu
444
Krok 2: vytvoření lokalizačního depozitáře
445
Krok 3: vytvoření překladových souborů
446
Krok 4: překlad textu
447
Krok 5: vygenerování binárních souborů
447
18 Krok 6: nastavení žádaného jazyka ve skriptech
447
Lokalizace data, čísel a času
448
Shrnutí
450
Kapitola 24
Zend Framework
Úvod do MVC
451 451
Frameworky v PHP
453
Framework CakePHP
454
Framework Solar
454
Framework symfony
454
Zend Framework
455
Úvod do Zend Frameworku
455
Instalace Zend Frameworku
456
Vytvoření prvního webu řízeného Zend Frameworkem
457
Shrnutí
Kapitola 25
467
Úvod do MySQL
Proč je MySQL tak populární?
469 469
Flexibilita
470
Výkon
470
Flexibilní licenční možnosti
472
(Hyper) aktivní komunita uživatelů
473
Evoluce MySQL
473
MySQL 4
473
MySQL 5
474
MySQL 5.1
475
MySQL 5.4 a 5.5
475
Prominentní uživatelé MySQL
475
craigslist
476
Wikipedia
476
Další prominentní uživatelé
476
Shrnutí
Kapitola 26
476
Instalace a konfigurace MySQL
477
Stažení MySQL
477
Instalace MySQL
478
19 Instalace MySQL na Linuxu
478
Instalace a konfigurace MySQL na Windows
481
Nastavení hesla administrátora MySQL
483
Start a zastavení MySQL
484
Ruční ovládání démona Konfigurace a optimalizace MySQL
484 485
Obal mysqld_safe
485
Konfigurační a optimalizační parametry MySQL
486
Soubor my.cnf
489
Konfigurace PHP pro spolupráci s MySQL
492
Překonfigurace PHP na Linuxu
492
Překonfigurace PHP na Windows
492
Shrnutí
Kapitola 27
492
Klienti pro MySQL
Klienti příkazového řádku pro MySQL
493 493
Klient mysql
493
Klient mysqladmin
503
Další užiteční klienti
505
Volby pro klienty
508
Klienti s grafickým rozhraním pro MySQL
510
MySQL Workbench
511
Nástroj phpMyAdmin
511
Shrnutí
Kapitola 28
512
Ukládací enginy MySQL a datové typy
513
Ukládací enginy
513
MyISAM
514
IBMDB2I
516
InnoDB
516
MEMORY
517
MERGE
518
FEDERATED
518
ARCHIVE
520
CSV
520
EXAMPLE
520
BLACKHOLE
520
20 Časté otázky týkající se ukládacích enginů Datové typy a atributy
521 522
Datové typy
522
Atributy datových typů
528
Práce s databázemi a s tabulkami
531
Práce s databázemi
531
Práce s tabulkami
532
Změny ve struktuře tabulky
535
Databáze INFORMATION_SCHEMA
536
Shrnutí
Kapitola 29
538
Zabezpečení MySQL
539
Co udělat nejdříve?
540
Zabezpečení démona mysqld
541
Systém přístupových oprávnění MySQL
541
Jak systém přístupových oprávnění pracuje
542
Kde jsou uloženy informace o přístupových oprávněních?
543
Správa uživatelů a přístupových oprávnění
553
Vytváření uživatelů
553
Odstraňování uživatelů
553
Přejmenování uživatelů
554
Příkazy GRANT a REVOKE
554
Prohlížení oprávnění
559
Limity na spotřebu zdrojů uživateli
560
Zabezpečená připojení MySQL
560
Volby příkazu GRANT, které se týkají SSL
561
Volby SSL
563
Nastartování serveru MySQL se zapnutou podporou SSL
564
Připojení pomocí klienta se zapnutým SSL
564
Uložení voleb SSL do souboru my.cnf
564
Shrnutí
Kapitola 30
564
Používání PHP s MySQL
Předběžné informace
565 566
Zpřístupnění rozšíření mysqli na Linuxu/Unixu
566
Zpřístupnění rozšíření mysqli na Windows
566
Používání nativního ovladače MySQL
566
21 Přístupová oprávnění uživatelů
567
Ukázková data
567
Práce s rozšířením mysqli
568
Příprava připojení a jeho ukončení
568
Obsluha chyb připojení
569
Získání informací o chybě
569
Uložení informací o připojení do separátního souboru
571
Zabezpečení informací o připojení
571
Interakce s databází
572
Odeslání dotazu do databáze
572
Rozklad výsledků dotazu
574
Určení počtu vybraných řádků a ovlivněných řádků
576
Práce s připravenými příkazy
577
Vykonávání databázových transakcí
582
Zapnutí módu automatického potvrzování
582
Potvrzení transakce
583
Anulování transakce
583
Shrnutí
Kapitola 31
583
Úvod do PDO
585
Pro další abstraktní databázová vrstva?
586
Způsob práce s PDO
587
Instalace PDO
587
Podpora databází v PDO
588
Připojení k databázovému serveru a výběr databáze
588
Obsluha chyb
590
Získávání a nastavování atributů
592
Spouštění dotazů
593
Úvod k připraveným příkazům
594
Získávání dat
597
Nastavování vázaných sloupců
600
Transakce
601
Shrnutí
Kapitola 32
602
Uložené rutiny
Měli bychom používat uložené rutiny? Přednosti uložených rutin
603 604 604
22 Nevýhody uložených rutin Jak MySQL implementuje uložené rutiny
604 605
Vytvoření uložené rutiny
605
Deklarace a nastavování proměnných
608
Spuštění uložené rutiny
609
Uložené rutiny složené z několika příkazů
610
Volání rutiny z jiné rutiny
617
Modifikace uložené rutiny
618
Odstranění uložené rutiny
618
Prohlížení stavu rutiny
618
Prohlížení vytvářecí syntaxe rutiny
620
Podmínky a jejich obsluhy
620
Integrace rutin do webových aplikací
620
Vytvoření rozhraní pro bonusy zaměstnanců
621
Získávání více řádků
622
Shrnutí
Kapitola 33
622
Triggery MySQL
Úvod do triggerů
623 623
Proč používat triggery?
624
Vykonání akce před událostí
624
Vykonání akce po události
624
Triggery spouštěné "před" versus triggery spouštěné "po"
625
Podpora triggerů v MySQL
626
Vytvoření triggeru
626
Prohlížení existujících triggerů
628
Modifikace triggeru
630
Odstranění triggeru
630
Integrace triggerů do webových aplikací
631
Shrnutí
632
Kapitola 34
Pohledy MySQL
633
Úvod do pohledů
634
Podpora pohledů v MySQL
634
Vytváření a spouštění pohledů
634
Prohlížení informací o pohledu
640
23 Modifikace pohledu
641
Odstranění pohledu
642
Aktualizace pohledů
642
Začlenění pohledů do webových aplikací
643
Shrnutí
644
Kapitola 35
Databázové dotazy v praxi
645
Ukázková data
646
Vytváření tabulkových výstupů s PEAR
646
Instalace HTML_Table
647
Vytvoření jednoduché tabulky
647
Vytváření lépe čitelného výstupu řádků
649
Vytvoření tabulky z dat databáze
649
Seřazení výstupu
651
Vytvoření stránkovaného výstupu
652
Číslování stránek výpisu
654
Dotazy na více tabulek s poddotazy
656
Porovnávací operace s poddotazy
657
Určování existence s poddotazy
657
Údržba databáze pomocí poddotazů
658
Používání poddotazů v PHP
658
Procházení sad výsledků pomocí kurzorů
659
Základy práce s kurzory
659
Vytvoření kurzoru
660
Otevření kurzoru
660
Práce s kurzorem
660
Uzavření kurzoru
661
Používání kurzorů s PHP
661
Shrnutí
Kapitola 36
662
Indexy a vyhledávání
663
Indexování databází
663
Primární klíče
664
Jedinečné indexy
665
Normální indexy
666
Fulltextové indexy
668
24 Doporučené praktiky pro práci s indexy Vyhledávání pomocí formuláře
671 672
Jednoduché hledání
672
Rozšíření vyhledávacích možností
673
Fulltextové vyhledávání
675
Shrnutí
Kapitola 37
676
Transakce
Co je transakce?
677 677
Výbava MySQL pro transakční zpracování
678
Systémové požadavky
678
Vytvoření tabulky
679
Ukázkový projekt
679
Ukázková data
680
Vykonání ukázkové transakce
681
Tipy pro práci s transakcemi Budování transakčních aplikací s PHP Směna zboží za hotové ještě jednou Shrnutí
Kapitola 38
682 683 683 685
Import a export dat
687
Ukázková tabulka
687
Oddělování údajů
688
Import dat
688
Import dat s LOAD DATA INFILE
689
Import dat s mysqlimport
692
Načítání dat do tabulky s PHP
694
Export dat Příkaz SELECT INTO OUTFILE Shrnutí
Rejtřík
695 695 699
701
25
O autorovi W. Jason Gilmore je zakladatel společnosti W. J. Gilmore, LLC (www.wjgilmore.com), což je konzultační, publikační a školící firma, která má zkušenosti s obsluhou širokého rozsahu firem, od místních, až po ty, co jsou uvedeny v seznamu Fortune 500. Problematice webového vývoje se věnuje více než deset let, je autorem celkem šesti knih včetně bestsellerů "Beginning PHP and MySQL, Third Edition", "Easy PHP Websites with the Zend Framework" a "Easy PayPal with PHP". Publikoval přes 100 odborných článků, které mj. vyšly na stránkách Developer.com, JSMag a Linux Magazine. Jason je spoluzakladatelem CodeMash, což je nezisková organizace, jejímž úkolem je pořádat stejnojmennou každoroční konferenci vývojářů. Byl také členem výboru pro výběr řečníků na 2008 MySQL Conference.
O odborném recenzentovi Matt Wade je programátor, databázový vývojář a systémový administrátor. V současné době ve dne pracuje pro velkou finanční firmu a v noci je na volné noze. Má zkušenosti s programováním v několika jazycích, ale nejčastěji využívá PHP a C. Pokud jde o databáze, pravidelně používá MySQL a Microsoft SQL Server. Je také také uznávaným administrátorem systémů a má zkušenosti s nejrůznějšími servery běžícími na Windows nebo na Linuxu. Preferuje FreeBSD. Matt žije na Floridě ve městě Jacksonville se svou ženou Michelle a se svými třemi dětmi, Matthewem, Jonathanem a Amandou. Ve svém volném čase rybaří, vypomáhá v kostele, nebo hraje nějakou videohru. Matt je zakladatelem Codewalkers.com, což je web určený vývojářům PHP, který vznikl v roce 2007.
Poděkování Rychle se blíží desáté výročí vydání mé první knihy, je to milník, který vítám s pokorou a zároveň s úžasem. Ačkoli se na obálce objevuje mé jméno, ve skutečnosti je to sdílený milník. Bez velkého úsilí opravdu nenahraditelné skupiny lidí by nebylo příliš reálné, aby tato kniha vydržela celou dekádu. Komentáře plné nápadů mého dlouholetého odborného korektora Matt Wadea opět nesmírně zdokonalily předkládaný materiál. Projektová manažerka Jennifer Blackwellová odvedla skvělou práci tím, že mě držela na správné cestě a neustále kontrolovala silně napjatý rozvrh prací. Editoři Tom Welsh a Michelle Lowman dohlíželi ostřížím zrakem na kapitoly a průběžně poskytovali cenné rady. Korektorka Mary Behrová zručně pochytala a opravila mé četné gramatické prohřešky. Uznání patří také významnému počtu dalších osob, které měly na starost produkci, marketing, prodej a nesčetné další povinnosti, aby mohla tato kniha spatřit světlo světa. Jako vždy bych rád poděkoval Gary Cornellovi, spoluzakladateli vydavatelství Apress, že mi poskytoval dlouhá léta příležitost prezentovat myšlenky v psané podobě. Těším se na dalších skvělých deset let. Nakonec bych chtěl poděkovat Carli, Jodi, Paulovi, Ruby, svým rodičům a samozřejmě i všem ostatním členům rodiny a mým přátelům, že díky nim vím, že pravý život je tam venku, daleko od klávesnice.
26
Úvod Skvělé knihy o programování se spíše zabývají praktickými problémy než čistou teorií. Přestože nepodléhám žádným iluzím, co se týče mého postavení mezi skvělými autory odborných knih naší doby, vždy jsem usiloval, abych psal ve zmíněném duchu a poskytoval takový materiál, který budete moci využít v praxi pro své vlastní potřeby. Vzhledem k vymezenému objemu knihy je také zřejmé, že jsem se snažil z každého probíraného předmětu vymačkat praktičnost až do poslední kapky. Pokud tedy potřebujete získat praktický vhled do programovacího jazyka PHP a databázového serveru MySQL (se zvláštním důrazem na to, jak s oběma produkty vytvářet dynamické webové aplikace řízené databázemi), je tato kniha určena právě vám. Popudem k novému vydání této knihy (poznámka redaktora: v rukou držíte přeložené 4. vydání anglického originálu) vedlo především horečnaté tempo prací komunit PHP a MySQL. Kromě toho, že jsme aktualizovali materiál v knize tak, aby zahrnoval schopnosti nacházející se v nejnovějších vydáních PHP a MySQL, najdete zde také novou kapitolu, ve které se seznámíte s pojmem AJAX a s populární knihovnou jQuery JavaScriptu. Kromě toho byly všechny existující kapitoly pečlivě zrevidovány a v některých případech i značně modifikovány tak, aby se jejich materiál oproti předchozím vydání aktualizoval a zároveň vylepšil. Pokud s PHP teprve začínáte, vřele vám doporučuji, abyste začali s kapitolou 1, protože je dost pravděpodobné, že ze základních vědomostí, které zde prvně získáte, budete moci hodně těžit v dalších kapitolách. Jestliže už PHP znáte, ale databázi MySQL moc ne, zvažte, zda byste neměli raději začít kapitolou 25. Pokročilejší čtenáře vybízím, aby četli knihu podle svého uvážewní – koneckonců, není to žádný milostný román. Bez ohledu na to, jakou strategii při četbě zvolíte, pokusil jsem se každou kapitolu rozškatulkovat na úhledné balíčky tak, abyste z ní mohli vytěžit co nejvíc, aniž byste museli předtím zvládnout všechny ostatní kapitoly (samozřejmě kromě těch, které se soustřeďují na základy dané technologie). I nově příchozí a příležitostní vývojáři PHP a MySQL z této knihy leccos získají, protože jsem ji záměrně napsal v takovém formátu, aby mohla být současně návodem i referenční příručkou. Oceňuji skutečnost, že jste vy, nebo váš zaměstnavatel investovali do této knihy nemalé peníze. Proto jsem se usiloval, abych probíranou látku prezentoval v takovém stylu, aby vám tato kniha byla prospěšná nejenom při několika prvních příležitostech, kdy ji pročítáte, ale i dlouhodobě.
Zdrojové kódy Zdrojové kódy k ukázkám použitým v této knize naleznete zde: http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar
65
KAPITOLA 3 Základy PHP Máme za sebou pouhé dvě kapitoly a už jsme probrali poměrně dost základních informací o jazyku PHP. Seznámili jste se s pozadím a historií vzniku jazyka a hluboko jste se zavrtali do pojmů a postupů souvisejících s instalací a konfigurací. Tím jste si vytvořili dobrou výchozí pozici k tomu, co je jádrem zbývající části knihy: vytváření vyspělých webů řízených PHP. Jejich výklad začíná právě teď a uvedeme si v něm mnoho základních schopností jazyka. Konkrétně se budou probírat tato témata: Jak se vkládá kód PHP do webových stránek. Jak se do kódu vkládají komentáře pomocí různých metodologií, které jsou vy-
půjčeny ze skriptování shellu Unixu a jazyků C a C++. Jak dostanete data na výstup prostřednictvím příkazů echo(), print(), printf() a sprintf(). Jak se vytvářejí sofistikované skripty pomocí typů dat PHP, proměnných, operá-
torů a příkazů. Pojednání o klíčových řídících strukturách a příkazech PHP: if-else-elseif, while, foreach, include/require, break, continue a declare.
V této kapitole si osvojíte nejen vědomosti nezbytné k tomu, abyste mohli vytvářet sice jen základní, ale přesto prospěšné aplikace PHP. Pochopíte také věci, které vám umožní vytěžit co nejvíce z látky probírané v následujících kapitolách. POZNÁMKA Tato kapitola slouží simultánně jako výukový kurz pro začínající programátory a jako referenční příručka pro zkušené programátory, pro které je jazyk PHP nový. Pokud spadáte do první uvedené kategorie, měli byste asi kapitolu pročíst celou a vyzkoušet si také všechny zde uvedené příklady.
Vkládání kódu PHP do webových stránek Jednou z předností PHP je, že jeho kód můžete vkládat přímo do statických stránek HTML. Aby ale kód mohl něco dělat, musí se stránka předat enginu PHP, který ji bude
66
Kapitola 3 – Základy PHP
interpretovat. Webový server ovšem nepředává každou stránku – předává jen stránky identifikované jistou příponou souboru (typicky .php), což je přesně definováno instrukcemi zmiňovanými v kapitole 2. Při interpretaci kódu by ale bylo hodně neefektivní, kdyby se měl každý řádek brát jako potenciální příkaz PHP. Proto engine potřebuje nějaké prostředky, aby mohl okamžitě určit, které oblasti na stránce představují kód PHP. Toho se logicky docílí tím, že se kód PHP oddělí a existují čtyři varianty, jak to lze udělat.
Výchozí syntaxe Výchozí syntaxe oddělení kódu začíná znaky <?php a končí znaky ?>, jako zde: <h3>Vítejte!</h3> <?php print "<p>Tohle je ukázka PHP.</p>"; ?> <p>Zde se nacházejí nějaké statické informace...</p>
Uložíte-li kód uvedený výše jako test.php a zavoláte ho z nějakého webového serveru, který má zapnutou podporu PHP, uvidíte výstup jako na obrázku 3-1:
Obrázek 3-1 Ukázka výstupu PHP.
Krátké značky Pro lenochy je k dispozici ještě kratší syntaxe oddělovačů. Říká se jí krátký styl značek (short-tags). Obejde se bez reference php, kterou vyžaduje výchozí syntaxe. Chcete-li ale používat krátké značky, musíte nejprve zapnout direktivu short_open_tag PHP. Zde je ukázka této syntaxe: <? print "Tohle je další ukázka PHP."; ?>
Velká kniha PHP 5 a MySQL
67
UPOZORNĚNÍ Přestože jsou krátké značky praktické, nepoužívejte je, pokud vytváříte software řízený PHP, který chcete redistribuovat. Tato schopnost by totiž mohla být vypnutá v souboru php.ini.
Když je zapnutý styl krátkých značek a potřebujete v PHP rychle něco vypsat, lze vynechat patřičné PHP příkazy pro výstup a využít variantu výstupu známou jako zkrácená výstupní syntaxe (short-circuit syntax): <?="Tohle je další ukázka PHP.";?>
Což je funkčně ekvivalentní oběma následujícím variantám: <? print "Tohle je další ukázka PHP."; ?> <? php print "Tohle je další ukázka PHP";?>
Styl <script> Z historických příčin měly některé editory potíže rozpoznat, že se s těmito variantami syntaxe obracíte na PHP. Proto byla do jazyka PHP začleněna ještě jedna varianta oddělovací syntaxe používající <script>: <script language="php"> print "Tohle je další ukázka PHP."; </script>
Styl ASP Dynamické stránky ASP od společnosti Microsoft používají obdobnou strategii. Také oddělují statickou syntaxi od dynamické prostřednictvím předem definovaných znaků. Dynamická syntaxe se uvozuje znaky <% a ukončuje znaky %>. Přicházíte-li z krajiny ASP a už jenom ze zvyku chcete používat tuto syntaxi, PHP ji podporuje. Podívejte se na ukázku: <% print "Tohle je další ukázka PHP."; %>
Mějte ale na paměti, že pokud něco dělat můžete, neznamená to, že byste to tak měli dělat. Oddělovací varianty ve stylu ASP a <script> se v praxi používají jen výjimečně a měli byste se jim vyhýbat, pokud nemáte opravdu pádný důvod je používat. UPOZORNĚNÍ
Od PHP 5.3 už není syntaxe ve stylu ASP k dispozici.
Vkládání několika bloků kódu Na PHP se můžete obracet na dané stránce kolikrát, kolikrát jenom chcete. Například následující ukázka je z formálního pohledu zcela v pořádku: <html>
Kapitola 3 – Základy PHP
68
<head><title><?php echo "Vítejte na mém webu!";?></title> </head> <body> <?php $date = "11. dubna 2011"; ?> <h3>Dnes je <?=$date;?></h3> </body> </html>
Jak můžete vidět, jakékoli proměnné, které se deklarují před blokem kódu, se zapamatují pro potřeby následných bloků, což je v našem příkladu případ proměnné $date.
Komentáře Zdůraznit, jak moc je důležité, abyste prokládali kód pečlivými komentáři, není nikdy zbytečné. PHP pro komentáře nabízí několik syntaktických variant, které si nyní popíšeme.
Syntaxe jediného řádku z C++ Pro komentář často stačí jediný řádek. Protože je komentář krátký, není třeba ho ukončovat speciálním ukončovacím oddělovačem, protože tuto roli uspokojivě zvládne znak pro nový řádek (\n). PHP podporuje jednořádkové komentáře ve stylu C++, které jsou uvozeny dvěma lomítky (//), jako zde: <?php // Titulek: Můj první skript PHP // Autor: Jason Gilmore print "Tohle je program PHP"; ?>
Syntaxe shellu PHP také podporuje alternativu k syntaxi ve stylu C++, které se říká syntaxe shellu. Komentář je uvozen znakem hash (#). Předchozí ukázka pak vypadá takto: <?php # Titulek: Můj první skript PHP # Autor: Jason Gilmore print "Tohle je program PHP"; ?>
Komentář na několika řádcích ve stylu C Často je žádoucí vložit obšírnější popis, jak daná část kódu funguje, nebo jiné poznámky ke kódu. Takové vysvětlení se obvykle na jediný řádek nevejde. Přestože můžete postupovat tak, že byste každý řádek komen-
Velká kniha PHP 5 a MySQL
69
táře zahájili oddělovačem ve stylu C++ nebo shellu, PHP nabízí mnohem praktičtější variantu s uvozovacím a ukončovacím oddělovačem komentáře. Následující ukázka mluví sama za sebe: <?php /* Zpracovává platby PayPal Tento skript má na starost zpracování platby zákazníka přes PayPal. Přebírá informace o kreditní kartě zákazníka a platební adrese Copyright 2010 W.J. Gilmore, LLC. */ ?>
Pokročilá dokumentace s PHPDOCUMENTOR Protože dokumentace tvoří důležitou část procesu efektivního vytváření kódu a jeho správy, bylo vynaloženo hodně úsilí, aby se našlo dobré řešení, které by opravdu pomáhalo vývojářům tento proces automatizovat. A skutečně, v současné době jsou už k dispozici pokročilá dokumentační řešení pro všechny mainstreamové programovací jazyky, včetně PHP. Nástroj s názvem phpDocumentor (www.phpdoc.org) je open-source projekt, který usnadňuje proces dokumentace tím, že převádí komentáře vložené do zdrojového kódu do různých snadno čitelných formátů, mezi něž patří HTML a PDF. Nástroj phpDocumentor pracuje tak, že analyzuje zdrojový kód aplikace a hledá v něm speciální komentáře známé jako DocBlocks. DocBlocks se používají ke zdokumentování veškerého kódu uvnitř aplikace, včetně skriptů, tříd, funkcí, proměnných a dalších prvků, obsahují lidem srozumitelná vysvětlení spolu s formalizovanými deskriptory, jako jsou jméno autora, verze kódu, prohlášení o copyrightu, návratové hodnoty funkcí a mnoho dalších věcí. I když jste úplně začínající programátor, vřele se doporučuje, abyste se obeznámili s pokročilými dokumentačními řešeními a zvyknuli si je standardně používat i v jednoduchých aplikacích.
Výstup dat do prohlížeče Je samozřejmé, že i nejjednodušší dynamické weby potřebují nějaký výstup dat do prohlížeče. PHP pro tyto účely nabízí několik způsobů, jak to udělat. POZNÁMKA Když v průběhu této kapitoly nebo někde jinde v knize uvádím nějaké funkce, odkazuji se na jejich prototyp. Prototyp je prostě definice funkce, která formalizuje její název, vstupní parametry a datový typ návratové hodnoty. Jestliže nevíte, co je datový typ, podívejte se do sekce "Datové typy podporované PHP" později v této kapitole.
Příkaz print() Příkaz print() vypíše data, která se do něho předají. Jeho prototyp je následující: boolean print(argument)
Všechny následující příkazy jsou platnými příkazy print():
70
Kapitola 3 – Základy PHP
<?php print("<p>Zbožňuji léto.</p>"); ?> <?php $obdobi = "léto"; print "<p> Zbožňuji $obdobi.</p>"; ?> <?php print "<p> Zbožňuji léto.</p>"; ?>
Všechny tyto příkazy vyprodukují identický výstup: Zbožňuji léto.
POZNÁMKA Přestože nás oficiální syntaxe vybízí, abychom argument dávali do závorek, máte možnost je vynechat, protože print() vlastně není funkce – je to jazyková konstrukce. Mnozí programátoři je neuvádějí prostě proto, že cílový argument je zřejmý i bez nich.
Návratová hodnota příkazu print() je zavádějící, protože je vždy 1, bez ohledu na výsledek (ovšem jediné, co tento příkaz dělá, nic jiného jsem s tímto příkazem nikdy nezažil, je odeslání požadovaného výstupu do prohlížeče). Liší se od chování většiny funkcí v tom smyslu, že jejich návratová hodnota často slouží jako indikátor, zdali se funkce vykonala tak, jak se očekávalo.
Příkaz echo() Příkaz echo funguje obdobně jako print, ale se dvěma odlišnostmi, které jsou ale pro většinu čtenářů zcela nezajímavé, takže se zde jimi zabývat nebudeme. Prototyp příkazu echo() vypadá takto: void echo(string argument1 [, ...string argumentN])
Chcete-li použít příkaz echo(), použijte argument stejným způsobem jako u print(): echo "Zbožňuji léto.";
Jak je vidět z prototypu, echo umí vypsat několik řetězců. Užitečnost této konkrétní vymoženosti je problematická, vypadá, že je to více než cokoli jiného pouze otázka osobních preferencí. Nicméně tato vymoženost je k dispozici, pokud pocítíte neodolatelnou potřebu ji použít. Tady máte ukázku: <?php $heavyweight = "Lennox Lewis"; $lightweight = "Floyd Mayweather"; echo $heavyweight, " a ", $lightweight, " jsou skvělí bojovníci."; ?>
239
KAPITOLA 10 Práce se souborovým a s operačním systémem V současnosti se jen vzácně vytvářejí aplikace, které by byly zcela soběstačné (tj. programy, které by se nespoléhaly na nějakou úroveň interakce s externími zdroji, jako je třeba podkladový souborový a operační systém). Důvod je zcela prostý: jak postupně dozrávaly programovací jazyky, souborové systémy a operační systémy, značně vzrostly možnosti pro vytváření mnohem efektivnějších, škálovatelných a dobře časovaných aplikací, protože vývojáři mohli integrovat osvědčené schopnosti všech těchto komponent do jediného produktu. Vtip samozřejmě spočívá v tom, zvolit nějaký takový jazyk, který k tomu nabízí příhodné a účinné prostředky. PHP naštěstí splňuje obě podmínky velmi pěkně. Nabízí programátorům báječnou paletu nástrojů nejenom pro zpracování vstupních a výstupních operací týkajících se souborového systému, ale také pro vykonávání programů na úrovni shellu. Tato devátá kapitola slouží jako úvod do celé této funkcionality a probírají se v ní následující témata: Soubory a adresáře. Zde se naučíte zacházet se souborovým systémem. Dozví-
te se, jak o něm získávat všelijaké podrobnosti, jako je velikost souborů a adresářů, čas poslední modifikace a posledního přístupu a další věci. Vstupní a výstupní operace se soubory. Zde se naučíte komunikovat se soubo-
ry dat, takže pak budete moci provádět řadu praktických úloh, mezi něž patří vytváření a odstraňování souborů, čtení ze souborů a zapisování do nich. Obsah adresářů. Zde se dozvíte, jak snadno se dá získat obsah adresářů. Příkazy shellu. Z PHP můžete prostřednictvím řady zabudovaných funkcí
a mechanismů využívat funkcionalitu operačního systému i jiných jazyků. Ověřování vstupů. Zde se předvádí výbava PHP pro ověřování vstupů od uži-
vatelů. Dozvíte se, jak uživatelům zabránit v tom, aby předávali taková data, která by případně mohla poškodit vaše data nebo operační systém. POZNÁMKA PHP je obzvlášť zdatný při práci s podkladovým souborovým systémem, takže si získal značnou popularitu jako interpret příkazového řádku (tato schopnost přišla s verzí 4.2.0). Protože se ovšem jedná o téma, které značně přesahuje rámec této knihy, vyhledejte si o něm dodatečné informace v manuálu PHP.
240
Kapitola 10 – Práce se souborovým a s operačním systémem
Soubory a adresáře Uspořádávání provázaných dat do entit, kterým se běžně říká soubory a adresáře, je v počítačovém prostředí už dlouhá léta klíčový pojem. Proto musí programátor často získávat důležité podrobnosti o souborech a adresářích, jako jsou umístění, velikost, čas poslední modifikace a čas posledního přístupu. V tomto oddílu se popisují mnohé ze zabudovaných funkcí PHP, s nimiž se dají tyto důležité podrobnosti získávat.
Rozklad cest k adresářům Často je prospěšné, když rozložíte cestu k adresáři na různé atributy, jako jsou koncová přípona, samotná cesta nebo samotný název souboru. K řešení takových úloh je k dispozici několik funkcí, jejichž popis následuje.
Získání názvu souboru z cesty Funkce basename() vrátí z cesty název souboru. Má prototyp: string basename (string path [, string suffix])
Je-li uveden nepovinný parametr suffix, vynechá se z vraceného názvu souboru specifikovaná přípona, pokud ji soubor obsahuje. Jednoduchá ukázka: <?php $path = "/home/www/data/users.txt"; printf("Název souboru: %s <br />", basename($path)); printf("Název souboru bez přípony: %s <br />", basename($path, ".txt")); ?>
Příklad vyprodukuje tento výstup: Název souboru: users.txt Název souboru bez přípony: users
Získání adresáře z cesty Funkce dirname() je v podstatě protějškem basename(). Vrací cestu ze zadaného parametru path. Má prototyp: string dirname (string path)
Následující kód získá adresář vedoucí k souboru s názvem users.txt: <?php $path = "/home/www/data/users.txt"; printf("Adresář: %s", dirname($path)); ?>
Vrátí se: Adresář: /home/www/data
Velká kniha PHP 5 a MySQL
241
Další informace o cestách Funkce pathinfo() vytvoří asociativní pole obsahující čtyři komponenty cesty specifikované parametrem path: název adresáře, celý název souboru, přípona a název souboru bez přípony. Má prototyp: array pathinfo(string path [, options])
Mějme tuto cestu: /home/www/htdocs/book/chapter10/index.html
Funkce pathinfo() zpracuje tuto cestu do čtyř následujících komponent: Název adresáře (dirname): /home/www/htdocs/book/chapter10 Celý název souboru (basename): index.html Přípona názvu souboru (extension): html Název souboru (filename): index
Funkci pathinfo() můžete pro získání uvedených informací použít třeba takto: <?php $pathinfo = pathinfo("/home/www/htdocs/book/chapter10/index.html"); printf("Název adresáře: %s <br />", $pathinfo['dirname']); printf("Celý název souboru: %s <br />", $pathinfo['basename']); printf("Přípona: %s <br />", $pathinfo['extension']); printf("Název souboru bez přípony: %s <br />", $pathinfo['filename']); ?>
Vrátí se: Název adresáře: /home/www/htdocs/book/chapter10 Název souboru: index.html Přípona: html: Název souboru bez přípony: index
Nepovinným parametrem $options můžete modifikovat, které ze čtyř podporovaných atributů se budou vracet. Nastavíte-li ho například na PATHINFO_FILENAME, naplní se ve vraceném poli pouze atribut filename (název souboru bez přípony). Kompletní seznam podporovaných hodnot $options naleznete v oficiální dokumentaci k PHP.
Identifikace absolutní cesty Funkce realpath() převede všechny symbolické odkazy (symbolic links) a odkazy na relativní cesty (relative path references) umístěné v path na jejich absolutní protějšky. Má tento prototyp: string realpath (string path)
Předpokládejme například, že struktura adresářů vypadá takto: /home/www/htdocs/book/images/
Pak můžete použít realpath() pro vyřešení libovolných odkazů na místní cesty:
242
Kapitola 10 – Práce se souborovým a s operačním systémem
<?php $imgPath = "../../images/cover.gif"; $absolutePath = realpath($imgPath); // Vrátí /www/htdocs/book/images/cover.gif ?>
Zjišťování velikosti souboru, adresáře a disku Zjistit velikost souboru, adresáře, nebo disku? To je běžný úkol v aplikacích všeho druhu. V tomto oddílu se seznámíte s četnými standardními funkcemi PHP, které byly navrženy pro tento účel.
Zjištění velikosti souboru Funkce filesize() vrátí velikost souboru v bajtech. Má prototyp: int filesize (string filename)
Ukázka: <?php $file = "/www/htdocs/book/chapter1.pdf"; $bytes = filesize("$file"); $kilobytes = round($bytes/1024, 2); printf("Soubor %s má $bytes bajtů, neboli %.2f kilobajtů", basename($file), $kilobytes);
Vrátí se následující výstup: Soubor chapter1.pdf má 91815 bajtů, neboli 89.66 kilobajtů
Výpočet volného místa na disku Funkce disk_free_space() vrátí dostupné volné místo (v bajtech) té diskové oblasti (partition), která hostuje specifikovaný adresář. Má prototyp: float disk_free_space (string directory)
Ukázka: <?php $drive = "C:"; printf("Na jednotce %s zbývá volných %.2f MB", $drive, round((disk_free_space($drive) / 1048576), 2)); ?>
Vrátí: Na jednotce C: zbývá volných 32412.85 MB
Připomínám, že v tomto případě je vrácené číslo v megabajtech (MB), protože návratová hodnota disk_ free_space() se vydělila číslem 1 048 576, což je počet bajtů jednoho MB.
Velká kniha PHP 5 a MySQL
243
Výpočet celkové velikosti disku Funkce disk_total_space() vrátí celkovou velikost (v bajtech) té diskové oblasti (partition), která hostuje specifikovaný adresář. Má prototyp: float disk_total_space (string directory)
Použijete-li funkci v součinnosti s funkcí sdisk_free_space(), snadno se dostanete k užitečným statistikám o alokaci prostoru: <?php $partition = "C:"; // Určí celkovou velikost oblasti $totalSpace = disk_total_space($partition) / 1048576; // Určí používaný prostor specifikované oblasti $usedSpace = $totalSpace - disk_free_space($partition) / 1048576; printf("Oblast: %s (Alokováno: %.2f MB. Používá se: %.2f MB.)", $partition, $totalSpace, $usedSpace);} ?>
Vrátí se: Oblast: C: (Alokováno: 97299.93 MB. Používá se: 64887.13 MB.)
Zjištění velikosti adresáře PHP v současné době nenabízí standardní funkci, která by vrátila celkovou velikost adresáře. Přitom je to ale úloha, která se požaduje mnohem častěji než zjistit celkovou velikost disku (viz disk_total_space() v předchozím oddílu). Můžete sice na systémové úrovni zavolat unixový příkaz du pomocí exec() nebo system(), obě probereme později v oddílu "Funkce PHP pro spouštění programů", ale funkce tohoto druhu jsou často z bezpečnostních příčin vypnuté. Alternativním řešením je napsat vlastní funkci PHP. Zdá se, že k tomuto účelu bude vhodná nějaká rekurzivní funkce. Jedno z možných řešení vidíte ve výpisu 10-1. POZNÁMKA Unixový příkaz du shrnuje informace o tom, jak soubor nebo adresář využívá disk. Další informace o něm najdete v manuálu.
Výpis 10-1. Zjištění velikosti obsahu adresáře. <?php function directorySize($directory) { $directorySize=0; // Otevře adresář a přečte jeho obsah. if ($dh = @opendir($directory))
Kapitola 10 – Práce se souborovým a s operačním systémem
244 {
// Iteruje přes všechny položky adresáře. while (($filename = readdir ($dh))) { // Odfiltruje nežádoucí položky adresáře. if ($filename != "." && $filename != "..") { // Máme soubor, takže určíme jeho velikost a přičteme k celku. if (is_file($directory."/".$filename)) $directorySize += filesize($directory."/".$filename); // Nový adresář, takže zahájíme rekurzi. if (is_dir($directory."/".$filename)) $directorySize += directorySize($directory."/".$filename); } } } @closedir($dh); return $directorySize; } $directory = "/usr/book/chapter10/"; $totalSize = round((directorySize($directory) / 1024), 2); echo "Adresář $directory: ". $totalSize. " MB." ?>
Když skript vykonáte, vypíše se toto: Adresář /usr/book/chapter10/: 2.12 MB
Časy posledního přístupu a modifikace Možnost určit čas posledního přístupu k souboru, nebo čas, kdy byl soubor naposled modifikován, hraje důležitou roli při mnoha administračních úlohách, speciálně ve webových aplikacích, v nichž se provádějí intenzivní síťové operace nebo aktualizační operace intenzívně využívající CPU. PHP nabízí celkem tři funkce, jejichž prostřednictvím se dá zjistit poslední přístup k souboru, kdy byl soubor vytvořen a kdy byl naposled modifikován. Jejich popis následuje.
Zjištění času posledního přístupu k souboru Funkce fileatime() vrátí čas posledního přístupu k souboru s názvem filename ve formátu časového razítka Unixu. Při chybě vrátí FALSE. Má prototyp: int fileatime (string filename)
585
KAPITOLA 31 Úvod do PDO Zatímco všechny mainstreamové databáze ve větší nebo menší míře respektují standard SQL, rozhraní, na nichž jsou programátoři závislí, pokud chtěji komunikovat s databází, mohou být značně odlišná (a to dokonce i tehdy, když jsou dotazy z valné části stejné). Proto bývají aplikace téměř vždy svázány s nějakou konkrétní databází, čímž nutí uživatele, aby si také nainstalovali a pracovali s požadovanou databází, i když je méně vyspělá než jiná řešení, která jsou už ve formě používána. Předpokládejme například, že vaše organizace, jejíž IT systém a aplikace fungují na MySQL, uvažuje o koupi nové aplikace, která pro svůj běh vyžaduje databázi Oracle. Odhodláte se investovat značné prostředky, které bude nutno vynaložit, abyste se dostali na takovou úroveň vědomostí o Oracle, že ji budete moci provozovat v nějakém pro organizaci klíčovém prostředí a nasazovat a udržovat tuto databázi v průběhu života aplikace? Aby se programátoři mohli s těmito dilematy nějak vypořádat, začali vyvíjet abstraktní databázové vrstvy s cílem oddělit logiku aplikace od logiky komunikace s databází. Když se všechny příkazy, které souvisejí s databází, mohou prohnat nějakým zevšeobecněným rozhraním, může daná aplikace používat jedno z několika různých databázových řešení, za předpokladu, že daná databáze podporuje schopnosti, které aplikace vyžaduje a že příslušná abstraktní vrstva nabízí ovladač, který je kompatibilní s danou databází. Graficky je tento proces znázorněn na obrázku 23-1.
Obrázek 31-1. Abstraktní databázová vrstva.
586
Kapitola 31 – Úvod do PDO
Zde je seznam několika rozšířenějších implementací tohoto konceptu: MDB2. MDB2 je databázová abstraktní vrstva, která je napsána v PHP a která je k dispozici jako balík
PEAR. (Další informace o PEAR viz kapitola 11.) V současné době podporuje databáze FrontBase, InterBase, MySQL, Oracle, ODBC, PostgreSQL, QuerySim a SQLite. JDBC. Jak už název implikuje, standard Java Database Connectivity (JDBC) umožňuje programá-
torům Javy komunikovat s libovolnou databází, pro kterou je k dispozici ovladač JDBC. Patří sem například Microsoft SQL Server, MySQL, Oracle a PostgreSQL. ODBC. Rozhraní Open Database Connectivity (ODBC) je v současnosti jedna z nejrozšířenějších
abstraktních implementací, podporuje ji široká škála aplikací a jazyků, včetně PHP. Rozhraní ODBC podporuje všechny mainstreamové databáze, včetně těch, co jsou uvedeny v seznamu JDBC výše. Perl DBI. Modul Perl Database Interface je standardizovaný prostředek Perlu pro komunikaci s data-
bází. Sloužil jako inspirace při tvorbě balíku DB PHP. Protože PHP nabízí MDB2 a podporuje ODBC, může se zdát, že vaše potřeby z hlediska databázové abstrakce jsou vyřešeny, pokud vyvíjíte aplikace řízené PHP, není-liž pravda? I když jsou tato a mnohá jiná řešení hotová a okamžitě po ruce, už nějakou dobu je k dispozici ještě lepší řešení, které bylo oficiálně vydáno s PHP 5.1. Jak můžete odhadnout podle názvu této kapitoly, jedná se o abstraktní vrstvu PDO (PHP Data Objects).
Pro další abstraktní databázová vrstva? S tím, jak PDO v posledních dvou letech dozrával, se objevila spousta nepěkných řečí od vývojářů, kteří byli buď zainteresováni ve vývoji nějakých jiných databázových abstraktních vrstev, nebo příliš soustředěni pouze na schopností databázové abstraktní vrstvy PDO místo toho, aby se raději zaměřili na celou sadu nabízených schopností. A skutečně, PDO poslouží jako ideální náhrada balíku MDB2 PEAR a obdobných řešení. Nicméně PDO je ve skutečnosti mnohem dále a není to jen pouhá další databázová abstraktní vrstva: Konzistentní kódování. Protože většina z databázových rozšíření, která jsou k dispozici pro PHP, byla
vytvářena přispěvovateli, kteří se k tomu tak nějak "nachomýtli", neexistuje jednotnost v kódování, navzdory faktu, že všechna tato rozšíření nabízejí v zásadě stejné schopnosti. PDO ale tuto nejednotnost odstraňuje, protože nabízí jediné rozhraní, které je jednotné bez ohledu na to, o jakou databázi se jedná. Rozšíření je navíc rozděleno do dvou zřetelně vymezených komponent, takže jádro PDO obsahuje většinu kódu specifického pro PHP. To vede k tomu, že jednotlivé ovladače se mohou soustředit výhradně na manipulaci s daty. Vývojáři PDO také využili svých vědomostí a zkušeností při budování různých databázových rozšíření z posledních let. Co se osvědčilo, to jednoduše zařadili a současně si dávali pečlivý pozor, aby do PDO nezařazovali něco, co se v praxi neprosadilo. Ačkoliv několik jistých nejednotností ještě přetrvává, z valné části jsou databázové schopnosti abstrahovány velmi pěkně. Flexibilita. Protože PDO načítá potřebný databázový ovladač až při běhu, není potřeba překonfigu-
rovat a překompilovat PHP pokaždé, když se používá jiná databáze. Pokud potřebujete náhle přejít z Oracle na MySQL, prostě jen načtěte ovladač PDO_MYSQL (jak se to udělá, o tom více později). Objektově orientované schopnosti. PDO využívá objektově orientovaných schopností PHP, což vede
k vyspělejšímu a efektivnějšímu přístupu k databázové komunikaci, než jaký používala dřívější řešení. Výkon. PDO je napsaný v jazyce C a zakompilován do PHP, což samo o sobě (budou-li všechny ostat-
ní faktory rovnocenné) poskytuje značný nárůst výkonu oproti řešením napsaným v PHP. Vzhledem k těmto přednostem se nabízí otázka, proč to nezkusit? V této kapitole se dostatečně obeznámíte s PDO a s myriádami schopností, které tato abstraktní databázová vrstva nabízí.
Velká kniha PHP 5 a MySQL
587
Způsob práce s PDO PDO se až pozoruhodně podobá všem databázovým rozšířením, která PHP už dlouhou dobu podporuje. Takže pokud jste již někdy používali PHP v součinnosti s nějakou databází, měla by vám látka prezentovaná v tomto oddílu připadat důvěrně známá. Jak už bylo zmíněno, PDO byl vybudován tím stylem, že jeho tvůrci měli stále před očima nejlepší schopnosti mnoha předchozích databázových rozšíření, takže není divu, že v jeho metodách pravděpodobně najdete značné podobnosti s tím, co už znáte. Oddíl zahájíme stručným přehledem procesu instalace PDO, poté bude následovat přehled databázových serverů, které se momentálně podporují. Ve všech příkladech této kapitoly budeme používat následující tabulku MySQL: CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT, sku CHAR(8) NOT NULL, title VARCHAR(100) NOT NULL, PRIMARY KEY(id) );
Předpokládá se dále, že tabulka už obsahuje výrobky uvedené v tabulce 31-1. Tabulka 31-1. Vzorek dat o výrobcích. id
sku
title
1
ZP457321
Painless Aftershave
2
TY232278
AquaSmooth Toothpaste
3
PO988932
HeadsFree Shampoo
4
KL334899
WhiskerWrecker Razors
Instalace PDO Od verze PHP 5.1 je rozšíření PDO standardně zapnuté, nicméně ovladač MySQL PDO nikoliv. Ačkoliv je možné instalovat PDO a potřebné PDO ovladače jako sdílené moduly, nejsnazší je sestavit PDO a ovladače staticky. Jakmile s tím budete hotovi, nebudete už muset dělat žádné změny vztahující se ke konfiguraci. Protože se momentálně zajímáte pouze o ovladač MySQL PDO, stačí předat indikátor --with-pdo-mysql, když konfigurujete PHP. Pracujete-li s PHP 5.1 nebo novější verzí na platformě Windows, je potřeba přidat odkazy na rozšíření a ovladače PDO v souboru php.ini. Pokud chcete zapnout podporu pro MySQL, jednoduše přidejte do sekce Windows Extensions dva následující řádky: extension=php_pdo.dll extension=php_pdo_mysql.dll
A jako vždy, nezapomeňte restartovat Apache, aby změny v php.ini začaly účinkovat.
588
Kapitola 31 – Úvod do PDO
Podpora databází v PDO Když jsem psal tyto řádky, PDO podporoval poměrně hodně databází kromě, všech těch, které jsou přístupné přes DBLIB a ODBC: 4D. Přístupná přes ovladač PDO_4D. Firebird/Interbase 6. Přístupná přes ovladač PDO_FIREBIRD. IBM DB2. Přístupná přes ovladač PDO_IBM. Informix. Přístupná přes ovladač PDO_INFORMIX. Microsoft SQL Server. Přístupná přes ovladač PDO_DBLIB. MySQL. Přístupná přes ovladač PDO_MYSQL. ODBC. Přístupná přes ovladač ODBC. ODBC není databáze sama o sobě, ale umožňuje použití PDO
v součinnosti s libovolnou databází kompatibilní s ODBC, která není uvedena v tomto seznamu. Oracle. Přístupná přes ovladač PDO_OCI. Podporují se Oracle verze 8 až 11g. PostgreSQL. Přístupná přes ovladač PGSQL. SQLite 3.X. Přístupná přes ovladač SQLITE.
TIP Které ovladače PDO máte dostupné ve svém prostředí? Zobrazte si v prohlížeči výstup z phpinfo() a podívejte se do sekce PDO. Nebo zavolejte funkci pdo_drivers(), třeba <?php print_r(pdo_drivers()); ?>.
Připojení k databázovému serveru a výběr databáze Než můžete začít komunikovat s databází přes PDO, musíte zřídit připojení k serveru a vybrat databázi. Udělá se to konstruktorem PDO. Jeho prototyp vypadá takto: PDO PDO::__construct(string DSN [, string username [, string password [, array driver_opts]]])
Parametr DSN (Data Source Name) se skládá ze dvou prvků: z názvu požadovaného databázového ovladače a všech nezbytných proměnných databázových připojení (jako jsou název hostitele, port a název databáze). Parametry username a password specifikují uživatelské jméno a heslo, které se použijí při připojení k databázi. A konečně, pole driver_opts specifikuje jakékoli další volby, které by se mohly požadovat nebo jsou žádoucí pro připojení. Seznam dostupných voleb je uveden na konci tohoto oddílu. Konstruktor lze volat několika způsoby, které si teď uvedeme.
Vložení parametrů do konstruktoru Nejsnáze se připojíte k databázi tak, že prostě vložíte parametry pro připojení přímo do konstruktoru. Například byste ho mohli zavolat třeba takto (jedná se konkrétně o databázi MySQL): $dbh = new PDO('mysql:host=localhost;dbname=chp31', 'webuser', 'secret');
Velká kniha PHP 5 a MySQL
589
Umístění parametrů do souboru PDO využívá schopnost PHP pracovat s proudy, což otevírá možnost umístit řetězec DSN do samostatného souboru, který bude na nějakém místním nebo vzdáleném umístění. Na něj se pak odkážete v konstruktoru, viz následující ukázka: $dbh = new PDO('uri:file://usr/local/mysql.dsn');
Je ale potřeba zajistit, aby soubor vlastnil stejný uživatel, který vykonává skript PHP a aby tento uživatel měl udělena patřičná přístupová oprávnění.
Odkaz na soubor php.ini Informace o DSN je také možné udržovat v souboru php.ini, když je přiřadíte do konfiguračního parametru pdo.dsn.aliasname, kde aliasname je zvolený alias pro DSN, který následně dodáte do konstruktoru. Například v následující ukázce je alias DSN mysqlpdo: [PDO] pdo.dsn.mysqlpdo = 'mysql:dbname=chp31;host=localhost'
Alias pak následně uvedete ve volání konstruktoru PDO, jako zde: $dbh = new PDO('mysqlpdo', 'webuser', 'secret');
Podobně jako v předchozím způsobu, ani tento neumožňuje zařadit do DSN uživatelské jméno a heslo.
Volby PDO vztahující se k připojení Existuje několik voleb vztahujících se k připojení, jimiž můžete připojení přizpůsobit svým potřebám. Předávají se v poli driver_opts. Dostupné volby jsou uvedené v následujícím výčtu: PDO::ATTR_AUTOCOMMIT. Určuje, zda bude PDO potvrzovat změny hned po vykonání každého dota-
zu, nebo zda bude čekat, až se vykoná metoda commit(). PDO::ATTR_CASE. PDO můžete donutit, aby převáděl získané názvy sloupců na samá velká nebo
malá písmena, nebo aby používal názvy sloupců přesně v tom tvaru, v jakém jsou v databázi. Volba se nastavuje na jednu ze tří hodnot: PDO::CASE_UPPER, PDO::CASE_LOWER a PDO::CASE_NATURAL. PDO::ATTR_EMULATE_PREPARES. Zapnutím této volby umožníte připraveným příkazům využívat ca-
che dotazů MySQL. PDO::ATTR_ERRMODE. PDO podporuje tři módy oznamování chyb, PDO::ERRMODE_EXCEPTION, PDO::ERRMODE_SILENT a PDO::ERRMODE_WARNING. Určují, za jakých okolností PDO oznámí chybu. Volba se nastavuje na jednu ze tří výše uvedených hodnot, výchozí chování je PDO::ERRMODE_EXCEPTION. Tato volba se probírá podrobněji v pozdějším oddílu "Obsluha chyb". PDO::ATTR_ORACLE_NULLS. Je-li nastavena na TRUE, způsobí, že se budou získané prázdné řetězce převádět na NULL. Výchozí hodnota je FALSE. PDO::ATTR_PERSISTENT. Určuje, zda je připojení trvalé. Výchozí hodnota je FALSE. PDO::ATTR_PREFETCH. Jedná se o databázovou schopnost, při které se získává několik řádků, i když
klient v daném okamžiku požaduje jen jeden řádek, a to na základě filozofie, že pokud klient požádal o jeden řádek, je pravděpodobné, že bude postupně žádat ještě o další. Snižuje počet požadavků obra-
Kapitola 31 – Úvod do PDO
590
cejících se na databázi a zvyšuje efektivitu. Volba nastavuje velikost získávané sady v kilobajtech u těch ovladačů, které tuto schopnost podporují. PDO::ATTR_TIMEOUT. Tato volba nastavuje dobu v sekundách, po kterou se bude čekat, než se skončí. PDO::DEFAULT_FETCH_MODE. Nastavuje výchozí mód získávání (asociativní pole, indexovaná pole
nebo objekty). Pokud tedy dáváte pravidelně přednost jednomu z nich, můžete ušetřit pár úhozů. Další čtyři atributy umožňují dozvědět se dodatečné informace o klientovi, serveru a o stavu připojení. Hodnoty těchto atributů lze získat metodou getAttribute(), která se probírá v pozdějším oddílu "Získávání a nastavování atributů". PDO::ATTR_SERVER_INFO. Obsahuje specifické informace o databázovém serveru. V případě data-
báze MySQL jsou to data vztahující se k době provozu serveru, kolik bylo celkem dotazů, průměrný počet vykonaných dotazů za sekundu a další důležité informace. PDO::ATTR_SERVER_VERSION. Obsahuje informace o čísle verze databázového serveru. PDO::ATTR_CLIENT_VERSION. Obsahuje informace o čísle verze klienta databáze. PDO::ATTR_CONNECTION_STATUS. Obsahuje informace o stavu připojení k databázi. Pokud napří-
klad pracujete s MySQL, po úspěšném připojení atribut obsahuje "localhost via TCP/IP", zatímco při práci s PostgreSQL obsahuje "Connection OK; waiting to send".
Obsluha chyb při připojení Když dojde k chybě při pokusu o připojení, skript okamžitě skončí, pokud řádně nezachytíte vrácený objekt PDOException. S využitím syntaxe pro obsluhu výjimek (další informace viz kapitola 8) to jde snadno. Následující příklad ukazuje, jak zachytíte výjimku, když se při připojení vyskytne nějaký problém: <?php try { $dbh = new PDO('mysql:host=localhost;dbname=chp31', 'webuser', 'secret'); } catch (PDOException $exception) { echo "Chyba při připojení: " . $exception->getMessage(); } ?>
Jakmile zřídíte připojení, můžete ho začít používat, což je téma zbývající části této kapitoly.
Obsluha chyb PDO nabízí tři chybové módy, takže si můžete přizpůsobit, jak má rozšíření obsluhovat vzniklé chyby: PDO::ERRMODE_EXCEPTION. Vygeneruje výjimku pomocí třídy PDOException, vykonávání skriptu
se okamžitě zastaví a nabídnou se informace vztahující se k zjištěné závadě. PDO::ERRMODE_SILENT. Když dojde k chybě, nedělá nic a ponechává na vývojáři, aby sám kontrolo-
val chyby a určil, co se s nimi má dělat. Je to výchozí nastavení. PDO::ERRMODE_WARNING. Dojde-li k nějaké chybě při práci s rozšířením PDO, vyprodukuje se zpráva
PHP E_WARNING. Chcete-li nastavit chybový mód, stačí zavolat metodu setAttribute(), jako zde:
Velká kniha PHP 5 a MySQL
591
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
K dispozici jsou také dvě metody, s nimiž se dají získávat informace o chybě. Jejich popis následuje.
Získání chybových kódů SQL Standard SQL nabízí seznam diagnostických kódů, jimiž se signalizuje, jak dopadly dotazy SQL. Jsou více známy jako kódy SQLSTATE. Když na webu budete hledat "SQLSTATE codes", naleznete seznam těchto kódů a jejich význam. Metodou errorCode() se dá vrátit standardní kód SQLSTATE, který pak můžete uložit do nějakého protokolu nebo na jeho základě vyprodukovat své vlastní chybové zprávy. Má prototyp: int PDOStatement::errorCode()
Následující skript se například pokusí vložit nový výrobek, ale omylem se odkáže na název tabulky jednotným číslem, tedy na product místo správného názvu products: <?php try { $dbh = new PDO('mysql:host=localhost;dbname=chp31', 'webuser', 'secret'); } catch (PDOException $exception) { printf("Chyba při připojení: %s", $exception->getMessage()); } $query = "INSERT INTO product (id, sku, title) VALUES(NULL, 'SS873221', 'Surly Soap') "; $dbh->exec($query); echo $dbh->errorCode(); ?>
Skript by měl vyprodukovat kód 42S02, který odpovídá zprávě MySQL, že tabulka neexistuje. Tato zpráva samotná toho ovšem moc neříká, takže se určitě budete zajímat o metodu errorInfo() uvedenou dále.
Získání chybových zpráv SQL Metoda errorInfo() vyprodukuje pole informací o chybě, která se vztahuje k naposledy vykonávané databázové operaci. Má prototyp: array PDOStatement::errorInfo()
Pole se skládá ze tří hodnot. Na každou z nich se odkazuje číselným indexem, od 0 do 2: 0. Uloží kód SQLSTATE tak, jak je definovaný ve standardu SQL. 1. Uloží chybový kód specifický pro daný databázový ovladač. 2. Uloží chybovou zprávu specifickou pro daný databázový ovladač.
W. Jason Gilmore
PHP 5 a MySQL kompendium znalostí pro začátečníky i pokročilé Velká kniha PHP 5 a MySQL (nové, třetí vydání) je určena všem webovým tvůrcům a programátorům (a to i těm příležitostným), kteří se zajímají o prakticky pojatý a vyčerpávající pohled do PHP 5 a MySQL, se zvláštním důrazem na to, jak s těmito produkty vytvářet dynamické webové aplikace. Pokud jste začátečník v PHP, tato kniha vám pomůže získat všechny nezbytné základy, což mj. zahrnuje konfiguraci prostředí, seznámení se syntaxí PHP, práci s funkcemi, poli a regulárními výrazy, obsluhu chyb a výjimek atd. Pokud patříte mezi zkušenější programátory, jistě vám přijdou vhod pokročilejší témata, jako je obsluha relací, autentizace uživatelů, LDAP, zabezpečení webu, Ajax, Smarty, webové služby a spousta dalších. Tuto knihu by ale nebylo možné označit za vyčerpávající, pokud by v ní chyběly informace o MySQL, populárním databázovém serveru. Problematice MySQL je věnováno 14 kapitol a popisovaná témata sahají od instalace a konfigurace MySQL přes popis ukládacích enginů, zabezpečení MySQL či používání PHP a MySQL až k záležitostem souvisejícím s uloženými rutinami, triggery, pohledy, indexy či transakcemi.
ZONER software, a.s. významný producent softwaru v oblasti digitální fotogra¿e, poþítaþové gra¿ky a multimédií, poskytovatel internetových služeb, souvisejících s prezentací na internetu a e-komercí, a nakladatelství odborné literatury.
Seznam kapitol: x x x x x x x x x x x x x x x x x x x
Úvod do PHP Konfigurace prostředí Základy PHP Funkce Pole Objektově orientované PHP Pokročilé schopnosti OOP Obsluha chyb a výjimek Řetězce a regulární výrazy Práce se souborovým a s operačním systémem PEAR Datum a čas Práce s HTML formuláři Autentizace uživatelů Upload souborů Networking PHP a LDAP Obsluha relací Šablony se Smarty
x x x x x x x x x x x x x x x x x x x
Webové služby Zabezpečení webu Ajax a PHP Budování webů pro celý svět Zend Framework Úvod do MySQL Instalace a konfigurace MySQL Klienti pro MySQL Ukládací enginy MySQL a datové typy Zabezpečení MySQL Používání PHP s MySQL Úvod do PDO Uložené rutiny Triggery MySQL Pohledy MySQL Databázové dotazy v praxi Indexy a vyhledávání Transakce Import a export dat
www.zoner.cz
Zdrojové soubory ke stažení:
E N C Y K L O P E D I E
Z O N E R
P R E S S
Pod tímto logem vycházejí publikace určené pro každého vážného zájemce o práci s počítačem. Od ryze praktických příruček a průvodců až po komplexní publikace o všem, co potřebuje grafik, webdesignér, vývojář či programátor při každodenní práci. Na slevy, které můžete získat, a vydavatelský plán, v němž vedle knih domácích odborníků najdete celou řadu titulů světově uznávaných autorů, se informujte na adrese vydavatelství.
© Foto: Jana Vališová
http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar
DOPORUČENÁ CENA: 699 KČ KATALOGOVÉ ČÍSLO: ZR1114
ISBN 978-80-7413-163-9
Zoner Press tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno
9 7 8 8 0 7 4 1 3 1 6 3 9