velká knihy php 5 a mysql

48
E N C Y K L O P E D I E Z O N E R P R E S S VELKÁ KNIHA VELKÁ KNIHA kompendium znalostí pro za áte níky i profesionály kompendium znalostí pro za áte níky i profesionály NOVÉ, T ETÍ VYDÁNÍ PHP5 a MySQL PHP5 a MySQL W W . Jason Gilmore . Jason Gilmore NOVÉ, T ET NOVÉ, T E

Upload: zoner-software-as

Post on 28-Mar-2016

268 views

Category:

Documents


7 download

DESCRIPTION

Velká knihy PHP 5 a MySQL

TRANSCRIPT

Page 1: Velká knihy PHP 5 a MySQL

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

Page 2: Velká knihy PHP 5 a MySQL
Page 3: Velká knihy PHP 5 a MySQL

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Í

Page 4: Velká knihy PHP 5 a MySQL

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

Page 5: Velká knihy PHP 5 a MySQL

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

Page 6: Velká knihy PHP 5 a MySQL

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

Page 7: Velká knihy PHP 5 a MySQL

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

Page 8: Velká knihy PHP 5 a MySQL

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

Page 9: Velká knihy PHP 5 a MySQL

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

Page 10: Velká knihy PHP 5 a MySQL

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

Page 11: Velká knihy PHP 5 a MySQL

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

Page 12: Velká knihy PHP 5 a MySQL

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

Page 13: Velká knihy PHP 5 a MySQL

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

Page 14: Velká knihy PHP 5 a MySQL

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

Page 15: Velká knihy PHP 5 a MySQL

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

Page 16: Velká knihy PHP 5 a MySQL

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

Page 17: Velká knihy PHP 5 a MySQL

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

Page 18: Velká knihy PHP 5 a MySQL

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

Page 19: Velká knihy PHP 5 a MySQL

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

Page 20: Velká knihy PHP 5 a MySQL

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

Page 21: Velká knihy PHP 5 a MySQL

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

Page 22: Velká knihy PHP 5 a MySQL

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

Page 23: Velká knihy PHP 5 a MySQL

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

Page 24: Velká knihy PHP 5 a MySQL

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

Page 25: Velká knihy PHP 5 a MySQL

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

Page 26: Velká knihy PHP 5 a MySQL

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

Page 27: Velká knihy PHP 5 a MySQL

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.

Page 28: Velká knihy PHP 5 a MySQL

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

Page 29: Velká knihy PHP 5 a MySQL

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

Page 30: Velká knihy PHP 5 a MySQL

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.";

?>

Page 31: Velká knihy PHP 5 a MySQL

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>

Page 32: Velká knihy PHP 5 a MySQL

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-

Page 33: Velká knihy PHP 5 a MySQL

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():

Page 34: Velká knihy PHP 5 a MySQL

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.";

?>

Page 35: Velká knihy PHP 5 a MySQL

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.

Page 36: Velká knihy PHP 5 a MySQL

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

Page 37: Velká knihy PHP 5 a MySQL

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:

Page 38: Velká knihy PHP 5 a MySQL

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.

Page 39: Velká knihy PHP 5 a MySQL

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))

Page 40: Velká knihy PHP 5 a MySQL

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)

Page 41: Velká knihy PHP 5 a MySQL

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.

Page 42: Velká knihy PHP 5 a MySQL

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í.

Page 43: Velká knihy PHP 5 a MySQL

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.

Page 44: Velká knihy PHP 5 a MySQL

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');

Page 45: Velká knihy PHP 5 a MySQL

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-

Page 46: Velká knihy PHP 5 a MySQL

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:

Page 47: Velká knihy PHP 5 a MySQL

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č.

Page 48: Velká knihy PHP 5 a MySQL

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: