+ All Categories
Home > Documents > Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5

Date post: 22-Mar-2016
Category:
Upload: zoner-software-as
View: 247 times
Download: 7 times
Share this document with a friend
Description:
Velká kniha PHP a MySQL 5
51
E N C Y K L O P E D I E W E B D E S I G N E R A www.zonerpress.cz W. Jason Gilmore © Foto: Jiří Heller VELKÁ KNIHA PHP KOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY /přepracované, doplněné a rozšířené vydání publikace z roku 2005/ MySQL 5 PHP SQL
Transcript
Page 1: Velká kniha PHP a MySQL 5

PH

P

MyS

QL

E N C Y K L O P E D I E W E B D E S I G N E R A

ENCYKLOPEDIE WEBDESIGNERAW. Jason Gilmore

PHP & MySQL 5KOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY

Zoner Press tel.: 532 190 883 fax: 543 257 245e-mail: [email protected]://www.zonerpress.cz

ZONER software, s.r.o., Nové sady 18, 602 00 Brno

První vydání této knihy z roku 2005 bylo v poměrně k rátké době rozebráno a kniha se zařadila mezi bestseller y vydavatelství Zoner Press. Nové vydání knihy je výrazně rozšířeno a doplněno, přibylo více než 150 stran a 7 nových kapitol: tři z nich jsou věnované speci-fickým tématům PHP – probírají se v nich PEAR (PHP Extension and Application Repository), funkcionalita související s dat em a s ča-sem a rozšíření PDO (PHP Data Objec ts). Ve čtyřech dalších k api-tolách najdete výklad rozšíření mysqli PHP 5 a novou funkcionalitu MySQL 5 – uložené rutiny, triggery a pohledy na data (views). Upraveny a doplněny byly i původní kapitoly knihy, které jsou věno-vány klíčovým schopnostem PHP i MySQL počínaje instalací a kon-figurací jak na platformě Linux, tak i Windows, práci s proměnnými, datovými typy, poli i funkcemi, ale také např. využití šablon Smarty a webových služeb, až po pokročilé rysy objektově orientovaného programování, zpracování výjimek nebo detekci chyb.Práci s databáz emi se věnuje téměř polovina knihy, pozornost je zaměřena především na M ySQL a SQLit e, nechybí však ani inf or-mace o spolupráci s jinými databázovými systémy. Vedle již zmíně-ných novinek v knize najdete kapitoly věnované např. možnostem indexování, tvorbě databázových dotazů a řadě dalších praktických témat.Všechny ukázkové příklady najdete buďto na webu původního vy-davatele www.apress.com, nebo na str ánkách našeho v ydavatel-ství www.zonerpress.cz v sekci Download.

E N C Y K L O P E D I E W E B D E S I G N E R A

Pod tímto logem vycházejí publikace určené pro každého, kdo se zajímá o t vorbu webových stránek. Od r yze praktických příruček a průvodců až po komplexní publikace o všem, co potřebuje web-designér při každodenní práci. Na vydavatelský plán a výhody, kte-ré můžete získat, se informujte na adrese vydavatelství.

Věrným čtenářům je určen výhodný PRÉMIOVÝ PLUS PROGRAM.

www.zonerpress.cz

© F

oto:

Jiří

Hel

ler,

ww

w.h

elle

r.cz

Foto

grafi

e z

nabí

dky

foto

bank

y H

ELLE

R.CZ

W. Jason Gilmore

© Foto: Jiří Heller

VELKÁ KNIHA

W. JasonGilmore

9 7 8 8 0 8 6 8 1 5 5 3 4

ISBN 80-86815-53-6KATALOGOVÉ ČÍSLO: ZR617DOPORUČENÁ CENA: 650 KČ

ZONER software, s.r.o. významný producent software v oblasti digitální fotografie,

počítačové grafiky a multimédií, poskytovatel internetových

služeb, souvisejících s prezentací na internetu a e-komercí,

a nakladatelství odborné literatury.

www.zoner.cz

V E L K Á K N I H A

PHPKOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY

/přepracované, doplněné a rozšířené vydání publikace z roku 2005/

MySQL 5

VEL

KN

IHA

5 PHPSQL

kom

pen

diu

m z

nal

ost

í pro

zač

áteč

ník

y a

pro

fesi

on

ály

PHP_sec.indd 1PHP_sec.indd 1 15.12.2006 15:53:5715.12.2006 15:53:57

Page 2: Velká kniha PHP a MySQL 5

VELKÁ KNIHA

PHP a MySQL 5KOMPENDIUM ZNALOSTÍ PRO ZAČÁTEČNÍKY I PROFESIONÁLY

W. Jason Gilmore

/přepracované, doplněné a r ozšířené vydání publikace z r oku 2005/

Page 3: Velká kniha PHP a MySQL 5

Beginning PHP and MySQL 5: From Novice to Professional, Second EditionCopyright © 2006 by W. Jason Gilmore

Original English language published Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 9 47 10 USA. Copyright © 2006 by Apress L.P. CZECH language edition copyright © 2006 by ZONER software, s.r.o.All rights reserved. No part of this book ma y be reproduced or transmitted in any form or by any means, electronic or mecha ni cal, including photocopying, recording or by any information storage retrieval system, without permission from Apress L.P.

Originál v anglickém jaz yce vydal Apress L.P., 2560 Ninth Street, Suite 219, Berkeley, CA 9 47 10 USA. C opyright © 2006 Apress L.P. České vydání Copyright © 2006 ZONER software s.r.o..Všechna práva vyhrazena. Žádná část t éto publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslov-ného svolení Apress L.P.

Velká kniha PHP a MySQL 5 kompendium znalostí pro začátečníky i profesionálypřepracované, doplněné a rozšířené vydání publikace z roku 2005

Autor: W. Jason GilmoreCopyright © ZONER software, s.r.o. Vydání první v roce 2007. Všechna práva vyhrazena.

Zdrojový kód příkladů uvedených v knize je k dispozici na adrese http://www.apress.com v sekci Source Code nebo na adrese http://www.zonerpress.cz v sekci Download.

Zoner PressKATALOGOVÉ ČÍSLO: ZR617

ZONER software, s.r.o.Nové sady 18, 602 00 Brno

Překlad: RNDr. Jan PokornýOdpovědný redaktor: Miroslav Kučera, Pavel KristiánŠéfredaktor: Ing. Pavel KristiánDTP: Filip Božoň© Cover foto: Jiří Heller, HELLER.CZ s.r.o., www.heller.cz© Cover a layout: Ing. Pavel Kristián

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 reprodu-kována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamo vém prostředku či v jiném systému bez výslovného svolení vydavatele s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí.

Veškeré dotazy týkající se distribuce směřujte na:

Zoner Press ZONER software, s.r.o. Nové sady 18, 602 00 Brno

tel.: 532 190 883, fax: 543 257 245 e-mail: [email protected] http://www.zonerpress.cz

ISBN 80-86815-53-6

Page 4: Velká kniha PHP a MySQL 5

Kniha je věnována památce Dr. Giovanni „Nino“ Sanzi (1929-2004).

Addio, caro amico.

Page 5: Velká kniha PHP a MySQL 5

Stručný obsah

Kapitola 1 Úvod do PHP 31Kapitola 2 Instalace a konfigurace Apache a PHP 39Kapitola 3 Základy PHP 69Kapitola 4 Funkce 115Kapitola 5 Pole 127Kapitola 6 Objektově orientované programování v PHP 153Kapitola 7 Vyspělé schopnosti OOP 177Kapitola 8 Zpracování chyb a výjimek 197Kapitola 9 Řetězce a regulární výrazy 211Kapitola 10 Práce se systémem souborů a s operačním systémem 247Kapitola 11 PEAR 277Kapitola 12 Datum a čas 289Kapitola 13 Formuláře a navigační pomůcky 319Kapitola 14 Autentizace 341Kapitola 15 Upload souborů 359Kapitola 16 Networking 373Kapitola 17 PHP a LDAP 409Kapitola 18 Zpracovatelé sezení 431Kapitola 19 Šablony se Smarty 451Kapitola 20 Webové služby 475Kapitola 21 Bezpečné programování v PHP 515Kapitola 22 SQLite 533Kapitola 23 Úvod do PDO 551Kapitola 24 Úvod do MySQL 569Kapitola 25 Instalace a konfigurace MySQL 579Kapitola 26 Klienti MySQL 603Kapitola 27 Ukládací enginy MySQL a datové typy 625Kapitola 28 Zabezpečení MySQL 655Kapitola 29 Rozšíření mysql v PHP 681Kapitola 30 Rozšíření mysqli v PHP 709Kapitola 31 Uložené rutiny 733Kapitola 32 Triggery MySQL 755Kapitola 33 Pohledy 767Kapitola 34 Databázové dotazy v praxi 779Kapitola 35 Indexy a vyhledávání 801Kapitola 36 Transakce 817Kapitola 37 Import a export dat 831 Rejstřík 845

Page 6: Velká kniha PHP a MySQL 5

Obsah

O autorovi 25O odborném recenzentovi 25

Poděkování 26

Pošlete nám váš názor 27Zdrojové soubory 27

Úvod 29

Kapitola 1 Úvod do PHP 31Historie 31PHP 4 32PHP 5 34

Všeobecné rysy jazyka 35Upotřebitelnost 35Vyspělost 36Možnosti 36

Cena 37Shrnutí 37

Kapitola 2 Instalace a konfigurace Apache a PHP 39Instalace 39

Obstaráme si distribuce 39Proces instalace 41Otestování instalace 46Přizpůsobení vybudované distribuce pro Unix 47Přizpůsobení vybudované distribuce pro Windows 47Běžné potíže 48Prohlížení a stažení dokumentace 48

Konfigurace 49Správa konfiguračních direktiv PHP 49Konfigurační direktivy PHP 51Shrnutí 68

Kapitola 3 Základy PHP 69Únik k PHP 69

Výchozí syntax 70Krátké značky 70Styl <script> 71

Page 7: Velká kniha PHP a MySQL 5

Obsah8

Styl ASP 71Vkládání několika bloků kódu 71

Komentáře 72Syntax jediného řádku z C++ 72Syntax shellu 72Komentář na několika řádcích ve stylu C 72

Výstup 73print() 73echo() 74printf() 74sprintf() 75

Typy dat 76Skalární datové typy 76Složené datové typy 77Resource 79Přetypování 80Žonglování s typy 81Funkce vztahující se k typům 82

Identifikátory 83Proměnné 84

Deklarace proměnné 84Obor proměnné 85Superglobální proměnné PHP 88Proměnné proměnné 93

Konstanty 93Výrazy 94

Operandy 94Operátory 94

Interpretace řetězců 100Uvozovky 100Apostrofy 101heredoc 102

Řídící struktury 102Příkazy, které řídí vykonávání 103Podmínkové příkazy 104Příkazy cyklu 106Příkazy pro vkládání souborů 111

Shrnutí 113

Page 8: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 9

Kapitola 4 Funkce 115Volání funkcí 115Vytvoření funkce 116

Předávání argumentů hodnotou 116Předávání argumentů odkazem 117Výchozí hodnoty argumentů 118Nepovinné argumenty 118Návratové hodnoty funkcí 119Vracení více hodnot najednou 120Vnořování funkcí 120Rekurzivní funkce 121Funkce jako proměnná 123

Knihovny funkcí 124Shrnutí 125

Kapitola 5 Pole 127Co je pole? 128Výstup polí 129Jak se vytvoří pole 130

Test, zda se jedná o pole 132

Přidávání a odstraňování prvků pole 133Vyhledávání prvků v poli 134

Procházení polí 136Zjištění velikosti a jedinečných hodnot pole 140Setřídění prvků polí 141Kombinace, sloučení, extrakce a porovnání 146Další užitečné funkce pro práci s poli 150Shrnutí 152

Kapitola 6 Objektově orientované programování v PHP 153Zisky plynoucí z OOP 154

Zapouzdření 154Dědění 155Polymorfizmus 155

Klíčové pojmy OOP 156Třídy 156Objekty 157Členské proměnné 157

Page 9: Velká kniha PHP a MySQL 5

Obsah10

Vlastnosti 160Konstanty 163Metody 163

Rada pro typ 167Konstruktory a destruktory 168

Konstruktory 168Destruktory 171

Statické členy tříd 172Klíčové slovo instanceof 173Pomocné funkce 173Automatické načítání objektů 175Shrnutí 176

Kapitola 7 Pokročilé schopnosti OOP 177Schopnosti OOP nepodporované v PHP 178Klonování objektů 178

Příklad klonování 178Metoda _ _clone() 180

Dědění 181Dědění třídy 181Dědění a konstruktory 183

Rozhraní 185Dědění jednoho rozhraní 186Implementace více rozhraní 187

Abstraktní třídy 188Reflexe 189Shrnutí 195

Kapitola 8 Zpracování chyb a výjimek 197Konfigurační direktivy 198Protokolování chyb 201Zpracování výjimek 203

Proč je zpracování výjimek prospěšné 203Implementace zpracování výjimek v PHP 205

Shrnutí 209

Kapitola 9 Řetězce a regulární výrazy 211Syntaxe se složenými závorkami {} 211

Page 10: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 11

Regulární výrazy 212Syntax regulárních výrazů ve stylu POSIX 213Syntax regulárních výrazů ve stylu Perlu 218

Další funkce pro práci s řetězci 225Určování délky řetězce 226Porovnávání dvou řetězců 226Úpravy velikosti písmen 228Převádění řetězců do HTML a z HTML 229Alternativy pro funkce regulárních výrazů 234Doplňování a zkracování řetězce 241Počítání znaků a slov 242

Využití předností balíku Validate_US PEAR 244Instalace balíku Validate_US 245Jak se používá balík Validate_US 245

Shrnutí 246

Kapitola 10 Práce se systémem souborů a s operačním systémem 247Soubory a adresáře 248

Analýza cest k adresářům 248Typy souborů a odkazy 250Zjišťování velikosti souboru, adresáře a disku 253Časy posledního přístupu a modifikace 256

Vlastnictví souborů a povolení 257Vstupní a výstupní (I/O) operace se soubory 259

Pojem prostředek 259Znak pro nový řádek 260Konec souboru 260Otevření a uzavření souboru 260Čtení ze souboru 262Přesouvání ukazatele souboru 267Zapisování do souboru 268Čtení obsahu adresářů 268

Vykonávání příkazů shellu 270Vykonávání programů na systémové úrovni 271Shrnutí 275

Kapitola 11 PEAR 277Populární balíky PEAR 277

Konverze číselných formátů 279

Page 11: Velká kniha PHP a MySQL 5

Obsah12

Instalace a aktualizace PEAR 280Instalace PEAR 280PEAR a hostitelské firmy 282Aktualizace PEAR 282

Jak se pracuje s manažerem balíků PEAR 282Jaké balíky jsou nainstalované 283Jak získáte další informace o nainstalovaném balíku 283Instalace balíku 284Jak se pracuje s balíkem 286Modernizace balíku 287Odinstalování balíku 287Přechod na starší verzi balíku 288

Shrnutí 288

Kapitola 12 Datum a čas 289Časová známka Unixu 289Knihovna PHP pro datum a čas 290Bojové umění „Date Fu“ 297

Zobrazení lokalizovaného data a času 297Zobrazení data poslední modifikace webové stránky 301Zjištění počtu dní aktuálního měsíce 301Určení data vzdáleného x dní od aktuálního data 302Vytvoření kalendáře 303

PHP 5.1 306Základní informace o Date 307Konstruktor Date 307Accessory a mutátory 308Validátory 311Manipulační metody 311

Shrnutí 317

Kapitola 13 Formuláře a navigační pomůcky 319PHP a webové formuláře 320

Jednoduchý příklad 320Předávání dat formuláře do funkce 321Práce s vícehodnotovými komponentami formuláře 322Generování formulářů s PHP 324Automatický výběr na formuláři 326PHP, webové formuláře a JavaScript 327

Page 12: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 13

Navigační pomůcky 329Uživatelsky přívětivé URL 329Navigační stopy 333Vytváření vlastních zpracovatelů chyb 337

Shrnutí 339

Kapitola 14 Autentizace 341Pojmy autentizace HTTP 341Autentizace PHP 342

Proměnné autentizace 343Různé metodologie autentizace 344Autentizace založená na IP adrese 348Využití PEAR: Auth_HTTP 349

Administrace přihlašování uživatelů 352Ustanovení hesel 352Testování jak snadno lze uhádnout heslo s knihovnou CrackLib 354Jednorázové URL a obnova hesla 356

Shrnutí 358

Kapitola 15 Upload souborů 359Nahrávání souborů přes protokol HTTP 359Nahrávání na server s PHP 360

Direktivy PHP pro nahrávání souborů a pro prostředky 360Pole $_FILES 362Funkce PHP pro nahrávání na server 363Chybové zprávy týkající se nahrávání 364Ukázky nahrávání souborů 365

Dejte přednost PEAR: HTTP_Upload 368Instalace HTTP_Upload 368Získáme informace o nahraném souboru 369Přesun nahraného souboru na cílové umístění 370Nahrávání více souborů najednou 370

Shrnutí 371

Kapitola 16 Networking 373DNS, služby a servery 374

DNS 374Služby 377

Page 13: Velká kniha PHP a MySQL 5

Obsah14

Zřizování soketových připojení 378

Pošta 380Konfigurační direktivy 380Odeslání e-mailu, který obsahuje jen čistý text 381Odeslání e-mailu s dodatečnými záhlavími 382Odeslání e-mailu více příjemcům 382Odeslání e-mailu formátovaného jako HTML 383Jak se odešle příloha 384

IMAP, POP3 a NNTP 385Požadavky 385Zřízení a uzavření připojení 386Další informace o poštovních přihrádkách a poště 388Získávání zpráv 390Sestavení zprávy 397Odeslání zprávy 398Administrace poštovní přihrádky 398Administrace zpráv 400

Proudy 400Obaly proudů a kontexty 401Filtry proudů 402

Běžné síťové úkoly 404Zvonění na server 404Skener portu 405Konvertor podsítě 405Testování šířky pásma uživatele 407

Shrnutí 408

Kapitola 17 PHP a LDAP 409Úvod do LDAP 410

Další informace o LDAP 411

PHP a LDAP 411Připojení k serveru LDAP 411Vázání k serveru LDAP 412Uzavření připojení k serveru LDAP 413Získávání dat LDAP 414Práce s hodnotami položek 415Počet získaných položek 416Získávání atributů 417Řazení a porovnávání položek LDAP 420

Page 14: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 15

Práce s položkami 421Dealokace paměti 423Vkládání dat LDAP 424Aktualizace dat LDAP 425Odstraňování dat LDAP 426Konfigurační funkce 426Znakové sady 428Práce s distingovaným názvem 428Zpracování chyb 429

Shrnutí 430

Kapitola 18 Zpracovatelé sezení 431Co je to zpracování sezení? 431

Cookies 432Přepisování URL 432Proces zpracování sezení 432

Konfigurační direktivy 433Klíčové pojmy 438

Startování sezení 438Likvidace sezení 439Získávání a nastavování ID sezení 439Vytváření a odstraňování proměnných sezení 440Zakódování a dekódování dat sezení 440

Praktické ukázky zpracování sezení 442 Automatizované přihlašování 442Seznam naposled prohlížených dokumentů 444

Vytváření vlastních zpracovatelů sezení 445Včlenění vlastních funkcí sezení do logiky PHP 446Vlastní zpracovatelé sezení založení na MySQL 447

Shrnutí 450

Kapitola 19 Šablony se Smarty 451Co je stroj na šablony? 452Úvod do Smarty 453Instalace Smarty 454Práce se Smarty 456Prezentační logika Smarty 458

Komentáře 458

Page 15: Velká kniha PHP a MySQL 5

Obsah16

Modifikátory proměnné 458Řídící struktury 461Speciální příkazy 465

Vytváření konfiguračních souborů 468Odkazy na konfigurační proměnné 469

CSS v součinnosti se Smarty 470Ukládání stránek do cache 471

Doba života stránek uložených v cache 472Eliminace režijních nákladů na zpracování s is_cached() 472Vytvoření několika cache pro jednu šablonu 473Několik slov závěrem k ukládání do cache 474

Shrnutí 474

Kapitola 20 Webové služby 475Proč webové služby? 476Real Simple Syndication 478

Syntax RSS 480MagpieRSS 481

SimpleXML 488Funkce SimpleXML 489Metody SimpleXML 490

SOAP 493NuSOAP 494Rozšíření SOAP PHP 5 503

Použití klienta C# s webovou službou PHP 512Shrnutí 514

Kapitola 21 Bezpečné programování v PHP 515Bezpečná konfigurace PHP 516

Bezpečný mód 516Další konfigurační direktivy vztahující se bezpečnému módu 518

Skrývání podrobností konfigurace 520Skrytí Apache a PHP 520

Skrývání citlivých dat 522Dbejte řádně o kořen dokumentů 522Zamítněte přístup k souborům s určitými příponami 523

Desinfekce dat uživatele 523Vymazání souborů 524

Page 16: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 17

Skriptování přes weby 524Desinfekce vstupu od uživatele: řešení 526

Šifrování dat 528Šifrovací funkce PHP 528mhash 529MCrypt 530

Shrnutí 532

Kapitola 22 SQLite 533SQLite 533

Instalace SQLite 534Práce v rozhraní příkazového řádku SQLite 534

Knihovna SQLite PHP 536Direktivy SQLite 536Jak se otevře připojení 536Vytvoření tabulky v paměti 537Uzavření připojení 538Dotazy na databázi 538Analýza sad výsledků 539Získávání podrobností o sadě výsledků 542Manipulace s ukazatelem sady výsledků 544Informace o struktuře tabulky 545Práce s binárními daty 546Vytváření a překrývání funkcí SQLite 547Vytváření agregačních funkcí 548

Shrnutí 549

Kapitola 23 Úvod do PDO 551Zase další databázová abstraktní vrstva? 552Jak se pracuje s PDO 553

Instalace PDO 554Podpora databází v PDO 554Připojení k databázovému serveru a výběr databáze 555Získávání a nastavování atributů 557Zpracování chyb 557Vykonání dotazu 558Připravené příkazy 560Získávání dat 564Nastavování vázaných sloupců 567

Page 17: Velká kniha PHP a MySQL 5

Obsah18

Transakce 568

Shrnutí 568

Kapitola 24 Úvod do MySQL 569Proč je MySQL tak populární? 569

Flexibilita 570Výkon 570Flexibilní licenční možnosti 572(Hyper) aktivní komunita uživatelů 573

MySQL 4 574MySQL 5 575Prominentní uživatelé MySQL 575

craigslist 575Yahoo! Finance 576Wikipedia 576

Shrnutí 577

Kapitola 25 Instalace a konfigurace MySQL 579Licence PHP a MySQL 579

Linux 580Windows 580

Stažení MySQL 580Instalace MySQL 582

Linux 582Windows 586

Nastavte heslo administrátora MySQL 589Start a zastavení MySQL 589

Ruční ovládání démona 589Automatické startování a zastavování MySQL 591

Konfigurace a optimalizace MySQL 594mysqld_safe 594Konfigurační a optimalizační parametry 595Soubor my.cnf 599

Shrnutí 602

Kapitola 26 Klienti MySQL 603Standardní volby klientů 603Volby týkající se připojení 604

Page 18: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 19

Všeobecné volby 605mysql 605

Klíčové volby mysql 606Práce s mysql v interaktivním režimu 608Prohlížení konfiguračních proměnných a stavu systému 610Práce s mysql v dávkovém režimu 611Užitečné tipy k mysql 612

mysqladmin 614Příkazy mysqladmin 614

Další utility 615mysqldump 615mysqlshow 616mysqlhotcopy 616mysqlimport 617myisamchk 618mysqlcheck 619

Klientské programy jiných výrobců 619Administrátor MySQL 619phpMyAdmin 621Prohlížeč dotazů MySQL 622Navicat 624

Shrnutí 624

Kapitola 27 Ukládací enginy MySQL a datové typy 625Ukládací enginy 625

InnoDB 626MyISAM 627MEMORY 629MERGE 631BDB 631FEDERATED 631ARCHIVE 633CSV 633EXAMPLE 634BLACKHOLE 634Časté otázky týkající se ukládacích enginů 634

Datové typy a atributy 636Datové typy 636Datové typy pro datum a čas 636

Page 19: Velká kniha PHP a MySQL 5

Obsah20

Datové typy pro řetězce 640Atributy datových typů 642

Práce s databázemi a s tabulkami 645Práce s databázemi 645Práce s tabulkami 647Změny ve struktuře tabulky 650Databáze INFORMATION_SCHEMA 650

Shrnutí 653

Kapitola 28 Zabezpečení MySQL 655Co byste měli udělat nejdřív 656Zabezpečení démona mysqld 657Systém přístupových oprávnění MySQL 657

Jak systém přístupových oprávnění funguje 657Kde jsou informace o přístupových oprávněních uložené? 659

Správa uživatelů a přístupových oprávnění 668Prohlížení oprávnění 675

Limity na konzumaci prostředků uživateli 675Bezpečná připojení MySQL 676

Volby příkazu GRANT, které se týkají bezpečných připojení 677Volby SSL 678

Shrnutí 680

Kapitola 29 Rozšíření mysql v PHP 681Předběžné informace 681

Jak se zpřístupní rozšíření mysql na Linuxu 681Jak se zpřístupní rozšíření mysql na Windows 682Přístupová oprávnění uživatelů 682Ukázková data 682

Příkazy MySQL v PHP 683Zřízení a uzavření připojení 683Uložení informací o připojení do separátního souboru 685Zabezpečení informací o připojení 685

Volba databáze 686Dotazy na MySQL 686Získávání a zobrazování dat 688Vkládání dat 691Modifikace dat 693

Page 20: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 21

Odstraňování dat 695Vybrané řádky a ovlivněné řádky 696Získávání informací o databázi a tabulce 697Získávání informací o sloupcích 698

Prohlížení vlastností tabulky 702Získávání informací o chybách 703

Pomocné funkce 704Shrnutí 707

Kapitola 30 Rozšíření mysqli v PHP 709Předběžné informace 710

Jak se zpřístupní rozšíření mysqli na Unixu 710Jak se zpřístupní rozšíření mysqli na Windows 710Ukázková data 711

Jak se pracuje s rozšířením mysqli 711Připojení k serveru MySQL 711Zprávy o chybách připojení 712Výběr databáze MySQL 715Uzavření připojení 716

Dotazy 716Vykonání dotazu 716Zotavení paměti dotazu 718Příprava sady výsledků pro zpracování 718Analýza výsledků 720Vykonávání několika dotazů za sebou 723Připravené příkazy 724

Databázové transakce 731Shrnutí 732

Kapitola 31 Uložené rutiny 733Měli bychom používat uložené rutiny? 734

Přednosti uložených rutin 734Nevýhody uložených rutin 734

Jak MySQL implementuje uložené rutiny 735Tabulky přístupových oprávnění uložených rutin 735Jak se vytvoří uložená rutina 737Deklarace a nastavování proměnných 739Jak se vykoná uložená rutina 741

Page 21: Velká kniha PHP a MySQL 5

Obsah22

Uložené rutiny složené z několika příkazů 741Volání rutiny z jiné rutiny 748Modifikace uložené rutiny 749Odstranění uložené rutiny 749Prohlížení stavu rutiny 750Prohlížení syntaxe rutiny 751Podmínky a zpracovatelé 751

Integrace rutin do webových aplikací 752Vytvoření rozhraní pro bonus zaměstnanců 752Získávání více řádků 753

Shrnutí 753

Kapitola 32 Triggery MySQL 755Úvod do triggerů 755

Proč používat triggery? 756Vykonání akce před událostí 756Vykonání akce po události 757Triggery spouštěné „před“ versus triggery spouštěné „po“ 758

Podpora triggerů v MySQL 758Jak se vytvoří trigger 759Prohlížení existujících triggerů 761Modifikace triggeru 762Odstranění triggeru 762Kaskádové triggery 763

Integrace triggerů do webových aplikací 764Shrnutí 766

Kapitola 33 Pohledy 767Úvod do pohledů 768Podpora pohledů v MySQL 768

Vytváření a vykonávání pohledů 769Prohlížení informací o pohledu 774 Modifikace pohledu 776Odstranění pohledu 776Aktualizace pohledů 776

Začlenění pohledů do webových aplikací 777Shrnutí 778

Page 22: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 23

Kapitola 34 Databázové dotazy v praxi 779Ukázková data 780Vytváření tabulárních výstup s PEAR 780

Instalace HTML_Table 781Jak se vytvoří jednoduchá tabulka 781Vytváření lépe čitelného výstupu řádků 782Vytvoření tabulky z dat databáze 784Zobecnění výstupního procesu 785

Seřazení výstupu 787Vytvoření výstupu se stránkováním 788Číslování stránek výpisu 791Poddotazy 793

Porovnávací operace s poddotazy 794Určování existence s poddotazy 794Údržba databáze pomocí poddotazů 796Používání poddotazů v PHP 796

Kurzory 797Základy práce s kurzory 797Vytvoření kurzoru 798Otevření kurzoru 798Práce s kurzorem 798Uzavření kurzoru 799Jak se kurzor používá s PHP 799

Shrnutí 800

Kapitola 35 Indexy a vyhledávání 801Indexování databází 801

Primární klíče 802Jedinečné indexy 803Normální indexy 804Fulltextové indexy 806Doporučené praktiky pro práci s indexy 810

Vyhledávání pomocí formuláře 811Jednoduché hledání 811Rozšíření vyhledávacích možností 812Fulltextové vyhledávání 814

Shrnutí 815

Page 23: Velká kniha PHP a MySQL 5

Obsah24

Kapitola 36 Transakce 817Co je transakce? 817Možnosti MySQL pro transakční zpracování 818

Systémové požadavky 818Vytvoření tabulky 819Konfigurační parametry InnoDB 819

Ukázkový projekt 822Ukázková data 822Vykonáme konkrétní transakci 823Zálohování a obnova tabulek InnoDB 825Tipy pro práci s transakcemi 825

Budování transakčních aplikací s PHP 826Směna zboží za hotové ještě jednou 826

Shrnutí 830

Kapitola 37 Import a export dat 831Ukázková tabulka 831Touha po inteligentním médiu 832Export dat 832

Příkaz SELECT INTO OUTFILE 833

Import dat 836Import dat příkazem LOAD DATA INFILE 836Import dat s mysqlimport 839Načítání dat do tabulky s PHP 842

Shrnutí 843

Rejstřík 845

Page 24: Velká kniha PHP a MySQL 5

V této kapitole se dozvíte, jak se nainstaluje a nakonfiguruje PHP, a v průběhu tohoto procesu se dozvíte, jak nainstalovat webový server Apache. Jestliže doposud nemáte k dispozici fungující server Apache/PHP, je látka probíraná zde pro vás neocenitelná, abyste totiž mohli pracovat s příklady v pozdějších kapitolách, o vašich vlastních experimentech nemluvě. Konkrétně se v této kapitole dozvíte

• Jak se nainstaluje Apache a PHP jako modul serveru Apache, a to na dvou platformách, Unix i Windows.

• Jak otestujete svou instalaci, abyste se přesvědčili, že všechny komponenty pracují řádně.

• O běžných instalačních potížích a jak se řeší.

• Jaký mají účel, obor a výchozí hodnoty běžně používané konfigurační direktivy PHP.

• Různé způsoby, jimiž lze modifikovat konfigurační direktivy PHP.

InstalaceV tomto oddílu projdeme všechny potřebné kroky k instalaci funkčního serveru Apache/PHP. Důsled-kem bude, že budete moci na serveru spouštět skripty PHP a prohlížet jejich výsledky v prohlížeči.

Obstaráme si distribuceNež začnete s instalací, musíte stáhnout zdrojový kód. V tomto oddílu dostanete pokyny, jak to udělat.

Stažení Apache

Popularita Apache a licence otevřeného zdrojového kódu podnítily prakticky všechny vývojáře Unixu, aby zabalili tento software do svých distribucí. Vzhledem ke svižnému rozvrhu nových vydání Apache se však musíte obrátit na webové stránky Apache a stáhnout nejnovější verzi. V době, kdy jsem psal tyto řádky, se na následující stránce nabízelo 260 zrcadel umístěných v 53 zemích světa:

http://www.apache.org/mirrorshttp://www.apache.org/mirrors

Instalace a konfigurace Apache a PHP

Kapitola 2

Page 25: Velká kniha PHP a MySQL 5

Kapitola 2 – Instalace a konfigurace PHP40

Přejděte na tuto stránku a zvolte vhodné zrcadlo tím, že kliknete na patřičný odkaz. Výsledná stránka bude obsahovat všechny projekty kryté deštníkem Apache Software Foundation. Zvolte odkaz httpd. Tím přejdete na stránku obsahující odkazy na nejnovější vydání Apache a různé k nim s e vztahující projekty a utility. Distribuce je dostupná ve dvou formátech:

• Zdrojový ( source). Je-li vaší cílovou platformou Unix, doporučuji, abyste si stáhli zdrojový kód. Přestože jistě není nic špatného na tom, když využijete některou ze skvostně vybudovaných binárních verzí, čas navíc, který budete investovat, abyste se naučili kompilovat ze zdrojového kódu, vám v dlouhodobé perspektivě poskytne větší flexibilitu. Je-li vaší cílovou platformou systém Windows, a rádi byste kompilovali ze zdrojového kódu, lze stáhnout separátní zdrojové balení pro platformu Win32. Připomínám však, že se v kapitole neprobírá proces instalace pro platformu Win32 ze zdrojového kódu. Soustředíme se na mnohem běžnější (a doporučovaný) binární instalátor.

• Binární ( binary). V době, kdy jsem psal tyto řádky, byly binární distribuce k dispozici pro 15 operačních systémů. Je-li vaší cílovou platformou systém Windows, doporučuje se, abyste si stáhli relevantní binární verzi. Na ostatních platformách zvažte kompilaci ze zdrojového kódu, protože v dlouhodobé perspektivě poskytne větší flexibilitu.

PoznámkaV době, kdy jsem psal tyto řádky, nebyla ještě k dispozici binární verze Apache 2 s podporou SSL, přestože je možné, že v době, kdy tyto řádky čtete vy, je už situace jiná. Jestliže ale ne a vy požaduje-te na Windows podporu SSL, budete muset budovat ze zdrojového kódu.

Takže, kterou verzi Apache byste si měli stáhnout? Přestože byl Apache 2 vydán už před více než třemi lety, stále se všeobecně používá verze 1.X. Skutečně, zdá se, že většinu ISP sdílených serverů teprve čeká migrace k verzi 2.X. Neochota modernizovat nemá nic společného s problémy týkajícími se verze 2.X, spíše je to důkaz báječné stability a vyspělosti verze 1.X. Při standardním používání jsou vnější rozdíly mezi oběma verzemi prakticky nezjistitelné; proto uvažujte o práci s Apache 2 tehdy, potřebujete-li vy-užívat jeho zdokonalenou stabilitu. Skutečně, hodláte-li provozovat Apache pod Windows, buď pro vý-vojové, nebo pro rozmisťovací účely, doporučuje se, abyste zvolili verzi 2, protože byla oproti předchozí distribuci Windows kompletně přepsána a je signifikantně stabilnější než její předchůdkyně.

Stažení PHP

Přestože je v dnešní dob ě už PHP do v ětšiny distribucí Linuxu zabudovaný, doporučuje se, abyste si z webových stránek PHP stáhli nejnovější stabilní ( stable) verzi. Abyste zkrátili dobu stahování, zvolte příhodné zrcadlo z více než sta zrcadel sídlících ve více než padesáti zemích. Seznam zrcadel najdete na adrese http://www.php.net/mirrors.phphttp://www.php.net/mirrors.php.

Jakmile zvolíte nejbližší zrcadlo, přejděte na stránku, ze které se stahuje (downloads) a zvolte vhodný formát. Celkem jsou tři:

• Zdrojový (source). Je-li vaší cílovou platformou Unix, nebo hodláte kompilovat ze zdroje na platformě Windows, zvolte zdrojový formát. Budování ze zdrojového kódu na Windows se ne-doporučuje a v knize se tím nezabývám. Pokud se nenacházíte v situaci s opravdu velmi speci-

Page 26: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 41

álními okolnostmi, měla by vašim potřebám uspokojivě vyhovovat předem vybudovaná binární distribuce pro Windows. Tato distribuce je komprimovaná ve formátech bz2 a gz. Uvědomte si ale, že jejich obsah je identický; různé komprimační formáty jsou tu jen pro vaše pohodlí.

• Windows zip package. Distribuce obsahuje binární CGI a různé verze modulu serveru. Plánuje-te-li využívat PHP v součinnosti s Apache, měli byste stáhnout tuto verzi, protože k ní se vztahují pozdější instalační pokyny uvedené v knize.

• Windows Installer. Distribuce obsahuje pouze CGI a nabízí pohodlné rozhraní instalačního programu pro Windows, v němž nainstalujete a nakonfigurujete PHP. Obsahuje také podporu pro automatickou konfiguraci serverů IIS, PWS a Xitami. Přestože můžete tuto verzi používat v součinnosti s Apache, nedoporučuje se to. Použijte místo ní verzi Windows zip package.

Chcete-li si pohrát s nejnovějšími vývojovými fázemi PHP, můžete si na adrese http://snaps.php.nethttp://snaps.php.net stáhnout zdrojovou i binární verzi. Mějte na paměti, že některé z verzí, které jsou dostupné přes tento web, nejsou určené pro rutinní provoz.

Proces instalaceProtože se kapitola soustřeďuje především na PHP, ne na s erver Apache, vyčerpávající (ale i ú vodní) výklad všech možných schopností, které jsou během procesu budování Apache k dispozici, přesahuje rámec této kapitoly. Potřebujete-li dodatečné informace týkající se těchto schopností, doporučuji vám, abyste nějaký čas věnovali studiu dokumentace Apache, nebo si obstarejte publikaci Pro Apache, Third Edition, napsal Peter Wainwright, vydalo Apress 2004.

PoznámkaLicenční konflikty mezi PHP a MySQL měly za následek, že byly knihovny MySQL z PHP 5 odstraně-ny. Proto, chcete-li používat PHP 5 a MySQL pospolu (což je dost pravděpodobné, když čtete tuto knihu), musíte podniknout patřičné kroky, abyste pro PHP 5 zpřístupnili knihovny MySQL. Tato látka se podrobněji probírá v kapitole 25. V ní si také určitě pročtěte informace, které se vztahují k různým licenčním scénářům, chcete-li používat PHP a MySQL dohromady

Instalace Apache a PHP na Linuxu/Unixu

Na Unixu vybudujeme Apache a PHP ze zdrojového kódu. Potřebujete slušný kompilátor ANSI-C a sys-tém, dva prvky, jejichž dostupnost je dnes p ro drtivou většinu distribucí samozřejmostí. PHP kromě toho vyžaduje balíky Flex (http://www.gnu.org/software/flex/flex.htmlhttp://www.gnu.org/software/flex/flex.html) a Bison (http://www.http://www.gnu.org/software/bison/bison.htmlgnu.org/software/bison/bison.html), Apache vyžaduje Perl alespoň verze 5.003. Opět všechny tři prvky jsou běžně rozšířené, když ne na vš ech, tak na většině moderních platformách Unix. Konečně potřebujete oprávnění úrovně root k cílovému serveru, abyste byli sto proces budování dokončit.

Než zahájíte proces instalace, zvažte, zda byste neměli kvůli většímu pohodlí umístit oba balíky na spo-lečné místo, například /usr/src/ /usr/src/. Pak začněte s instalací podle následujících pokynů.

1. Rozbalte Apache a PHP (operace gunzip a tar):

Page 27: Velká kniha PHP a MySQL 5

Kapitola 2 – Instalace a konfigurace PHP42

%>gunzip httpd-2_X_XX.tar.gz%>gunzip httpd-2_X_XX.tar.gz%>tar xvf httpd-2_X_XX.tar%>tar xvf httpd-2_X_XX.tar%>gunzip php-XX.tar.gz%>gunzip php-XX.tar.gz%>tar xvf php-XX.tar.%>tar xvf php-XX.tar.

2. Zkonfigurujte a vybudujte Apache. Předat je třeba minimálně dvě volby. První z nich, --enable-so--enable-so, sdděluje Apache, aby zapnul schopnost načítat sdílené moduly. Druhá, --with-mpm=worker--with-mpm=worker, sděluje Apache, aby použil vícevláknový modul paralelního zpracování (threaded multiprocessing module), známý jako zpracovatelský proces (worker). Na základě svých konkrétních potřeb zvažte, zda byste neměli také používat modul prefork paralelního zpracování. Další informace týkající se této důležité záležitosti si vyhledejte v dokumentaci Apache.

%>cd httpd-2_X_XX%>cd httpd-2_X_XX%>./configure --enable-so [další volby]%>./configure --enable-so [další volby]%>make%>make

3. Nainstalujte Apache:

%>make install%>make install

4. Zkonfigurujte, vybudujte a nainstalujte PHP (informace ohledně modifikací výchozích instalač-ních hodnot a začlenění rozšíření cizích výrobců do PHP viz oddíly „Přizpůsobení vybudované instalace pro Unix“, resp. „Přizpůsobení vybudované instalace pro Windows, podle toho, pod jakým operačním systémem pracujete).

%>cd ../php-X_XX%>cd ../php-X_XX%>./configure --with-apxs2=/usr/local/apache2/bin/apxs [další volby]%>./configure --with-apxs2=/usr/local/apache2/bin/apxs [další volby]%>make%>make%>make install%>make install

UpozorněníVerze PHP pro Unix se spoléhá na několik utilit, bez nichž se řádně nezkompiluje. Proces konfigurace se proto nezdaří, jestliže nejsou přítomné na serveru. Zmínit je třeba především to, že tato balení obsahují Bison parser generator, Flex lexical analysis generator, GCC compiler collection a m4 macro processor. Bohužel, četné distribuce je automaticky nenainstalují, takže je nezbytné ručně tyto balí-ky přidat v době, kdy se instaluje operační systém, nebo před instalací PHP. Proto, objeví-li se nějaké chyby týkající se zmíněných balíků, mějte na paměti, že je to zcela typické, a podnikněte nezbytné kroky, abyste je nainstalovali na váš systém.

5. Zkopírujte soubor php.ini-distphp.ini-dist na jeho výchozí umístění a přejmenujte na php.iniphp.ini. je hlavní konfigurační kanál. Účel a obsah php.iniphp.ini podrobně prozkoumáme v příštím oddílu, „Konfi-gurace“. Soubor php.iniphp.ini obsahuje stovky direktiv, jimiž se přizpůsobuje chování PHP. V poz-dějším oddílu „Konfigurace“ prozkoumáme podrobně účel a obsah php.iniphp.ini. Připomínám, že tento konfigurační soubor můžete umístit, kamkoli chcete, zvolíte-li však nějaké nestandardní umístění, budete muset také nakonfigurovat PHP pomocí volby --with-config-filepath--with-config-filepath. Dál připomínám , že máte k dispozici ještě jeden konfigurační soubor, který se jmenuje

Page 28: Velká kniha PHP a MySQL 5

Základy PHPKapitola 3

Máme za sebou pouhé dvě kapitoly, a už jsme p robrali poměrně dost základních informací o jazyku PHP. Seznámili jste se s pozadím a historií vzniku jazyka a hluboko jste se zavrtali do pojmů a postupů souvisejících s instalací a konfigurací. Tím jste si vytvořili dobrou výchozí pozici k tomu, co je jádrem zbývající části knihy: vytváření vyspělých aplikací PHP. Jejich výklad teď začíná, uvádí se v něm mnoho základních schopností jazyka. Konkrétně se budou probírat následující témata:

• Jak se odděluje kód PHP, což umožňuje enginu pro analýzu určit, které oblasti skriptu má analy-zovat, a které má ignorovat.

• Jak se do kódu vkládají komentáře pomocí různých metodologií, které jsou vypůjčené ze skripto-vání shellu Unixu a jazyků C a C++.

• Jak dostanete data na výstup pomocí příkazů echo()echo(), print()print(), printf()printf() a sprintf()sprintf().

• Výklad typů dat PHP, proměnných, operátorů a příkazů.

• Podrobné pojednání o klíčových řídících strukturách a příkazech PHP: if-else-elseifif-else-elseif, while while , foreachforeach, include/requireinclude/require, breakbreak, continuecontinue a declaredeclare.

V kapitole si osvojíte nejen vědomosti nezbytné k tomu,k abyste mohli vytvářet sice jen zák ladní, ale přesto prospěšné aplikace PHP. Pochopíte také to, co vám umožní vytěžit co nejvíce z lá tky probírané v následujících kapitolách.

Únik k PHP Jednou z předností PHP je, že jeho k ód můžete vkládat přímo do statických stránek HTML. Aby ale kód mohl něco dělat, musí se stránka předat enginu PHP, který ji bude interpretovat. Při interpretaci kódu by ale bylo hodně neefektivní, kdyby se měl každý řádek brát jako potenciální příkaz PHP. Proto parser potřebuje nějaké prostředky, aby mohl okamžitě určit, které oblasti na stránce představují kód PHP. To se logicky docílí tím, že s e kód PHP oddělí. Existují čtyři varianty, jak lze kód oddělit. Jejich popis následuje.

Page 29: Velká kniha PHP a MySQL 5

Kapitola 3 – Základy PHP70

Výchozí syntaxVýchozí syntax oddělení kódu začíná znaky <?php<?php a končí znaky ?>,?>, jako zde:

<h3>Vítejte!</h3> <h3>Vítejte!</h3> <?php <?php print "<p>Tohle je ukázka PHP.</p>"; print "<p>Tohle je ukázka PHP.</p>";?>?><p>Zde se nacházejí nějaké statické informace...</p><p>Zde se nacházejí nějaké statické informace...</p>

Uložíte-li kód uvedený výše jako test.phptest.php a zavoláte ho z nějakého webového serveru, který má zapnu-tou 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ší syntax oddělovačů. Říká se jí krátký styl značek ( short-tags). Obe-jde se bez odkazu php, který vyžaduje výchozí syntax. Chcete-li ale p oužívat krátké značky, musíte zapnout direktivu short_open_tagshort_open_tag PHP. Příklad:

<? <? print "Tohle je další ukázka PHP."; print "Tohle je další ukázka PHP."; ?> ?>

UpozorněníPřestože jsou krátké značky pohodlné, mějte na paměti, že kolidují s XML, a tedy i se syntaxí XHTML. Proto se kvůli souladu doporučuje, abyste používali výchozí syntax..

Page 30: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 71

Informace se obvykle zobrazují příkazy printprint nebo echoecho. Když jsou zapnuté krátké značky, můžete se bez těchto příkazů obejít, a využít variantu výstupu známou jako zkrácená výstupní syntax:

<?="Tohle je další ukázka PHP.";?> <?="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."; ?> <? print "Tohle je další ukázka PHP."; ?> <? php 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, konkrétně editor FrontPage společnosti Microsoft, potíže s únikovou syntaxí, kterou se obracíme na PHP. Proto byla do PHP začleněna ještě jedna varianta od-dělovací syntaxe, <script>:<script>:

<script language="php"> <script language="php"> print "Tohle je další ukázka PHP."; print "Tohle je další ukázka PHP."; </script> </script>

TipEditor FrontPage společnosti Microsoft rozpoznává oddělovací syntax ve stylu ASP, která následuje.

Styl ASP Stránky ASP společnosti Microsoft používají obdobnou strategii. Také oddělují statickou syntax od dy-namické pomocí předem definovaného vzorku znaků. Dynamická syntax se uvozuje znaky <%<% a ukon-čuje znaky %>.%>. Přicházíte-li z krajiny ASP a rádi byste i nadále používali tuto syntax, PHP ji podporuje. Podívejte se na ukázku:

<% <% print "Tohle je další ukázka PHP."; print "Tohle je další ukázka PHP."; %> %>

Vkládání několika bloků kódu Na PHP se můžete obracet na dané stránce kolikrát, kolikrát jenom chcete. Například, následující ukáz-ka je formálně zcela v pořádku:

<html> <html> <head> <head> <title><?php echo "Vítejte na mém webu!";?></title> <title><?php echo "Vítejte na mém webu!";?></title> </head> </head> <body> <body> <?php <?php $date = "18. září 2004"; $date = "18. září 2004"; ?> ?>

Page 31: Velká kniha PHP a MySQL 5

Kapitola 3 – Základy PHP72

<h3>Dnes je <?=$date;?></h3> <h3>Dnes je <?=$date;?></h3> </body> </body></html></html>

Připomínám, že jakékoli proměnné, které se deklarují před blokem kódu, se „zapamatují“ pro potřeby následných bloků, což je v našem příkladu případ proměnné $date$date.

Komentáře Zdůraznit, jak je důležité prokládat kód pečlivými komentáři, není nikdy zbytečné. PHP pro komentáře nabízí několik syntaktických variant, jejichž popis následuje.

Syntax 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)(\n). PHP pod-poruje jednořádkové komentáře ve stylu C++, které jsou uvozené dvěma lomítky (//),(//), jako zde:

<?php <?php // Titulek: Můj program PHP // Titulek: Můj program PHP // Autor: Jason // Autor: Jason print "Tohle je program PHP"; print "Tohle je program PHP"; ?> ?>

Syntax shelluPHP také podporuje alternativu k syntaxi ve stylu C++, které se říká syntax shellu. Komentář je uvozen znakem hash (#).(#). Předchozí ukázka pak vypadá takto:

<?php <?php # Titulek: Můj program PHP # Titulek: Můj program PHP # Autor: Jason # Autor: Jason print "Tohle je program PHP"; 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. Ta-kové vysvětlení se obvykle na jediný řádek nevejde. Přestože byste mohli postupovat tak, že byste kaž-dý řádek zahájili oddělovači ve stylu C++ nebo shellu, nabízí PHP pohodlnější variantu s uvozovacím a ukončovacím oddělovačem komentáře. Podívejte se na několikařádkový komentář:

<?php <?php /* /* Titulek: Můj program PHP Titulek: Můj program PHP Autor: Jason Autor: Jason

Page 32: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 73

Datum: 10. října 2005 Datum: 10. října 2005 */ */?> ?>

Syntax komentáře na několika řádcích se hodí zejména tehdy, když z kódu generujete dokumentaci, protože nabízí možnost, jak odlišit skutečné komentáře od okomentovaného kódu, což není tak snadné, jako když se používá jednořádková syntax komentářů.

Výstup Většina webových aplikací je značně interaktivních. Dobře napsané skripty trvale komunikují s uživa-teli, a to přes nástroje rozhraní, i prostřednictvím odpovědí na požadavky. PHP nabízí pro zobrazování informací řadu prostředků, jejichž popis následuje.

print() boolean print(boolean print(argumentargument) )

Účelem příkazu printprint je poskytnout uživateli zpětnou vazbu. Umí zobrazit prosté řetězce i obsah pro-měnných. Všechny následující příkazy jsou akceptovatelné příkazy printprint:

<?php<?php print("<p>Zbožňuji léto.</p>"); print("<p>Zbožňuji léto.</p>");?>?>

<?php<?php $obdobi = "léto"; $obdobi = "léto"; print "<p> Zbožňuji $obdobi.</p>"; print "<p> Zbožňuji $obdobi.</p>";?>?>

<?php<?php print "<p> Zbožňuji print "<p> Zbožňuji léto.</p>"; léto.</p>";?>?>

<?php<?php $obdobi = "léto"; $obdobi = "léto"; print "<p> Zbožňuji ".$obdobi.".</p>"; print "<p> Zbožňuji ".$obdobi.".</p>"; ?> ?>

Všechny příkazy vypíší:

Zbožňuji léto. Zbožňuji léto.

Zatímco tři první varianty jsou patrně velmi snadno pochopitelné, poslední z nich tak zřejmá být nemu-sí. V poslední variantě jsem totiž zřetězil tři řetězce do jediného pomocí tečky, která slouží v tomto kon-textu jako operátor řetězení. Je to technika, která se běžně používá při řetězení proměnných, konstant a statických řetězců. S uvedenou strategií se budete průběžně setkávat na různých místech knihy.

Page 33: Velká kniha PHP a MySQL 5

Kapitola 3 – Základy PHP74

PoznámkaPřestože nás oficiální syntax vybízí, abychom argument dávali do závorek, máte možnost je vyne-chat. Mnozí programátoři je neuvádějí prostě proto, že je cílový argument zřejmý i bez nich. .

echo() void echo(string argument1 [, ...string argumentN]) void echo(string argument1 [, ...string argumentN])

Příkaz echoecho funguje obdobně jako printprint, ale se dvěma odlišnostmi. Zaprvé nemůže být částí složitěj-šího výrazu, protože vrací voidvoid, zatímco printprint vrací hodnotu typu boolean. Zadruhé echoecho umí vypsat několik řetězců. Prospěšnost té druhé vymoženosti je problematická, vypadá to, že je to více než cokoli jiného, jen otázka osobních preferencí. Nicméně je k dispozici, pokud pocítíte neodolatelnou potřebu ji použít. Tady máte ukázku:

<?php <?php $heavyweight = "Lennox Lewis"; $heavyweight = "Lennox Lewis"; $lightweight = "Floyd Mayweather"; $lightweight = "Floyd Mayweather"; echo $heavyweight, " a ", $lightweight, " jsou skvělí bojovníci."; echo $heavyweight, " a ", $lightweight, " jsou skvělí bojovníci.";?> ?>

Kód vyprodukuje následující výstup:

Lennox Lewis a Floyd Mayweather jsou skvělí bojovníci. Lennox Lewis a Floyd Mayweather jsou skvělí bojovníci.

TipCo je rychlejší, echo()echo() nebo print()print()? To, že jsou funkčně zaměnitelné, způsobuje, že si mnozí kladou tuto otázku. Odpověď zní, že funkce echo()echo() je nepatrně rychlejší, protože nic nevrací, kdežto print()print() vrací booleovskou hodnotu, kterou informuje volajícího, zda příkaz zvládl výstup úspěšně, nebo ne. Je zcela nepravděpodobné, že byste si všimli nějakého rozdílu v rychlosti, takže se můžete rozhodnout podle toho, co vám více vyhovuje stylisticky.

printf() boolean printf (string boolean printf (string formatformat [, mixed [, mixed argsargs]) ])

Funkce printf()printf() je funkčně identická s print()print(). Jde o výstup argumentů specifikovaných v argsargs, ale výstup se naformátuje podle formatformat. To umožňuje získat značnou kontrolu nad výstupem dat, pokud jde o takové věci, jako jsou zarovnání, přesnost, typ či pozice. Argument se může skládat až z pěti kom-ponent, které se musejí ve format objevit ve stanoveném pořadí:

• Specifikátor doplnění: volitelná komponenta, která určuje, jakým znakem se výstup doplní na správnou délku řetězce. Výchozí znak je mezera. Alternativní znak se specifikuje tak, že se před něj napíše apostrof.

• Specifikátor zarovnání: volitelná komponenta, která určuje, zda má být výstup zarovnaný doleva nebo doprava. Výchozí je doprava. Zarovnání vlevo vynutíte tím, že uvedete znaménko minus.

Page 34: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 75

• Specifikátor délky: volitelná komponenta, která určuje minimální počet znaků, který má výstup z funkce obsahovat.

• Specifikátor přesnosti: volitelná komponenta, která určuje, kolik se má zobrazit desetinných míst. Má vliv pouze na data typu floatfloat.

• Specifikátor typu: určuje, jak se argument přetypuje. Podporované specifikátory typu jsou uve-dené v tabulce 3-1.

Tabulka 3-1. Podporované specifikátory typu.

Typ Popis

%b %b Argument se považuje za celé číslo, zobrazí se jako binární číslo.

%c %c Argument se považuje za celé číslo, zobrazí se znak odpovídající dané hodnotě ASCII.

%d%d Argument se považuje za celé číslo, zobrazí se jako dekadické číslo se znaménkem.

%f%f Argument se považuje za číslo v pohyblivé řádové čárce a tak se také zobrazí.

%o%o Argument se považuje za celé číslo, zobrazí se jako oktalové číslo.

%s%s Argument se považuje za řetězec, zobrazí se jako řetězec.

%u%u Argument se považuje za celé číslo, zobrazí se jako dekadické číslo bez znaménka.

%x%x Argument se považuje za celé číslo, zobrazí se jako hexadecimální číslo s malými písmeny.

%X%X Argument se považuje za celé číslo, zobrazí se jako hexadecimální číslo s velkými písmeny

Podívejte se na několik ukázek:

printf("$%01.2f", 43.2); // $43.20printf("$%01.2f", 43.2); // $43.20printf("%s je %d lahví piva", "Ve sklepě", 100); // Ve sklepě je 100 lahví piva printf("%s je %d lahví piva", "Ve sklepě", 100); // Ve sklepě je 100 lahví piva printf("%15s", "Nějaký text"); // Nějaký text printf("%15s", "Nějaký text"); // Nějaký text

Někdy se hodí změnit výstupní pořadí argumentů, nebo zopakovat výstup některého konkrétního argu-mentu, aniž byste ho museli opakovaně uvádět v seznamu argumentů. To se dělá tak, že se odkážete na argument, a zároveň na jeho pozici. Například, %2$%2$ vyjadřuje argument umístěný v seznamu argumentů na druhé pozici, zatímco %3$%3$ vyjadřuje třetí. Když to však umístíte do řetězce formatformat, musíte před znak dolar uvést obrácené lomítko, například %2\$%2\$. Dvě ukázky:

printf("Náš %2\$s rád %1\$s", "štěká", "pes"); printf("Náš %2\$s rád %1\$s", "štěká", "pes"); // Náš pes rád štěká// Náš pes rád štěkáprintf("Náš %1\$s říká: %2\$s, %2\$s.", "pes", "haf");printf("Náš %1\$s říká: %2\$s, %2\$s.", "pes", "haf");// Náš pes říká: haf, haf. // Náš pes říká: haf, haf.

sprintf() string sprintf (string string sprintf (string formatformat [, mixed [, mixed argumentsarguments]) ])

Funkce sprintf()sprintf() se funkčně shoduje s printf()printf() až na to, že se výstup přiřadí do řetězce, nejde přímo na standardní výstup. Ukázka:

$cena = sprintf("$%01.2f", 43.2); // $cena = $43.20 $cena = sprintf("$%01.2f", 43.2); // $cena = $43.20

Page 35: Velká kniha PHP a MySQL 5

Kapitola 3 – Základy PHP76

Typy dat Datový typ je obecný název přiřazený nějaké množině dat, která sdílí nějakou společnou množinu cha-rakteristik. Mezi běžné datové typy patří řetězce, celá čísla, čísla v pohyblivé řádové čárce a booleovské hodnoty. PHP už dlouho nabízí bohatou sadu datových typů. K nim přibyly ve verzi 5 další. V tomto oddílu projdu jednotlivé datové typy, které lze všechny rozdělit do tří kategorií: skalární, složené a spe-ciální.

Skalární datové typy Skalární datové typy mohou obsahovat jen jediný prvek informace. Sem spadá několik datových typů: booleanboolean, integerinteger, floatfloat a stringstring.

Boolean

Datový typ boolean se jmenuje po matematikovi George Booleovi (1815–1864), který je pokládám za jednoho ze zakladatelů teorie informace. Booleovská proměnná reprezentuje pravdivost, a podporuje tedy pouze dvě hodnoty: TRUETRUE ( pravda) nebo FALSEFALSE ( nepravda); na velikosti písmen nezáleží. Alternati-vou je reprezentovat FALSEFALSE hodnotu nula, a TRUETRUE reprezentovat jakoukoli nenulovou hodnotou.

$jenazivu = false; # $jenazivu je false. $jenazivu = false; # $jenazivu je false. $jenazivu = 1; # $jenazivu je true. $jenazivu = 1; # $jenazivu je true. $jenazivu = -1; # $jenazivu je true. $jenazivu = -1; # $jenazivu je true. $jenazivu = 5; # $jenazivu je true. $jenazivu = 5; # $jenazivu je true. $jenazivu = 0; # $jenazivu je false. $jenazivu = 0; # $jenazivu je false.

Integer

Typ integerinteger vyjadřuje prostě celé číslo, neboli takové číslo, které nemá desetinnou část. Sem spadají čísla dekadická (o základu 10), oktalová (o základu 8) a hexadecimální (o základu 16). Několik ukázek:

42 # dekadické 42 # dekadické -678900 # dekadické-678900 # dekadické0755 # oktalové0755 # oktalové 0xC4E # hexadecimální 0xC4E # hexadecimální

Jaké je největší podporované celé číslo, závisí na platformě, i když obvykle je to plus nebo minus 231. Pokusíte-li se tento limit v nějakém skriptu PHP překročit, převede se takové číslo automaticky do po-hyblivé řádové čárky (na floatfloat). Ukázka:

<?php <?php $val = 45678945939390393678976; $val = 45678945939390393678976; echo $val + 5; echo $val + 5; ?> ?>

Výsledek bude:

4.567894593939E+022 4.567894593939E+022

Page 36: Velká kniha PHP a MySQL 5

Pokročilé schopnosti OOPKapitola 7

V kapitole 6 jste absolvovali základy objektově orientovaného programování v PHP. V této kapitole bu-deme na těchto základech stavět. Seznámíte se s několika vyspělejšími schopnostmi OOP, které byste si měli zařadit do svého repertoáru hned poté, co budete mít v malíku základy. Konkrétně se v kapitole hovoří o pěti schopnostech:

• Klonování objektů. Jedním z hlavních zdokonalení modelu OOP v PHP verze 5 je to, že se všechny objekty považují za odkazy, ne za hodnoty. Jak se pak ovšem vypořádáme s úlohou vytvořit kopii objektu, když se všechny objekty považují za odkazy? Klonováním objektu, což je nová schopnost v PHP 5.

• Dědění. Jak už bylo zmíněno v kapitole 6, je schopnost budovat hierarchie tříd prostřednictvím dědění klíčovým pojmem OOP. Dozvíte se, co je to dědění, jakou má v PHP 5 syntax, a uvidíte několik příkladů, které předvádějí tuto klíčovou schopnost OOP.

• Rozhraní. Rozhraní je nějaká kolekce neimplementovaných definic metod a konstant. Slouží jako jistý náčrt třídy. Rozhraní přesně definují, co se může ve třídě dělat, ale nezatěžují se kon-krétními podrobnostmi implementace. V této kapitole se dozvíte, jakou podporu poskytuje PHP 5 pro rozhraní, a uvidíte také několik příkladů, které předvádějí tuto klíčovou schopnost OOP.

• Abstraktní třídy. Abstraktní třída je v podstatě taková třída, ze které se nedají vytvářet instance. Účelem abstraktních tříd je to, aby se z nich odvozovaly třídy, jejichž instance se už dají vytvářet (říká se jim někdy konkrétní třídy). Abstraktní třídy lze implementovat plně, nebo implemento-vat jen částečně, nebo neimplementovat vůbec. V této kapitole se uvádějí všeobecné pojmy, které se točí okolo abstraktních tříd spolu s úvodem, jak se abstraktní třídy implementují v PHP 5.

• Reflexe. Jak jste se dozvěděli v kapitole 6, skrývání „odpudivých“ podrobností aplikace přívěti-vými rozhraními ( zapouzdření) je jedním z hlavních pilířů OOP. Nicméně programátoři ovšem potřebují nějaké pohodlné prostředky, jimiž se dá prozkoumávat chování třídy. Tuto schopnost poskytuje pojem reflexe, který se zde vysvětluje.

Page 37: Velká kniha PHP a MySQL 5

Kapitola 7 – Pokročilé vlastnosti OOP178

Schopnosti OOP nepodporované v PHPMáte-li zkušenosti s jinými objektově orientovanými jazyky, možná p o přečtení výše uvedeného se-znamu nespokojeně potřásáte hlavou, a p táte se, proč v něm c hybí jedna neb o několik konkrétních schopností OOP, které důvěrně znáte z jiných jazyků. Je docela dobře možné, že je to kvůli tomu, že PHP tuto schopnost nepodporuje. Takže abyste si hlavu úplně nevyviklali z pantů, jsou v následujícím výčtu uvedena ta vyspělá témata OOP, která PHP nepodporuje, a proto jejich výklad v kapitole nenajdete.

• Jmenné prostory ( namespace). Přestože byly původně do PHP 5 naplánované, od začlenění jmenných prostorů bylo brzo upuštěno. Není jasné, zda bude podpora jmenných prostorů inte-grována do nějaké budoucí verze.

• Přetěžování metod ( overloading). Možnost docílit polymorfického účinku prostřednictvím pře-těžování funkcí PHP nepodporuje a podle diskuse na webových stránkách Zend Technologies, patrně ani nikdy podporovat nebude. Více se o tom můžete dozvědět na adrese http://www.http://www.zend.com/php/ask_experts.phpzend.com/php/ask_experts.php.

• Přetěžování operátorů. Možnost přiřadit dodatečné významy stávajícím operátorům na základě typu dat, která se pokoušíte modifikovat, zatím není na pořadu dne. Podle výše zmíněné diskuse na webu Zend Technologies, není pravděpodobné, že by se tato schopnost někdy v budoucnu implementovala.

• Vícenásobné dědění. PHP nepodporuje vícenásobné dědění. Implementace více rozhraní se však podporuje.

Jen čas ukáže, budou-li se v budoucnu některé z těchto schopností v PHP podporovat.

Klonování objektů Jednou z největších stinných stránek objektově orientovaných schopností PHP 4 b yla skutečnost, že zacházel s objekty jako s jinými datovými typy. Tato praxe byla překážkou využití mnohých běžných metodologií OOP, jako jsou návrhové vzory. Takové metodologie závisejí na možnosti předávat objekty do jiných metod třídy odkazem, ne hodnotou, což byla výchozí praktika v PHP. Naštěstí byla tato záleži-tost v PHP 5 vyřešena, a nyní se standardně se všemi objekty zachází jako s odkazy. Protože se ale nyní se všemi objekty zachází jako s odkazy, ne jako s hodnotami, je zase obtížnější udělat kopii objektu. Poku-síte-li se zkopírovat odkazovaný objekt, bude prostě ukazovat zpět na adresované umístění původního objektu. PHP se s tím vypořádal tak, že nabízí explicitní prostředek pro klonování objektu.

Příklad klonování Klon objektu vytvoříte tak, že před ním uvedete klíčové slovo cloneclone, jako zde:

cílový_objekt cílový_objekt = clone = clone zdrojový_objektzdrojový_objekt; ;

Vyčerpávající příklad klonování objektu nabízí výpis 7-1. V p říkladu jsem vytvořil ukázkovou třídu s názvem parazitFirmyparazitFirmy, která obsahuje dva členy (idZamestnanceidZamestnance a barvaKravatybarvaKravaty), a jejich odpo-vídající gettery a settery. V příkladu se vytvoří instance parazitFirmyparazitFirmy a použije se jako základna pro předvedení, jaké účinky má operace klonování.

Page 38: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 179

Výpis 7-1. Klonování objektu pomocí klíčového slova cloneclone

<?php <?php class parazitFirmy { class parazitFirmy { private $idZamestnance ; private $idZamestnance ; private $barvaKravaty; private $barvaKravaty;

// Definuje setter a getter pro $idZamestnance // Definuje setter a getter pro $idZamestnance function nastavitIdZamestnance ($idZamestnance ) { function nastavitIdZamestnance ($idZamestnance ) { $this->idZamestnance = $idZamestnance ; $this->idZamestnance = $idZamestnance ; } } function ziskatIdZamestnance() { function ziskatIdZamestnance() { return $this->idZamestnance ; return $this->idZamestnance ; } }

// Definuje setter a getter pro $barvaKravaty // Definuje setter a getter pro $barvaKravaty function nastavitBarvuKravaty ($barvaKravaty) { function nastavitBarvuKravaty ($barvaKravaty) { $this->barvaKravaty = $barvaKravaty; $this->barvaKravaty = $barvaKravaty; } }

function ziskatBarvuKravaty() { function ziskatBarvuKravaty() { return $this->barvaKravaty; return $this->barvaKravaty; } } } }

// Vytvoří nový objekt parazita firmy // Vytvoří nový objekt parazita firmy $parazit1 = new parazitFirmy(); $parazit1 = new parazitFirmy();

// Nastaví člen idZamestnance parazita 1 // Nastaví člen idZamestnance parazita 1 $parazit1->nastavitIdZamestnance ("12345"); $parazit1->nastavitIdZamestnance ("12345");

// Nastaví člen barvaKravaty parazita 1 // Nastaví člen barvaKravaty parazita 1 $parazit1->nastavitBarvuKravaty ("červená"); $parazit1->nastavitBarvuKravaty ("červená");

// Vytvoří klon parazita 1 // Vytvoří klon parazita 1 $parazit2 = clone $parazit1; $parazit2 = clone $parazit1;

// Nastaví člen idZamestnance parazita 2 // Nastaví člen idZamestnance parazita 2 $parazit2->nastavitIdZamestnance ("67890"); $parazit2->nastavitIdZamestnance ("67890");

// Výstup členů prvního a druhého parazita // Výstup členů prvního a druhého parazita echo "parazit1 id zaměstnance: ".$parazit1->ziskatIdZamestnance ()."<br />"; echo "parazit1 id zaměstnance: ".$parazit1->ziskatIdZamestnance ()."<br />"; echo "parazit1 barva kravaty: ".$parazit1->ziskatBarvuKravaty()."<br />"; echo "parazit1 barva kravaty: ".$parazit1->ziskatBarvuKravaty()."<br />"; echo "parazit2 id zaměstnance: ".$parazit2->ziskatIdZamestnance ()."<br />"; echo "parazit2 id zaměstnance: ".$parazit2->ziskatIdZamestnance ()."<br />"; echo "parazit2 barva kravaty: ".$parazit2->ziskatBarvuKravaty()."<br />"; echo "parazit2 barva kravaty: ".$parazit2->ziskatBarvuKravaty()."<br />";?> ?>

Page 39: Velká kniha PHP a MySQL 5

Kapitola 7 – Pokročilé vlastnosti OOP180

Když kód spustíte, vrátí:

parazit1 id zaměstnance: 12345 parazit1 id zaměstnance: 12345 parazit1 barva kravaty: červená parazit1 barva kravaty: červená parazit2 id zaměstnance: 67890 parazit2 id zaměstnance: 67890 parazit2 barva kravaty: červená parazit2 barva kravaty: červená

Jak vidíte, $parazit2$parazit2 se stal objektem typu parazitFirmyparazitFirmy a zdědil hodnoty členů z $parazit1$parazit1. Aby se zdůraznilo, že je $parazit2$parazit2 opravdu typu parazitFirmyparazitFirmy, nastavil se znovu i jeho člen idZamestnan-idZamestnan-cece.

Metoda _ _clone()Při klonování objektu si dokonce můžete přizpůsobit chování tohoto procesu, když si ve třídě objektu definujete metodu _ _clone()_ _clone(). Kromě toho, že se do cílového objektu zkopírují všechny existující členy objektu, vykoná se také vše, co je umíst ěné v této metodě. Upravte třídu parazitFirmyparazitFirmy tak, že do ní přidáte metodu:

function _ _clone() { function _ _clone() { $this->barvaKravaty = "modrá"; $this->barvaKravaty = "modrá"; } }

Až s tím budete hotovi, vytvořte nový objekt parazitFirmyparazitFirmy, přidejte hodnotu členu idZamestnanceidZamestnance, udělejte klon objektu, a nakonec vypište potřebná data, abyste si ověřili, že se barvaKravatybarvaKravaty klonované-ho objektu skutečně nastavila prostřednictvím metody _ _clone()_ _clone(). Příklad vidíte ve výpisu 7-2.

Výpis 7-2. Rozšíření možností klíčového slova cloneclone metodou _ _clone()_ _clone()

// Vytvoří objekt nového parazita firmy// Vytvoří objekt nového parazita firmy$parazit1 = new parazitFirmy();$parazit1 = new parazitFirmy();// Nastaví člen idZamestnance parazita 1 // Nastaví člen idZamestnance parazita 1 $parazit1->nastavitIdZamestnance ("12345");$parazit1->nastavitIdZamestnance ("12345");// Vytvoří klon objektu $parazit1 // Vytvoří klon objektu $parazit1 $parazit2 = clone $parazit1;$parazit2 = clone $parazit1;// Nastaví člen idZamestnance parazita 2// Nastaví člen idZamestnance parazita 2$parazit2->nastavitIdZamestnance ("67890");$parazit2->nastavitIdZamestnance ("67890");// Výstup členů obou parazitů // Výstup členů obou parazitů echo "parazit1 id zaměstnance: ".$parazit1->ziskatIdZamestnance ()."<br />";echo "parazit1 id zaměstnance: ".$parazit1->ziskatIdZamestnance ()."<br />";echo "parazit2 id zaměstnance: ".$parazit2->ziskatIdZamestnance ()."<br />";echo "parazit2 id zaměstnance: ".$parazit2->ziskatIdZamestnance ()."<br />";echo "parazit2 barva kravaty: ".$parazit2->ziskatBarvuKravaty()."<br />";echo "parazit2 barva kravaty: ".$parazit2->ziskatBarvuKravaty()."<br />";

Když kód vykonáte, vypíše:

parazit1 id zaměstnance: 12345 parazit1 id zaměstnance: 12345 parazit2 id zaměstnance: 67890 parazit2 id zaměstnance: 67890 parazit2 barva kravaty: modrá parazit2 barva kravaty: modrá

Page 40: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 181

Dědění Lidé mají docela dobrou výbavu pro uvažování v takových termínech, jakým je třeba uspořádaná hierar-chie, proto není nijak překvapující, že je takové nahlížení na správu mnoha aspektů našeho každodenní-ho života široce rozšířené. Struktury managementu firmy, daňový systém Spojených Států, i náš pohled na říše rostlin a živočichů, to je jen několik příkladů systémů, které se převážně spoléhají na hierarchie. Protože je objektově orientované programování založeno na premise, že my lidé dokážeme velmi dobře modelovat vlastnosti a chování prostředí skutečného světa, které se snažíme implementovat pomocí kódu, dá se z toho rozumně usoudit, že jsme také schopni znázorňovat tyto hierarchické vztahy.

Předpokládejme například, že vaše aplikace potřebuje třídu nazvanou ZamestnanecZamestnanec, jejíž účelem má být reprezentace charakteristik a chování, jaká člověk může očekávat od nějakého zaměstnance. Mezi členy takové třídy by mohly patřit

• jmenojmeno: jméno zaměstnance

• vekvek: věk zaměstnance

• platplat: plat zaměstnance

• zamestnan_letzamestnan_let: počet let, které daný zaměstnanec u firmy pracuje.

Mezi metody třídy ZamestnanecZamestnanec by mohly patřit:

• vykonatPracivykonatPraci: vykoná nějakou práci související se zadaným úkolem.

• snistObedsnistObed: vezme si přestávku na oběd.

• vzitDovolenouvzitDovolenou: týká se nejcennějších týdnů v roce.

Tyto charakteristiky a chování budou relevantní pro všechny druhy zaměstnanců, bez ohledu na účel nebo pozici zaměstnance v organizaci. Je zřejmé, že budou mezi zaměstnanci také jisté rozdíly; napří-klad, pracovník exekutivy může mít v držení jisté akcie firmy, a bude sto společnost tunelovat, zatím-co jiní zaměstnanci takové výdobytky nemají. Sekretářka musí umět napsat dopis a vedoucí prodejny musí umět udělat inventuru. Navzdory těmto rozdílům by ale bylo velmi neefektivní, kdybyste museli vytvářet a udržovat redundantní struktury tříd pro ty atributy, které sdílejí všichni zaměstnanci. Vývoj schematu OOP to bere v úvahu. Umožňuje dědit z existujících tříd a dále na nich budovat.

Dědění třídyV PHP se dědění třídy dociluje klíčovým slovem extendsextends .Předvádí je výpis 7-3, kde se nejprve definuje třída ZamestnanecZamestnanec, pak se vytvoří třída VedouciVedouci, která bude dědit ze třídy ZamestnanecZamestnanec.

PoznámkaTřídě, která dědí z jiné třídy, se říká dceřiná ( child) třída, podtřída nebo odvozená třída. Dceřiná třída dědí ze své rodičovské (parent), neboli základní ( base) třídy.

Page 41: Velká kniha PHP a MySQL 5

Kapitola 7 – Pokročilé vlastnosti OOP182

Výpis 7-3. Dědění ze základní třídy

<?php <?php # Definuje třídu Zamestnanec # Definuje třídu Zamestnanec class Zamestnanec { class Zamestnanec { private $jmeno; private $jmeno;

# Definuje funkci set vlastnosti pro soukromý člen $jmeno. # Definuje funkci set vlastnosti pro soukromý člen $jmeno. function nastavitJmeno($jmeno) { function nastavitJmeno($jmeno) { if ($jmeno == "") echo "Jméno nesmí zůstat prázdné!"; if ($jmeno == "") echo "Jméno nesmí zůstat prázdné!"; else $this->jmeno = $jmeno; else $this->jmeno = $jmeno; } }

# Definuje funkci get vlastnosti pro soukromý člen $jmeno # Definuje funkci get vlastnosti pro soukromý člen $jmeno function ziskatJmeno() { function ziskatJmeno() { return "Jmenuji se ".$this->jmeno."<br />"; return "Jmenuji se ".$this->jmeno."<br />"; } }

} #konec třídy Zamestnanec } #konec třídy Zamestnanec

# Definuje třídu Vedouci, která bude dědit z třídy Zamestnanec # Definuje třídu Vedouci, která bude dědit z třídy Zamestnanec class Vedouci extends Zamestnanec { class Vedouci extends Zamestnanec { # Definuje metodu jedinečnou pro Zamestnanec # Definuje metodu jedinečnou pro Zamestnanec function tunelovatFirmu() { function tunelovatFirmu() { echo "Prodám aktiva firmy, abych mohl financovat svou jachtu!"; echo "Prodám aktiva firmy, abych mohl financovat svou jachtu!"; } }

} #konec třídy Vedouci } #konec třídy Vedouci

# vytvoří nový objekt Vedouci # vytvoří nový objekt Vedouci $exec = new Vedouci(); $exec = new Vedouci();

# zavolá metodu nastavitJmeno(), která je definovaná ve třídě Zamestnanec # zavolá metodu nastavitJmeno(), která je definovaná ve třídě Zamestnanec $exec->nastavitJmeno("Richard"); $exec->nastavitJmeno("Richard");

# Zavolá metodu ziskatJmeno() # Zavolá metodu ziskatJmeno() echo $exec->ziskatJmeno(); echo $exec->ziskatJmeno();

# zavolá metodu tunelovatFirmu() # zavolá metodu tunelovatFirmu() $exec->tunelovatFirmu(); $exec->tunelovatFirmu();?> ?>

Kód vrátí

Jmenuji se Richard.Jmenuji se Richard.Prodám aktiva firmy, abych mohl financovat svou jachtu!Prodám aktiva firmy, abych mohl financovat svou jachtu!

Page 42: Velká kniha PHP a MySQL 5

Úvod do PDOKapitola 23

Počet dostupných softwarových řešení je zároveň požehnáním i prokletím. I když je jejich nadbytečná hojnost skvělá pro konečné uživatele, protože si mohou vyhledat takový produkt, který nejlépe vyhovu-je jejich konkrétním potřebám, už dlouho je prokázané, že je to noční můra pro vývojáře a systémové administrátory, protože se od nich požaduje, aby dva nebo více odlišných produktů transparentně vzá-jemně komunikovaly. I když to, že se ctí různé standardy, jako je třeba XML, značně přispívá v úsilí o interoperabilitu, jsme stále roky vzdáleni od nějakého obecně akceptovatelného řešení.

Tento problém se projeví zvlášť velmi zřetelně tehdy, když aplikace požadují jako datovou základnu nějakou databázi. Zatímco všechny hlavní databáze ctí standard SQL, přestože s různými odchylkami, rozhraní, na nichž jsou závislí programátoři, chtějí-li s databází komunikovat, mohou být značně od-lišná (dokonce i tehdy, když jsou dotazy z valné části stejné). Proto bývají aplikace téměř vždy svázané s nějakou konkrétní databází, čímž nutí uživatele, aby si také nainstalovali a udržovali tu hlavní data-bázi, pokud ji ještě nevlastní. Nebo musejí zvolit alternativní, nějaké patrně méně vyspělé řešení, které bude kompatibilní s jejich stávajícím prostředím. Předpokládejme například, že vaše organizace poža-duje aplikaci, která se bude provozovat výlučně na Oracle, ale vaše organizace je přitom standardizovaná na nějakou databázi open-source. Odhodláte se investovat značné prostředky, které bude nutno vložit do nákupu nezbytných licencí Oracle, jste ochotni udržovat tuto databázi jen kvůli tomu, aby se mohla provozovat jedna jediná konkrétní aplikace?

Aby se programátoři velkých korporací nějak s t ěmito dilematy vypořádali, začali vyvíjet abstraktní databázové vrstvy, které mají sloužit k tomu, aby se mohla oddělit logika aplikace od logiky komunikace s databází. Když se všechny příkazy související s databází mohou prohnat nějakým zevšeobecněným rozhraním, může pak aplikace používat jedno z několika databázových řešení, za předpokladů, že daná databáze podporuje schopnosti, které aplikace požaduje, a že abstraktní vrstva nabízí ovladač kompati-bilní s danou databází. Graficky je popisovaný proces znázorněn na obrázku 23-1. Patrně už něco víte o některých rozšířenějších implementacích, z nichž několik je uvedeno v následujícím výčtu:

• DB: DB je databázová abstraktní vrstva napsaná v PHP a k dispozici jako balík PEAR. (Další informace o PEAR viz kapitola 11.) V současné době podporuje FrontBase, InterBase, Informix, Mini SQL, MySQL, Oracle, ODBC, PostgreSQL, SQLite a Sybase.

Page 43: Velká kniha PHP a MySQL 5

Kapitola 23 – Úvod do PDO552

• JDBC: jak název implikuje, umožňuje standard Java Database Connectivity (JDBC) programá-torům Javy komunikovat s jakoukoli databází, pro kterou je k dispozici ovladač JDBC. Patří sem mj. MSSQL, 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. ovladače ODBC nabízejí všechny hlavní databáze, mezi nimi také ty, které jsou uvedené v odrážce JDBC výše.

• Perl DBI: modul Perl Database Interface je standardizovaný prostředek Perlu pro komunikaci s databází, a sloužil jako inspirace při tvorbě balíku DB PHP.

Jak vidíte, mají uživatelé PHP p o ruce řešení DB i ODBC, proto se může zdát, že jsou vaše potřeby vyřešené, co se týče databázové abstrakce, vyvíjíte-li aplikace poháněné PHP, není-liž pravda? I když jsou tato (a mnohá jiná) řešení hotová a po ruce, už nějakou dobu se vyvíjí ještě lepší řešení, které bylo oficiálně vydané s PHP 5.1. Je známé jako abstraktní vrstva PDO ( PHP Data Objects).

Zase další databázová abstraktní vrstva? Jak PDO v posledních dvou letech dozrával, dost okolo toho hudrali vývojáři, kteří buď byli zaintere-sováni ve vývoji nějakých jiných databázových abstraktních vrstev, nebo patrně byli příliš soustředěni na schopnosti databázové abstraktní vrstvy PDO, než na celou paletu vybavení, které nabízí. Skutečně, PDO poslouží jako ideální náhrada balíku DB a obdobných řešení. PDO je však ve skutečnosti mnohem dál, není to jen pouhá další databázová abstraktní vrstva:

• Konsistentní kódování: protože různá databázová rozšíření, která jsou k dispozici pro PHP, psa-li různí hostující přispěvovatelé, neexistuje jednotnost v kódování, navzdory faktu, že všechna tato rozšíření nabízejí v zásadě stejné schopnosti. PDO tuto nejednotnost odstraňuje, protože nabízí jediné rozhraní, které se používá vždy, bez ohledu na to, o jakou databázi se jedná. Navíc

Obrázek 23-1 Oddělení aplikačních a datových vrstev pomocí abstraktní databázové vrstvy

Page 44: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 553

rozšíření je rozděleno do dvou zřetelně vymezených komponent: jádro PDO obsahuje většinu kódu specifického pro PHP, takže se jednotlivé ovladače mohou soustředit výhradně na data. Dále, vývojáři PDO využili svých vědomostí a zkušeností při budování různých databázových rozšíření v posledních letech, takže mohli těžit z toho, co se osvědčilo, to zařadili, a zároveň se pečlivě vystříhali toho, aby zařazovali něco, co se neosvědčilo.

• Flexibilita: protože PDO načítá potřebný databázový ovladač až při běhu, není třeba překonfi-gurovat a překompilovat PHP pokaždé, když se používá jiná databáze. Například potřebujete--li náhle přejít z Oracle na PostgreSQL, prostě načtěte ovladač PDO_PGSQLPDO_PGSQL a pracujte (jak se to udělá, o tom více později).

• Objektově orientované schopnosti: PDO využívá objektově orientovaných schopností PHP, což vede na vyspělejší a efektivnější databázovou komunikaci.

• Výkon: PDO je napsaný v C a vkompilovaný do PHP, což samo o sobě, budou-li všechny ostatní faktory rovnocenné, poskytuje značný nárůst výkonu oproti řešením napsaným v PHP.

Vzhledem k t ěmto přednostem, proč to nezkusit? V této kapitole se dostatečně obeznámíte s PD O a s myriádami schopností, které nabízí.

Jak se pracuje s PDO PDO se až p ozoruhodně podobá všem databázovým rozšířením, která už dlouhou dobu podporuje PHP; proto, jestliže jste už používali PHP v součinnosti s nějakou databází, bude vám látka prezentova-ná v tomto oddílu připadat důvěrně známá. Jak už bylo zmíněno, PDO byl vybudován tak, že jeho tvůrci měli stále na mysli ty nejlepší schopnosti předchozích databázových rozšíření, takže není divu, že v jeho metodách najdete značné podobnosti s tím, co už zn áte. Oddíl zahájíme stručným přehledem procesu instalace PDO, pak následuje přehled databázových serverů, které se podporují v současné době. V pří-kladech kapitoly budeme používat následující tabulku MySQL:

CREATE TABLE product ( CREATE TABLE product ( rowid SMALLINT NOT NULL AUTO_INCREMENT, rowid SMALLINT NOT NULL AUTO_INCREMENT, sku CHAR(8) NOT NULL, sku CHAR(8) NOT NULL, name VARCHAR(35) NOT NULL, name VARCHAR(35) NOT NULL, PRIMARY KEY(rowid) ); PRIMARY KEY(rowid) );

Poznámka překladateleSKU je zkratka Stock Keeping Unit, v online obchodování jednoznačný identifikátor výrobku na skladě nebo v katalogu

Tabulku naplňte dále uvedenými výrobky:

rowID SKU Name 1 ZP457321 Painless Aftershave

2 TY232278 AquaSmooth Toothpaste 3 PO988932 HeadsFree Shampoo 4 KL334899 WhiskerWrecker Razors

Page 45: Velká kniha PHP a MySQL 5

Kapitola 23 – Úvod do PDO554

Instalace PDO Jak už bylo zmíněno, je PDO standardně zabalený do PHP 5.1 a no vějších verzí, takže provozujete-li tuto verzi, nemusíte podnikat vůbec žádné další kroky. Pracujete-li s nějakou verzí starší než 5.1, i t ak můžete pracovat s PDO, když si ho stáhnete z PECL; protože však PDO využívá plně nových objektově orientovaných schopností PHP 5, není možné ho používat v součinnosti s verzí, která je starší než 5.0. Ale ať je to tak či onak, když konfigurujete PHP, musíte přesto explicitně specifikovat ovladače, které chcete zařadit (výjimkou je ovladač SQLITESQLITE, který je zařazený standardně). Například chcete-li zapnout podporu ovladače MySQL PDO,přidejte do příkazu configureconfigure následující přepínač:

--with-pdo-mysql=/cesta/k/instalaci/mysql--with-pdo-mysql=/cesta/k/instalaci/mysql

Potřebujete-li se dozvědět víc o jednotlivých ovladačích PDO, vydejte příkaz configure --helpconfigure --help.

Pracujete-li s PHP 5.1 nebo novější verzí na platformě Windows, tak v době, kdy jsem psal tyto řádky, nebyly ovladače začleněné do distr ibuce. Proto přejděte na http://snaps.php.net/win32/http://snaps.php.net/win32/, zadejte patřičný adresář PECL a stáhněte si DLL PDO do adresáře, který máte vyznačený v direktivě extensi-extensi-on_diron_dir PHP. Pak musíte přidat odkazy na ovladače rozšíření do souboru php.iniphp.ini. Například chcete-li zapnout podporu MySQL, přidejte do sekce Windows ExtensionsWindows Extensions řádek:

extension=php_pdo_mysql.dll extension=php_pdo_mysql.dll

Podpora databází v PDOKdyž jsem psal tyto řádky, podporoval PDO devět databází kromě všech těch, které jsou přístupné přes FreeTDS a ODBC:

• Firebird: přístupná přes ovladač FIREBIRDFIREBIRD.

• FreeTDS: to není databáze, ale sada knihoven Unixu, které umožňují programům založených na Unixu hovořit s databázemi MSSQL a Sybase. Přístupná přes ovladač DBLIBDBLIB.

• IBM DB2: přístupná přes ovladač ODBCODBC.

• Interbase 6: přístupná přes ovladač FIREBIRDFIREBIRD.

• Microsoft SQL Server: přístupná přes ovladač MSSQLMSSQL.

• MySQL 3.X/4.0: přístupná přes ovladač MYSQLMYSQL. Připomínám, že v době, kdy jsem psal tyto řádky, nebylo dostupné rozhraní pro MySQL 5. Protože je jasné, že je to v seznamu priorit vývojářů hodně vysoko, bude to patrně brzy vyřešeno.

• ODBC v3: není databáze sama o sobě, ale umožňuje PDO používat v součinnosti s jakoukoli da-tabázi kompatibilní s ODBC, která není uvedena v tomto seznamu. Přístupná přes ovladač ODBCODBC.

• Oracle: přístupná přes ovladač OCIOCI.

• PostgreSQL: přístupná přes ovladač PGSQLPGSQL.

• SQLite 3.X: přístupná přes ovladač SQLITESQLITE.

• Sybase: přístupná přes ovladač SYBASESYBASE.

Page 46: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 555

TipKteré ovladače PDO máte dostupné ve svém prostředí můžete zjistit tak, že si v prohlížeči zobrazíte výstup z phpinfo()phpinfo() a podíváte se do sekce PDO. Nebo zavolejte funkci pdo_drivers()pdo_drivers(), jako zde: <?php print_r(pdo_drivers())<?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 PDO PDO::_ _construct(string DSNDSN [, string [, string usernameusername [, string [, string passwordpassword [, array [, array driver_optsdriver_opts]]]) ]]])

Parametr DSNDSN ( Data Source Name) se skládá ze dvou prvků: název požadovaného databázového ovla-dače a vš echny nezbytné proměnné databázového připojení, jako jsou název hostitele, port a náze v databáze. Parametry username a password specifikují uživatelské jméno a heslo , které se použijí při připojení k databázi. Konečně, pole driver_optsdriver_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žíte parametry do konstruktoru Při prvním způsobu volání konstruktoru PDO se parametry vloží přímo. Například byste ho mohli zavolat třeba takto (jedná se konkrétně o databázi MySQL):

$dbh = new PDO("mysql:host=localhost;dbname=corporate", "websiteuser", "secret"); $dbh = new PDO("mysql:host=localhost;dbname=corporate", "websiteuser", "secret");

Umístíte parametry do souboru PDO využívá schopnost PHP pracovat s proudy, což otevírá možnost umístit řetězec DSN do s epa-rátní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, jako zde:

$dbh = new PDO("uri:file://usr/local/mysql.dsn"); $dbh = new PDO("uri:file://usr/local/mysql.dsn");

Zajistěte ale, 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í.

Odkážete se na soubor php.ini Je také možné udržovat informace o DSN v souboru php.iniphp.ini, když je přiřadíte do konfiguračního pa-rametru pdo.dsn.aliasnamepdo.dsn.aliasname, kde aliasnamealiasname je zvolené alias pro DSN, které následně dodáte do kon-struktoru. Například v následující ukázce je alias DSN mysqlpdomysqlpdo:

[PDO][PDO]pdo.dsn.mysqlpdo = "mysql:dbname=corporate;host=localhost"pdo.dsn.mysqlpdo = "mysql:dbname=corporate;host=localhost"

Alias pak následně uvedete ve volání konstruktoru PDO, jako v:

$dbh = new PDO("mysqlpdo", "websiteuser", "secret"); $dbh = new PDO("mysqlpdo", "websiteuser", "secret");

Podobně jako v předchozím způsobu, ani tento neumožňuje zařadit do DSN uživatelské jméno a heslo.

Page 47: Velká kniha PHP a MySQL 5

Kapitola 23 – Úvod do PDO556

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_optsdriver_opts. Dostupné volby jsou uvedené v následujícím výčtu:

• PDO_ATTR_AUTOCOMMITPDO_ATTR_AUTOCOMMIT: určuje, zda bude PDO potvrzovat změny hned po vykonání každého dotazu, nebo zda bude čekat, až se vykoná metoda commit().

• PDO_ATTR_CASEPDO_ATTR_CASE: PDO můžete donutit, aby převáděl získané názvy sloupců na samé velká nebo na samá malá písmena, nebo aby používat 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_UPPERPDO_CASE_UPPER, PDO_CASE_LOWERPDO_CASE_LOWER a PDO_CASE_NATURALPDO_CASE_NATURAL.

• PDO_ATTR_ERRMODEPDO_ATTR_ERRMODE: PDO podporuje tři módy oznamování chyb, PDO_ERRMODE_EXCEPTIONPDO_ERRMODE_EXCEPTION, PDO_ERRMODE_SILENTPDO_ERRMODE_SILENT a PDO_ERRMODE_WARNINGPDO_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_EX-PDO_ERRMODE_EX-CEPTIONCEPTION. Tato volba se probírá podrobněji v pozdějším oddílu “Zpracování chyb”.

• PDO_ATTR_ORACLE_NULLSPDO_ATTR_ORACLE_NULLS: je-li nastavena na TRUETRUE, způsobí, že se budou získané prázdné řetězce převádět na NULL. Výchozí hodnota je FALSEFALSE.

• PDO_ATTR_PERSISTENTPDO_ATTR_PERSISTENT: určuje, zda je připojení trvalé. Výchozí hodnota je FALSE.

• PDO_ATTR_PREFETCHPDO_ATTR_PREFETCH: jedná se o databázovou schopnost, při které se získává několik řádků, i když klient požaduje v daném okamžiku 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ší. To snižuje počet požadavků obracejí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_TIMEOUTPDO_ATTR_TIMEOUT: tato volba nastavuje dobu v sekundách, po kterou se bude čekat, než se skončí.

Další čtyři atributy umožňují dozvědět se dodatečné informace o klientovi, serveru a o stavu připojení. Hodnoty těchto atributů lze získat metodou getAttribute()getAttribute(), která se probírá v pozdějším oddílu “Zís-kávání a nastavování atributů”.

• PDO_ATTR_SERVER_INFOPDO_ATTR_SERVER_INFO: obsahuje specifické informace o databázovém serveru. V případě My SQL 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_VERSIONPDO_ATTR_SERVER_VERSION: obsahuje informace o čísle verze databázového serveru.

• PDO_ATTR_CLIENT_VERSIONPDO_ATTR_CLIENT_VERSION: obsahuje informace o čísle verze klienta databáze.

• PDO_ATTR_CONNECTION_STATUSPDO_ATTR_CONNECTION_STATUS: obsahuje informace o stavu připojení k databázi. Například pra-cujete-li s MySQL, tak 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“.

Jakmile zřídíte připojení, můžete ho začít používat, a to je téma zbývající části kapitoly.

Page 48: Velká kniha PHP a MySQL 5

V průběhu práce s knihou jste viděli poměrně dost příkladů, v nichž se dotazy MySQL vkládaly přímo do skriptu PHP. U menších aplikací je to jistě v pořádku, jak ale slo žitost a velikost aplikací narůstá, mohlo by pokračování v takové praxi skončit až fiaskem. Například co když máte rozmístit dvě podobné aplikace, jednu desktopovou a druhou webovou, které obě používají databázi MySQL a provádějí mno-ho stejných úkolů? Když je tu a tam třeba změnit nějaký dotaz, budete muset provést patřičné modifika-ce všude, kde se daný dotaz objevuje, a to ne v jedné, ale ve dvou aplikacích!

Jinou výzvou, které čelíte, když pracujete se složitými aplikacemi, zvlášť když je vyvíjíte v týmu, je po-skytnout každému členu týmu příležitost, aby mohl přispívat ke zdaru projektu na základě svých od-borných znalostí a kvalifikace, aniž by přitom šlapal po úsilí ostatních. Typické je, že ti lidé, kteří jsou zodpovědní za vývoj databáze a údržbu (známí jako databázoví architekti), jsou neobyčejně erudovaní v psaní efektivních a bezpečných dotazů. Ale jak může takový databázový architekt psát a udržovat tyto dotazy, aniž by nelezl do zelí vývojáři aplikace, když jsou dotazy vložené přímo do kódu? Navíc, jak se může databázový architekt spolehnout na to, že vývojář následně „nezdokonalí“ tyto dotazy, a potenci-álně tím otevře dveře infiltracím v podobě útoků injektáží SQL (které spočívají v tom, že se modifikují data odesílaná do databáze se záměrem, aby se pak dal spustit nějaký škodlivý kód SQL)?

Jedním z nejběžnějších řešení těchto výzev je databázová schopnost, které se říká uložená rutina – stored routine. Uložená rutina je nějaká sada příkazů SQL, která je uložená na databázovém serveru a vyko-nává se tak, že se zavolá prostřednictvím dotazu názvem, který jí byl přiřazen. V mnohém je to obdoba funkce, protože ta také zapouzdřuje nějakou sadu příkazů, které se vykonají poté, co se funkce zavolá svým názvem. Uložená rutina se dá udržovat za bezpečnými zdmi databázového serveru a na kód apli-kace nemusíte ani sáhnout.

Od verze 5.0 už MySQL konečně podporuje tuto dlouho toužebně očekávanou schopnost. V této kapi-tole se dozvíte vše potřebné o tom, jak MySQL implementuje uložené rutiny. Probereme syntax a uvi-díte, jak se uložené rutiny vytvářejí, spravují a vykonávají. Také se naučíte začleňovat uložené rutiny do svých webových aplikací. Na začátku se však chvilku zastavme u formálnějšího souhrnu jejich výhod a nevýhod.

Uložené rutinyKapitola 31

Page 49: Velká kniha PHP a MySQL 5

Kapitola 31 – Uložené rutiny734

Měli bychom používat uložené rutiny? Není žádoucí, abyste se naslepo nadšeně vrhli do módních vln uložených rutin. Vyplatí se, když v krát-kosti posoudíme jejich přednosti a stinné stránky, zejména proto, že jejich užitečnost je v da tabázové komunitě předmětem vášnivých debat. V tomto oddílu najdete souhrn pro a proti, uvažujete-li o začle-nění uložených rutin do své vývojářské strategie.

Přednosti uložených rutin Uložené rutiny mají mnoho předností, nejvýznačnější z nich jsou zdůrazněné zde:

• Eliminuje se redundance. Když mnoho aplikací napsaných v různých jazycích vykonává stejné databázové úkoly, tak shromáždění těchto úkolů do uložených rutin podobných funkcím redu-kuje jinak běžnou redundanci vývojových procesů.

• Vyšší výkon. Kompetentní databázový administrátor je pravděpodobně ten nejkompetentnější člen týmu, když jde o to, jak psát optimalizované dotazy. Proto je rozumné, když se tvorba velmi komplikovaných operací, které se týkají databáze, přenechá tomuto individuu tím, že se takové operace udržují jako uložené rutiny.

• Větší bezpečnost. Když pracujete ve zvlášť citlivých prostředích, jako jsou bankovnictví, zdra-votnictví nebo obrana státu, je někdy oficiálně nařízeno, aby byl přístup k datům přísně restrik-tivní. Uložené rutiny nabízejí skvělý způsob, jak zajistit, aby měli vývojáři přístup jen k těm informacím, které nezbytně potřebují k řešení svých úkolů..

• Snazší údržba rozsáhlých aplikací. Přestože diskuse o výhodách vícevrstevných architektur přesahuje rámec této knihy, používání uložených procedur v součinnosti s vrstvou dat může dost usnadnit údržbu rozsáhlých aplikací. Chcete-li se o tomto tématu dozvědět víc, zadejte ve svém webovém vyhledávači termín „n-tier architecture“.

Nevýhody uložených rutin Přestože vás předchozí výčet předností přesvědčil, že jsou uložené rutiny ta cesta, kterou se vydáte, za-myslete se chvilku nad jejich nevýhodami:

• Vyšší spotřeba prostředků. Mnozí argumentují tím, že jediný účel databáze je ukládat data a udržovat relace mezi nimi, ne vykonávat kód, který by jinak vykonala aplikace. Kromě toho, že se tím narušuje jediný hlavní účel databáze, vykonávání takové logiky z databáze spotřebovává také dodatečné prostředky procesoru a paměti.

• Menší zdatnost. Jak se brzy dozvíte, jazykové konstrukce SQL nabízejí bohatou výbavu i znač-nou flexibilitu; většina vývojářů však přišla na to, že budovat tyto rutiny je snadnější i pohodlněj-ší, když se to dělá v nějakém vyspělém plnohodnotném jazyku, jakým je PHP.

• Horší udržovatelnost rutin. Přestože se dají pro správu uložených rutin používat utility s gra-fickým uživatelským rozhraním , jako je MySQL Query Browser (viz kapitola 26), psaní kódu i ladění uložených rutin je o hodně obtížnější, než když píšete funkce PHP ve zdatném integro-vaném vývojovém prostředí.

Page 50: Velká kniha PHP a MySQL 5

Velká kniha PHP a MySQL 5 735

• Obtížnější přenositelnost. Protože uložené rutiny často používají syntax, která je specifická pro danou databázi, určitě se vynoří nějaké potíže s přenositelností, budete-li potřebovat používat aplikaci v součinnosti s jiným databázovým produktem

Nuže, i potom, co jste se seznámili s výhodami i nevýhodami, možná si stále nejste jisti, zda jsou uložené rutiny pro vás to pravé. Asi nejlepší rada, kterou je možno v tomto ohledu poskytnout, je, abyste si pře-četli tuto kapitolu a podnikli všelijaké experimenty s četnými příklady, které v ní najdete.

Jak MySQL implementuje uložené rutinyPřestože se všude okolo omílá termín uložené procedury, MySQL ve skutečnosti implementuje dvě vari-anty procedur, na které se odkazuje společně jako na uložené rutiny:

• Uložené procedury. Uložené procedury podporují vykonávání příkazů SQL jako jsou SELECTSELECT, INSERTINSERT, UPDATEUPDATE a DELETEDELETE. Mohou také připravovat parametry, na které se dá odkazovat později, vně procedury.

• Uložené funkce. Uložené funkce podporují vykonávání pouze příkazů SELECTSELECT, akceptují jen vstupní parametry a musejí vracet právě jednu hodnotu. Kromě toho můžete vložit uloženou funkci přímo do příkazu SQL tak, jak to děláte se standardními funkcemi MySQL, jako jsou count()count() a date_format()date_format().

Všeobecně řečeno, uložené procedury byste měli používat tehdy, když potřebujete pracovat s daty na-cházejícími se v databázi, třeba získávat řádky, vkládat, odstraňovat nebo aktualizovat hodnoty, zatím-co s pomocí uložených funkcí byste měli s t ěmito daty manipulovat nebo provádět speciální výpočty. Syntax prezentovaná v průběhu kapitoly je ovšem pro obě varianty prakticky identická, kromě toho, že se přepíná termín „procedura“ a „funkce“. Například, příkazem DROPDROP PROCEDUREPROCEDURE název_procedurynázev_procedury se odstraní existující uložená procedura, kdežto příkazem DROPDROP FUNCTIONFUNCTION název_funkcenázev_funkce se odstraní existující uložená funkce.

Tabulky přístupových oprávnění uložených rutin Ti z vás, kdo už s MySQL nějaký čas pracujete, dobře víte, že v databázi mysql přibyly nové tabulky. Dvě z nich, procproc a procs_privprocs_priv, slouží ke správě uložených rutin a přístupových oprávnění, která se požadu-jí, chcete-li je vytvářet, vykonávat, měnit nebo odstraňovat.

proc

V tabulce procproc jsou uložené informace o uložené rutině, mezi něž pa tří její syntax, datum, kdy byla vytvořena, seznam jejích parametrů a další věci. Její strukturu prezentuje tabulka 31-1.

Tabulka 31-1. Tabulka proc databáze mysql

Sloupec Datový typ Null Výchozí hodnota

dbdb char(64)char(64) Ano Není

namename char(64)char(64) Ne Není

type type enum('FUNCTION','PROCEDURE')enum('FUNCTION','PROCEDURE') Ne Není

Page 51: Velká kniha PHP a MySQL 5

Kapitola 31 – Uložené rutiny736

Sloupec Datový typ Null Výchozí hodnota

specific_name specific_name char(64) char(64) Ne Není

language language enum('SQL') enum('SQL') Ne SQLSQL

sql_data_access sql_data_access enum přístupu k datům Ne CONTAINS_SQLCONTAINS_SQL

is_deterministicis_deterministic enum('YES', 'NO')enum('YES', 'NO') Ne NONO

security_typesecurity_type enum('INVOKER','DEFINER')enum('INVOKER','DEFINER') Ne DEFINERDEFINER

param_list param_list blob blob Ne Není

returns returns char(64) char(64) Ne Není

body body longblob longblob Ne Není

definer definer char(77) char(77) Ne Není

created created timestamp timestamp Ano CURRENT_TIMESTAMPCURRENT_TIMESTAMP

modified modified timestamp timestamp Ano 0000-00-00 00:00:00 0000-00-00 00:00:00

sql_mode sql_mode mmožina módů sql Ne Není

comment comment char(64) char(64) Ne Není

Aby nebyl sloupec tabulky pro datový typ zoufale široký, je termín enum přístupu k datůmenum přístupu k datům zástupce skutečného výčtu

enum('CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA') enum('CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA')

a termín množina módů sqlmnožina módů sql zastupuje množinu

set('REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'NOT_USED', set('REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'NOT_USED', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE'). 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE').

Všechny sloupce se podrobněji probírají v oddílu „Jak se vytvoří uložená rutina“.

procs_priv

V tabulce procs_privprocs_priv jsou uloženy informace o přístupových oprávněních vyjadřující, kteří uživatelé mohou komunikovat s rutinami definovanými v tabulce proc. Struktura tabulky procs_privprocs_priv je uvedena v tabulce 31-2.

Tabulka 31-2. Tabulka procs_priv databáze mysql Sloupec Datový typ Null Výchozí hodnotaHost Host char(60) char(60) Ne Není

Db Db char(64) char(64) Ne Není

User User char(16) char(16) Ne Není

Routine_name Routine_name char(64) char(64) Ne Není

Routine_type Routine_type enum('FUNCTION', 'PROCEDURE')enum('FUNCTION', 'PROCEDURE') Ne Není


Recommended