velká knihy php 5 a mysql
DESCRIPTION
Velká knihy PHP 5 a MySQLTRANSCRIPT
E N C Y K L O P E D I E Z O N E R P R E S S
komp
endium
znalostí
pro
zaáteníky
i profesionály
PHP 5 a MySQL
VELKÁ KNIHAVELKÁ KNIHA
kompendium znalostí pro za áte níky i profesionálykompendium znalostí pro za áte níky i profesionály
NOVÉ, T ETÍ VYDÁNÍ
PHP 5 a MySQLPHP 5 a MySQL
WW. Jason Gilmore. Jason Gilmore
NOVÉ, T ETNOVÉ, T E
W. Jason Gilmore
Velká knihaPHP 5 a MySQL
Kompendium znalostí pro začátečníky i profesionályKompendium znalostí pro začátečníky i profesionály
– NOVÉ, TŘETÍ VYDÁNÍ
Beginning PHP and MySQL: From Novice to Professional, Fourth EditionW. Jason Gilmore
Original edition copyright © 2010 by W. Jason Gilmore. Czech edition copyright © 2011 by ZONER soft ware, 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 soft ware, 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, elek-tronicky 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 soft ware, a.s. Vydání třetí, v roce 2011. Všechna práva vyhrazena.
Zoner PressKatalogové číslo: ZR1114
ZONER soft ware, a.s.Nové sady 18, 602 00 Brno
Překlad: RNDr. Jan PokornýOdpovědný redaktor: Miroslav KučeraŠéfredaktor: Ing. Pavel KristiánDTP a obálka: Miroslav Kučera a Lenka KřížováFotografi e 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 dis-tribuová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 soft ware, a.s Nové sady 18, 602 00 Brno
tel.: 532 190 883 e-mail: [email protected] www.zonerpress.cz
ISBN: 978-80-7413-163-9
3
Stručný obsah
Kapitola 1 Úvod do PHP 27
Kapitola 2 Konfi gurace 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 konfi gurace 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 27
Historie 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í 33
Kapitola 2 Konfi gurace prostředí 35
Předběžné kroky před vlastní instalací 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
Konfi gurace PHP 43
Konfi gurace PHP v čase sestavování na Linuxu 43
Přizpůsobení distribuce sestavené pro Windows 44
Konfi gurace při běhu 44
Správa konfi guračních direktiv PHP 44
Konfi gurač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 61
Sedm otázek potenciálnímu poskytovateli webhostingu 62
Shrnutí 63
Kapitola 3 Základy PHP 65
Vkládání kódu PHP do webových stránek 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
Identifi kátory 79
Proměnné 79
Deklarace proměnné 80
Obor proměnné 81
Superglobální proměnné PHP 84
7
Proměnné proměnné 88
Konstanty 88
Defi nice konstanty 89
Výrazy 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 98
Řídící struktury 99
Podmínkové příkazy 99
Příkazy pro cyklus 101
Příkazy pro vkládání souborů 107
Shrnutí 110
Kapitola 4 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 121
Co je pole? 121
Vytvoření pole 123
Vytváření polí funkcí array() 123
Extrakce polí s konstrukcí list() 124
8
Plnění polí předdefi novaný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 130
Procházení polí 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 133
Zjištění velikosti a jedinečných hodnot pole 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í 148
Kapitola 6 Objektově orientované PHP 149
Výhody plynoucí z OOP 149
Zapouzdření 149
Dědění 150
Polymorfi smus 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í 172
Metoda __clone() 174
Dědění 175
Dědění třídy 175
Dědění a konstruktory 177
Dědění a pozdní statické vázání 179
Rozhraní 180
Implementace jediného rozhraní 181
Implementace několika rozhraní 182
Abstraktní třídy 183
Úvod do jmenných prostorů 183
Shrnutí 186
Kapitola 8 Obsluha chyb a výjimek 187
Konfi gurační direktivy 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
Identifi kace 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 203
Regulární výrazy 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 defi novaných znaků 226
Rozklad řetězce podle předem defi nované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 defi novaného off setu 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 235
Instalace balíku Validate_US 236
Jak se používá balík Validate_US 236
Shrnutí 237
Kapitola 10 Práce se souborovým a s operačním systémem 239
Soubory a adresáře 240
Rozklad cest k adresářům 240
Zjišťování velikosti souboru, adresáře a disku 242
Časy posledního přístupu a modifi kace 244
Práce se soubory 246
Pojem zdroj 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í modifi kace 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í 263
Kapitola 11 PEAR 265
Ukázka síly PEAR: konverze číselných formátů 266
Instalace a aktualizace PEAR 266
Instalace PEAR 267
PEAR a hostitelské fi rmy 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 274
Shrnutí 274
Kapitola 12 Datum a čas 275
Časové razítko Unixu 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í modifi kace webové stránky 287
Počet dní aktuálního měsíce 287
Počet dní specifi kované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
Modifi kace data a času 291
Výpočet rozdílu mezi dvěma daty 291
Shrnutí 291
Kapitola 13 Práce s HTML formuláři 293
PHP a webové formuláře 293
Jednoduchý příklad 294
Ověřování platnosti dat formuláře 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í 306
Kapitola 14 Autentizace uživatelů 307
Autentizace HTTP 307
Využití schopnosti .htaccess Apache 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í 321
Kapitola 15 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 332
Shrnutí 333
Kapitola 16 Networking 335
DNS, služby a servery 336
DNS 336
Služby 340
Práce s e-mailem 342
Konfi gurač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 353
PHP a LDAP 354
Konfi gurace 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í 366
Kapitola 18 Obsluha relací 367
Co je obsluha relace? 367
Proces obsluhy relace 368
Konfi gurační direktivy 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í 371
Práce s relacemi 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 380
Včlenění vlastních funkcí relace do logiky PHP 381
Vlastní obsluha relace založená na MySQL 381
Shrnutí 384
Kapitola 19 Š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
Modifi kátory proměnné 391
Řídící struktury 394
Příkazy 398
Vytváření konfi guračních souborů 400
Metoda confi gLoad 401
Odkazy na konfi gurač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í 406
Kapitola 20 Webové služby 407
Proč webové služby? 408
RSS (Real Simple Syndication) 409
Syntaxe RSS 410
Úvod do SimplePie 412
Instalace SimplePie 412
Rozklad souboru RSS se SimplePie 413
Rozklad více souborů RSS 414
SimpleXML 415
Funkce SimpleXML 416
17
Rozklad XML 417
Shrnutí 420
Kapitola 21 Zabezpečení webu 421
Bezpečná konfi gurace PHP 422
Konfi gurační parametry vztahující se k bezpečnosti 422
Skrývání konfi guračních detailů 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í 430
Kapitola 22 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í 441
Kapitola 23 Budování webů pro celý svět 443
Překládání webů s Gettext 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 451
Úvod do MVC 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í 467
Kapitola 25 Úvod do MySQL 469
Proč je MySQL tak populární? 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í 476
Kapitola 26 Instalace a konfi gurace MySQL 477
Stažení MySQL 477
Instalace MySQL 478
19
Instalace MySQL na Linuxu 478
Instalace a konfi gurace MySQL na Windows 481
Nastavení hesla administrátora MySQL 483
Start a zastavení MySQL 484
Ruční ovládání démona 484
Konfi gurace a optimalizace MySQL 485
Obal mysqld_safe 485
Konfi gurační a optimalizační parametry MySQL 486
Soubor my.cnf 489
Konfi gurace PHP pro spolupráci s MySQL 492
Překonfi gurace PHP na Linuxu 492
Překonfi gurace PHP na Windows 492
Shrnutí 492
Kapitola 27 Klienti pro MySQL 493
Klienti příkazového řádku pro MySQL 493
Klient mysql 493
Klient mysqladmin 503
Další užiteční klienti 505
Volby pro klienty 508
Klienti s grafi ckým rozhraním pro MySQL 510
MySQL Workbench 511
Nástroj phpMyAdmin 511
Shrnutí 512
Kapitola 28 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ů 521
Datové typy a atributy 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í 538
Kapitola 29 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í 564
Kapitola 30 Používání PHP s MySQL 565
Předběžné informace 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í 583
Kapitola 31 Ú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í 602
Kapitola 32 Uložené rutiny 603
Měli bychom používat uložené rutiny? 604
Přednosti uložených rutin 604
22
Nevýhody uložených rutin 604
Jak MySQL implementuje uložené rutiny 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
Modifi kace 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í 622
Kapitola 33 Triggery MySQL 623
Úvod do triggerů 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
Modifi kace 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
Modifi kace 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í 662
Kapitola 36 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 671
Vyhledávání pomocí formuláře 672
Jednoduché hledání 672
Rozšíření vyhledávacích možností 673
Fulltextové vyhledávání 675
Shrnutí 676
Kapitola 37 Transakce 677
Co je transakce? 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 682
Budování transakčních aplikací s PHP 683
Směna zboží za hotové ještě jednou 683
Shrnutí 685
Kapitola 38 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 695
Příkaz SELECT INTO OUTFILE 695
Shrnutí 699
Rejtřík 701
25
O autoroviW. 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 recenzentoviMatt 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, Jo-nathanem 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 nena-hraditelné 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. Pro-jektová 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 čle-nů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
ÚvodSkvě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 usi-loval, 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ě modifiko-vá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ěpodob-né, ž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ší čte-nář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ě na-psal 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ži-tostech, kdy ji pročítáte, ale i dlouhodobě.
Zdrojové kódyZdrojové 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 in-formací 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 mno-ho 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- else-
if, 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í pro-gramá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ánekJednou 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
Kapitola 3 – Základy PHP66
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 inter-pretaci 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čkyPro 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 syn-taxi 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í vari-anty 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óduNa 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 PHP68
<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ásled-ných bloků, což je v našem příkladu případ proměnné $date.
KomentářeZdů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 shelluPHP také podporuje alternativu k syntaxi ve stylu C++, které se říká syntaxe shellu. Komentář je uvozen zna-kem 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 hod-ně ú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 deskrip-tory, 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čeJe 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é hod-noty. 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():
Kapitola 3 – Základy PHP70
<?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 vy-nechat, 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 jedi-né, 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 proble-matická, 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 10Prá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. pro-gramy, 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ě vzrost-ly 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 kompo-nent 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 vyko-ná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 adre-sářů, č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, kte-rá 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, vyhle-dejte si o něm dodatečné informace v manuálu PHP.
Kapitola 10 – Práce se souborovým a s operačním systémem240
Soubory a adresářeUspořá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 ad-resáří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á ces-ta 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/chapter10Celý název souboru (basename): index.htmlPřípona názvu souboru (extension): htmlNá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 filena-me (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 (rela-tive 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:
Kapitola 10 – Práce se souborovým a s operačním systémem242
<?php
$imgPath = "../../images/cover.gif";
$absolutePath = realpath($imgPath);
// Vrátí /www/htdocs/book/images/cover.gif
?>
Zjišťování velikosti souboru, adresáře a diskuZjistit 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á hos-tuje 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 statisti-ká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ářePHP 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ší informa-ce 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émem244
{
// 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 modifikaceMož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í in-tenzivní 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í stan-dard 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 in-vestovat 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šeo-becně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.
Kapitola 31 – Úvod do PDO586
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 nejednot-nost 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 obsa-huje 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í ta-bulku 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 ovla-dač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.
Kapitola 31 – Úvod do PDO588
Podpora databází v PDOKdyž 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 data-bá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_EXCEP-TION. 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 PDO590
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í. Hod-noty 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 chybPDO 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ů SQLStandard 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é data-bá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č.
komp
endium
znalostí
pro
zaáteníky
i profesionály
PHP 5 a MySQL
9 7 8 8 0 7 4 1 3 1 6 3 9
ISBN 978-80-7413-163-9KATALOGOVÉ ČÍSLO: ZR1114DOPORUČENÁ CENA: 699 KČ
PHP 5 a MySQL kompendium znalostí pro začátečníky i pokročilé
W. Jason Gilmore
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í pub-likace o všem, co potřebuje grafi k, 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í.
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 konfi guraci 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 kni-hu 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 konfi gurace MySQL přes popis ukládacích enginů, zabezpečení MySQL či používání PHP a MySQL až k záležitos-tem souvisejícím s uloženými rutinami, triggery, pohledy, indexy či transakcemi.
© F
oto:
Jana
Val
išov
á
www.zoner.cz
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.
ZONER software, a.s., Nové sady 18, 602 00 Brno
Zoner Presstel.: 532 190 883e-mail: [email protected]
VELKÁ KNIHA
kompendium znalostí pro za áte níky i profesionály
PHP 5 a MySQL
W. Jason Gilmore
Úvod do PHP Konfi gurace 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
Webové služby Zabezpečení webu Ajax a PHP Budování webů pro celý svět Zend Framework Úvod do MySQL Instalace a konfi gurace 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
Zdrojové soubory ke stažení: http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar
Seznam kapitol: