Velká knihy PHP 5 a MySQL

Page 1

E N C Y K L O P E D I E

Z O N E R

P R E S S

VELKÁ KNIHA

PHP 5 a MySQL kompendium znalostí pro zaćátećníky i profesionály

NOVÉ, TōE TōETÍ VYDÁNÍ TōET

W. J a s o n G i l m o r e



Velká kniha PHP 5 a MySQL Kompendium znalostí pro začátečníky i profesionály – NOVÉ, TŘETÍ VYDÁNÍ

W. Jason Gilmore


Beginning PHP and MySQL: From Novice to Professional, Fourth Edition W. Jason Gilmore Original edition copyright © 2010 by W. Jason Gilmore. Czech edition copyright © 2011 by ZONER software, a.s. All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright the publisher. Copyright originálního vydání © 2010 W. Jason Gilmore. Copyright českého vydání © 2011 ZONER software, a.s. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována nebo předávána žádnou formou nebo způsobem, elektronicky ani mechanicky, včetně fotokopií, natáčení ani žádnými jinými systémy pro ukládání bez výslovného svolení držitele autorských práv.

Velká kniha PHP 5 a MySQL (nové, třetí vydání) Autor: W. Jason Gilmore Copyright © ZONER software, a.s. Vydání třetí, v roce 2011. Všechna práva vyhrazena. Zoner Press Katalogové číslo: ZR1114 ZONER software, a.s. Nové sady 18, 602 00 Brno Překlad: RNDr. Jan Pokorný Odpovědný redaktor: Miroslav Kučera Šéfredaktor: Ing. Pavel Kristián DTP a obálka: Miroslav Kučera a Lenka Křížová Fotografie na obálce: Jana Vališová

Zdrojové soubory ke stažení: http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar

Informace, které jsou v této knize zveřejněny, mohou byt chráněny jako patent. Jména produktů byla uvedena bez záruky jejich volného použití. Při tvorbě textů a vyobrazení bylo sice postupováno s maximální péčí, ale přesto nelze zcela vyloučit možnost výskytu chyb. Vydavatelé a autoři nepřebírají právní odpovědnost ani žádnou jinou záruku za použití chybných údajů a z toho vyplývajících důsledků. Všechna práva vyhrazena. Žádná část této publikace nesmí být reprodukována ani distribuována žádným způsobem ani prostředkem, ani reprodukována v databázi či na jiném záznamovém prostředku či v jiném systému bez výslovného svolení vydavatele, s výjimkou zveřejnění krátkých částí textu pro potřeby recenzí. Veškeré dotazy týkající se distribuce směřujte na: Zoner Press ZONER software, a.s Nové sady 18, 602 00 Brno tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz

ISBN: 978-80-7413-163-9


3

Stručný obsah Kapitola 1

Úvod do PHP

27

Kapitola 2

Konfigurace prostředí

35

Kapitola 3

Základy PHP

65

Kapitola 4

Funkce

111

Kapitola 5

Pole

121

Kapitola 6

Objektově orientované PHP

149

Kapitola 7

Pokročilé schopnosti OOP

171

Kapitola 8

Obsluha chyb a výjimek

187

Kapitola 9

Řetězce a regulární výrazy

203

Kapitola 10

Práce se souborovým a s operačním systémem

239

Kapitola 11

PEAR

265

Kapitola 12

Datum a čas

275

Kapitola 13

Práce s HTML formuláři

293

Kapitola 14

Autentizace uživatelů

307

Kapitola 15

Upload souborů

323

Kapitola 16

Networking

335

Kapitola 17

PHP a LDAP

353

Kapitola 18

Obsluha relací

367

Kapitola 19

Šablony se Smarty

385

Kapitola 20

Webové služby

407

Kapitola 21

Zabezpečení webu

421

Kapitola 22

Ajax a PHP

431


4 Kapitola 23

Budování webů pro celý svět

443

Kapitola 24

Zend Framework

451

Kapitola 25

Úvod do MySQL

469

Kapitola 26

Instalace a konfigurace MySQL

477

Kapitola 27

Klienti pro MySQL

493

Kapitola 28

Ukládací enginy MySQL a datové typy

513

Kapitola 29

Zabezpečení MySQL

539

Kapitola 30

Používání PHP s MySQL

565

Kapitola 31

Úvod do PDO

585

Kapitola 32

Uložené rutiny

603

Kapitola 33

Triggery MySQL

623

Kapitola 34

Pohledy MySQL

633

Kapitola 35

Databázové dotazy v praxi

645

Kapitola 36

Indexy a vyhledávání

663

Kapitola 37

Transakce

677

Kapitola 38

Import a export dat

687

Rejstřík

701


5

Obsah O autorovi

25

O odborném recenzentovi

25

Poděkování

25

Úvod

26

Zdrojové kódy

26

Kapitola 1

Úvod do PHP

Historie

27 28

PHP 4

28

PHP 5

29

PHP 5.3

30

PHP 6

30

Všeobecné vlastnosti jazyka

31

Praktičnost

31

Vyspělost

32

Možnosti

32

Cena

33

Shrnutí

Kapitola 2

33

Konfigurace prostředí

Předběžné kroky před vlastní instalací

35 36

Stažení Apache

36

Stažení PHP

36

Stažení dokumentace

37

Instalace Apache a PHP na Linuxu

38

Instalace Apache a PHP na Windows

39

Instalace IIS a PHP na Windows

41

Otestování instalace

41

Konfigurace PHP

43

Konfigurace PHP v čase sestavování na Linuxu

43

Přizpůsobení distribuce sestavené pro Windows

44

Konfigurace při běhu

44

Správa konfiguračních direktiv PHP

44

Konfigurační direktivy PHP

46


6 Volba editoru kódu

60

Adobe Dreamweaver CS5

60

Notepad++

61

PDT (PHP Development Tools)

61

Zend Studio

61

Výběr poskytovatele webhostingu Sedm otázek potenciálnímu poskytovateli webhostingu Shrnutí

Kapitola 3

61 62 63

Základy PHP

Vkládání kódu PHP do webových stránek

65 65

Výchozí syntaxe

66

Krátké značky

66

Styl <script>

67

Styl ASP

67

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

67

Komentáře

68

Syntaxe jediného řádku z C++

68

Syntaxe shellu

68

Komentář na několika řádcích ve stylu C

68

Výstup dat do prohlížeče

69

Příkaz print()

69

Příkaz echo()

70

Příkaz printf()

71

Příkaz sprintf()

72

Datové typy podporované PHP

72

Skalární datové typy

73

Složené datové typy

74

Konverze mezi datovými typy pomocí přetypování

76

Žonglování s typy

77

Funkce vztahující se k typům

77

Funkce ověřující, zda je proměnná daného typu

78

Identifikátory

79

Proměnné

79

Deklarace proměnné

80

Obor proměnné

81

Superglobální proměnné PHP

84


7 Proměnné proměnné Konstanty

88 88

Definice konstanty Výrazy

89 89

Operandy

89

Operátory

90

Interpretace řetězců

96

Uvozovky

96

Posloupnosti řídicích znaků

96

Apostrofy

97

Složené závorky

98

Syntaxe Heredoc

98

Syntaxe Nowdoc Řídící struktury

98 99

Podmínkové příkazy

99

Příkazy pro cyklus

101

Příkazy pro vkládání souborů

107

Shrnutí

Kapitola 4

110

Funkce

111

Volání funkcí

111

Vytvoření funkce

112

Předávání argumentů hodnotou

113

Předávání argumentů odkazem

113

Výchozí hodnoty argumentů

114

Funkcionalita Type Hinting

115

Návratové hodnoty funkcí

115

Rekurzivní funkce

117

Knihovny funkcí

119

Shrnutí

120

Kapitola 5

Pole

Co je pole?

121 121

Vytvoření pole

123

Vytváření polí funkcí array()

123

Extrakce polí s konstrukcí list()

124


8 Plnění polí předdefinovaným rozsahem hodnot

125

Test, zda se jedná o pole

125

Výstup obsahu pole

126

Tisk polí pro testovací potřeby

127

Přidávání a odstraňování prvků pole

127

Přidání hodnoty před pole

127

Přidání hodnoty na konec pole

128

Odstranění hodnoty na začátku pole

128

Odstranění hodnoty z konce pole

128

Vyhledávání prvků v poli

129

Vyhledání hodnoty v poli

129

Získávání klíčů z pole

130

Získávání hodnot z pole Procházení polí

130 130

Získání aktuálního klíče z pole

131

Získání aktuální hodnoty z pole

131

Získání aktuálního klíče a hodnoty z pole

132

Posouvání ukazatele pole

132

Předávání hodnot pole do funkce Zjištění velikosti a jedinečných hodnot pole

133 134

Zjištění velikosti pole

134

Zjištění četností hodnot v poli

135

Zjištění jedinečných hodnot v poli

135

Setřídění prvků polí

136

Opačné pořadí prvků pole

136

Prohození klíčů a hodnot v poli

136

Setřídění prvků v poli

137

Zkombinování, sloučení, extrakce a porovnání polí

141

Slučování polí

141

Slučování polí s rekurzívním přidáváním polí

142

Zkombinování pole klíčů a pole hodnot do jediného pole

142

Řez z pole

143

Pole prvků odstraněných z pole

143

Průnik polí

144

Průnik asociativních polí

145

Rozdíl polí

145

Rozdíl asociativních polí

146

Další užitečné funkce pro práci s poli

146


9 Vrácení náhodné sady klíčů

146

Zamíchání prvků pole

147

Součet hodnot polí

147

Členění pole na části

147

Shrnutí

Kapitola 6

148

Objektově orientované PHP

Výhody plynoucí z OOP Zapouzdření

149 149 149

Dědění

150

Polymorfismus

150

Klíčové pojmy OOP

151

Třídy

151

Objekty

152

Vlastnosti

152

Konstanty

158

Metody

159

Konstruktory a destruktory

162

Konstruktory

163

Destruktory

165

Statické členy tříd

166

Klíčové slovo instanceof

167

Pomocné funkce

167

Vytváření aliasu pro třídu

168

Existence třídy

168

Určení kontextu objektu

168

Pole metod třídy

168

Pole vlastností třídy

168

Pole deklarovaných tříd

168

Pole vlastností objektu

169

Určení rodičovské třídy objektu

169

Existence rozhraní

169

Určení typu objektu

169

Určení typu podtřídy objektu

169

Existence metody

169

Automatické načítání objektů

170

Shrnutí

170


10 Kapitola 7

Pokročilé schopnosti OOP

171

Schopnosti OOP nepodporované v PHP

172

Klonování objektů

172

Příklad klonování Metoda __clone() Dědění

172 174 175

Dědění třídy

175

Dědění a konstruktory

177

Dědění a pozdní statické vázání Rozhraní

179 180

Implementace jediného rozhraní Implementace několika rozhraní

181 182

Abstraktní třídy

183

Úvod do jmenných prostorů

183

Shrnutí

186

Kapitola 8

Obsluha chyb a výjimek

Konfigurační direktivy

187 188

Nastavení žádané úrovně citlivosti na chyby

188

Zobrazování chyb do prohlížeče

189

Zobrazování chyb při startu

190

Protokolování chyb

190

Identifikace protokolovacího souboru

190

Nastavení maximální délky protokolu

190

Ignorování opakujících se chyb

190

Ignorování chyb pocházejících ze stejného umístění

190

Uložení nejnovější chybové zprávy do proměnné

190

Protokolování chyb

191

Inicializace výbavy PHP pro protokolování

191

Otevření připojení pro potřeby protokolování

191

Uzavření protokolovacího připojení

192

Odeslání zprávy na cíl protokolování

192

Obsluha výjimek

193

Proč je obsluha výjimek tak skvělá

193

Implementace obsluhy výjimek v PHP

195

Výjimky standardní knihovny PHP

200

Shrnutí

201


11 Kapitola 9

Řetězce a regulární výrazy

Regulární výrazy

203 204

Syntaxe regulárních výrazů ve stylu POSIX

204

Funkce PHP pro práci s regulárními výrazy – rozšířený styl POSIX

206

Funkce PHP pro regulární výrazy – ve stylu Perl

209

Funkce PHP pro práci s regulárními výrazy – kompatibilní s Perlem

212

Další funkce pro práci s řetězci

217

Určování délky řetězce

217

Porovnávání dvou řetězců

218

Manipulace s velikostmi písmen

220

Převádění řetězců do HTML a z HTML

221

Alternativy pro funkce regulárních výrazů

226

Rozklad řetězce na prvky podle předem definovaných znaků

226

Rozklad řetězce podle předem definovaného oddělovače

227

Převod pole na řetězec

227

Komplexnější rozklad řetězce

228

Nalezení posledního výskytu podřetězce v řetězci

228

Nahrazení všech výskytů řetězce jiným řetězcem

229

Získání části řetězce

230

Vrácení části řetězce na základě předem definovaného offsetu

230

Četnost výskytu podřetězce v řetězci

231

Nahrazení části řetězce jiným řetězcem

231

Doplňování a zkracování řetězce

232

Počítání znaků a slov

233

Balíček PEAR: Validate_US Instalace balíku Validate_US Jak se používá balík Validate_US Shrnutí

Kapitola 10

235 236 236 237

Práce se souborovým a s operačním systémem

Soubory a adresáře

239 240

Rozklad cest k adresářům

240

Zjišťování velikosti souboru, adresáře a disku

242

Časy posledního přístupu a modifikace Práce se soubory Pojem zdroj

244 246 246


12 Rozpoznání znaků pro nový řádek

246

Rozpoznání konce souboru

246

Otevření a uzavření souboru

247

Čtení ze souboru

249

Zapisování do souboru

255

Přesouvání ukazatele souboru

255

Čtení obsahu adresářů

256

Vykonávání příkazů shellu

257

Odstranění adresáře

257

Přejmenování souboru

258

Nastavení časů poslední modifikace a přístupu k souboru

259

Vykonávání programů na systémové úrovni

259

Dezinfekce vstupů od uživatele

259

Funkce PHP pro spouštění programů

261

Shrnutí

Kapitola 11

263

PEAR

Ukázka síly PEAR: konverze číselných formátů Instalace a aktualizace PEAR

265 266 266

Instalace PEAR

267

PEAR a hostitelské firmy

268

Aktualizace PEAR

268

Manažer balíků PEAR

268

Prohlídka nainstalovaných balíků

269

Získání dalších informací o nainstalovaném balíku

269

Instalace balíků PEAR

270

Zahrnutí balíku do skriptu

272

Upgrade balíků

272

Odinstalování balíku

273

Přechod na starší verzi balíku

273

Úvod do Pyrus

274

Instalace Pyrus Shrnutí

Kapitola 12

274 274

Datum a čas

Časové razítko Unixu

275 275


13 Knihovna PHP pro datum a čas

276

Ověřování platnosti data

276

Formátování data a času

277

Práce s časovými razítky

281

Řešení běžných úloh souvisejících s datem a časem

283

Zobrazení lokalizovaného data a času

283

Zobrazení data poslední modifikace webové stránky

287

Počet dní aktuálního měsíce

287

Počet dní specifikovaného měsíce

288

Určení data vzdáleného x dní od aktuálního data

288

Vylepšená výbava pro datum a čas v PHP 5.1

289

Konstruktor DateTime

289

Formátování data

290

Nastavení data po vytvoření instance

290

Nastavení času po vytvoření instance

290

Modifikace data a času

291

Výpočet rozdílu mezi dvěma daty

291

Shrnutí

Kapitola 13

291

Práce s HTML formuláři

PHP a webové formuláře Jednoduchý příklad Ověřování platnosti dat formuláře

293 293 294 295

Odstranění souboru

295

Skriptování přes weby

296

Desinfekce uživatelského vstupu

297

Validace a dezinfekce dat s rozšířením Filter

300

Práce s vícehodnotovými komponentami formuláře

301

Těžíme z předností PEAR: HTML_QuickForm2

303

Instalace HTML_QuickForm2

303

Vytvoření a validace jednoduchého formuláře

304

Shrnutí

Kapitola 14

306

Autentizace uživatelů

Autentizace HTTP Využití schopnosti .htaccess Apache

307 307 308


14 Autentizace prostřednictvím PHP

309

Proměnné autentizace

309

Užitečné funkce

310

Způsoby autentizace v PHP

311

Záležitosti kolem uživatelských hesel

317

Otestování síly hesla s knihovnou CrackLib

317

Jednorázová URL a obnova hesla

319

Shrnutí

Kapitola 15

321

Upload souborů

323

Nahrávání souborů přes protokol HTTP

323

Nahrávání souborů na server s PHP

324

Direktivy PHP pro nahrávání souborů a zdroje

324

Pole $_FILES

326

Funkce PHP pro nahrávání na server

326

Chybové zprávy týkající se nahrávání

328

Nahrání souboru: jednoduchý příklad

329

Využívání předností PEAR: HTTP_Upload

330

Instalace HTTP_Upload

330

Upload souboru

330

Získání dalších informací o nahraném souboru

331

Nahrávání více souborů najednou Shrnutí

Kapitola 16

332 333

Networking

DNS, služby a servery

335 336

DNS

336

Služby

340

Práce s e-mailem

342

Konfigurační direktivy

342

Odesílání e-mailů skriptem PHP

343

Běžné síťové úkoly

348

Ping na server

348

Vytvoření skeneru portů

349

Vytvoření převaděče síťových adres

350

Testování šířky pásma uživatele

351

Shrnutí

352


15 Kapitola 17

PHP a LDAP

PHP a LDAP

353 354

Konfigurace LDAP pro PHP

354

Připojení k LDAP serveru

354

Získávání dat LDAP

357

Počet získaných položek

360

Řazení LDAP záznamů

360

Vkládání dat LDAP

361

Aktualizace dat LDAP

362

Odstraňování dat LDAP

363

Manipulace s DN

364

Obsluha chyb

365

Shrnutí

Kapitola 18

366

Obsluha relací

Co je obsluha relace? Proces obsluhy relace Konfigurační direktivy

367 367 368 368

Správa média úložiště relace

369

Nastavení cesty k souborům relace

369

Zapnutí relace automaticky

369

Nastavení názvu relace

370

Volba cookies nebo přepisování URL

370

Automatizace přepisování URL

370

Nastavení doby života cookie relace

370

Nastavení platné URL cesty pro cookie relace

370

Nastavení způsobu ukládání do cache na stránkách se zapnutou relací Práce s relacemi

371 372

Odstartování relace

372

Likvidace relace

373

Nastavení a získání ID relace

373

Vytváření a odstraňování proměnných relace

373

Zakódování a dekódování dat relace

374

Obsluha relace – praktické příklady

376

Automatické přihlašování vracejících se uživatelů

376

Seznam naposledy prohlížených dokumentů

378


16 Vytváření vlastních obsluh relace Včlenění vlastních funkcí relace do logiky PHP Vlastní obsluha relace založená na MySQL Shrnutí

Kapitola 19

380 381 381 384

Šablony se Smarty

385

Šablonovací systém? Co to je?

386

Úvod do Smarty

387

Instalace Smarty

388

Pracujeme se Smarty

389

Prezentační logika Smarty

391

Komentáře

391

Modifikátory proměnné

391

Řídící struktury

394

Příkazy

398

Vytváření konfiguračních souborů

400

Metoda configLoad

401

Odkazy na konfigurační proměnné

401

Používání CSS ve spolupráci se Smarty

402

Ukládání stránek do cache

403

Doba života stránek uložených v cache

403

Eliminace režijních nákladů na zpracování s is_cached()

404

Cachování více verzí jedné šablony

404

Několik slov závěrem k ukládání do cache

405

Shrnutí

Kapitola 20

406

Webové služby

Proč webové služby? RSS (Real Simple Syndication)

407 408 409

Syntaxe RSS

410

Úvod do SimplePie

412

Instalace SimplePie

412

Rozklad souboru RSS se SimplePie

413

Rozklad více souborů RSS

414

SimpleXML Funkce SimpleXML

415 416


17 Rozklad XML

417

Shrnutí

Kapitola 21

420

Zabezpečení webu

Bezpečná konfigurace PHP Konfigurační parametry vztahující se k bezpečnosti Skrývání konfiguračních detailů

421 422 422 424

Skrývání Apache

424

Skrytí PHP

425

Skrývání citlivých dat

426

Skrytí kořenu dokumentů

426

Zamítnutí přístupu k souborům s určitými příponami

427

Šifrování dat

427

Šifrovací funkce PHP

427

MCrypt

428

Shrnutí

Kapitola 22

430

Ajax a PHP

431

Úvod do Ajaxu

431

Úvod do jQuery

433

Instalace jQuery

433

Jednoduchý příklad

433

Reakce na události

434

jQuery a DOM

435

Kontrola existence uživatelského jména

437

Skript pro kontrolu existence uživatelského jména

439

Integrace funkcionality Ajaxu

440

Shrnutí

Kapitola 23

441

Budování webů pro celý svět

Překládání webů s Gettext

443 444

Krok 1: aktualizace skriptů webu

444

Krok 2: vytvoření lokalizačního depozitáře

445

Krok 3: vytvoření překladových souborů

446

Krok 4: překlad textu

447

Krok 5: vygenerování binárních souborů

447


18 Krok 6: nastavení žádaného jazyka ve skriptech

447

Lokalizace data, čísel a času

448

Shrnutí

450

Kapitola 24

Zend Framework

Úvod do MVC

451 451

Frameworky v PHP

453

Framework CakePHP

454

Framework Solar

454

Framework symfony

454

Zend Framework

455

Úvod do Zend Frameworku

455

Instalace Zend Frameworku

456

Vytvoření prvního webu řízeného Zend Frameworkem

457

Shrnutí

Kapitola 25

467

Úvod do MySQL

Proč je MySQL tak populární?

469 469

Flexibilita

470

Výkon

470

Flexibilní licenční možnosti

472

(Hyper) aktivní komunita uživatelů

473

Evoluce MySQL

473

MySQL 4

473

MySQL 5

474

MySQL 5.1

475

MySQL 5.4 a 5.5

475

Prominentní uživatelé MySQL

475

craigslist

476

Wikipedia

476

Další prominentní uživatelé

476

Shrnutí

Kapitola 26

476

Instalace a konfigurace MySQL

477

Stažení MySQL

477

Instalace MySQL

478


19 Instalace MySQL na Linuxu

478

Instalace a konfigurace MySQL na Windows

481

Nastavení hesla administrátora MySQL

483

Start a zastavení MySQL

484

Ruční ovládání démona Konfigurace a optimalizace MySQL

484 485

Obal mysqld_safe

485

Konfigurační a optimalizační parametry MySQL

486

Soubor my.cnf

489

Konfigurace PHP pro spolupráci s MySQL

492

Překonfigurace PHP na Linuxu

492

Překonfigurace PHP na Windows

492

Shrnutí

Kapitola 27

492

Klienti pro MySQL

Klienti příkazového řádku pro MySQL

493 493

Klient mysql

493

Klient mysqladmin

503

Další užiteční klienti

505

Volby pro klienty

508

Klienti s grafickým rozhraním pro MySQL

510

MySQL Workbench

511

Nástroj phpMyAdmin

511

Shrnutí

Kapitola 28

512

Ukládací enginy MySQL a datové typy

513

Ukládací enginy

513

MyISAM

514

IBMDB2I

516

InnoDB

516

MEMORY

517

MERGE

518

FEDERATED

518

ARCHIVE

520

CSV

520

EXAMPLE

520

BLACKHOLE

520


20 Časté otázky týkající se ukládacích enginů Datové typy a atributy

521 522

Datové typy

522

Atributy datových typů

528

Práce s databázemi a s tabulkami

531

Práce s databázemi

531

Práce s tabulkami

532

Změny ve struktuře tabulky

535

Databáze INFORMATION_SCHEMA

536

Shrnutí

Kapitola 29

538

Zabezpečení MySQL

539

Co udělat nejdříve?

540

Zabezpečení démona mysqld

541

Systém přístupových oprávnění MySQL

541

Jak systém přístupových oprávnění pracuje

542

Kde jsou uloženy informace o přístupových oprávněních?

543

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

553

Vytváření uživatelů

553

Odstraňování uživatelů

553

Přejmenování uživatelů

554

Příkazy GRANT a REVOKE

554

Prohlížení oprávnění

559

Limity na spotřebu zdrojů uživateli

560

Zabezpečená připojení MySQL

560

Volby příkazu GRANT, které se týkají SSL

561

Volby SSL

563

Nastartování serveru MySQL se zapnutou podporou SSL

564

Připojení pomocí klienta se zapnutým SSL

564

Uložení voleb SSL do souboru my.cnf

564

Shrnutí

Kapitola 30

564

Používání PHP s MySQL

Předběžné informace

565 566

Zpřístupnění rozšíření mysqli na Linuxu/Unixu

566

Zpřístupnění rozšíření mysqli na Windows

566

Používání nativního ovladače MySQL

566


21 Přístupová oprávnění uživatelů

567

Ukázková data

567

Práce s rozšířením mysqli

568

Příprava připojení a jeho ukončení

568

Obsluha chyb připojení

569

Získání informací o chybě

569

Uložení informací o připojení do separátního souboru

571

Zabezpečení informací o připojení

571

Interakce s databází

572

Odeslání dotazu do databáze

572

Rozklad výsledků dotazu

574

Určení počtu vybraných řádků a ovlivněných řádků

576

Práce s připravenými příkazy

577

Vykonávání databázových transakcí

582

Zapnutí módu automatického potvrzování

582

Potvrzení transakce

583

Anulování transakce

583

Shrnutí

Kapitola 31

583

Úvod do PDO

585

Pro další abstraktní databázová vrstva?

586

Způsob práce s PDO

587

Instalace PDO

587

Podpora databází v PDO

588

Připojení k databázovému serveru a výběr databáze

588

Obsluha chyb

590

Získávání a nastavování atributů

592

Spouštění dotazů

593

Úvod k připraveným příkazům

594

Získávání dat

597

Nastavování vázaných sloupců

600

Transakce

601

Shrnutí

Kapitola 32

602

Uložené rutiny

Měli bychom používat uložené rutiny? Přednosti uložených rutin

603 604 604


22 Nevýhody uložených rutin Jak MySQL implementuje uložené rutiny

604 605

Vytvoření uložené rutiny

605

Deklarace a nastavování proměnných

608

Spuštění uložené rutiny

609

Uložené rutiny složené z několika příkazů

610

Volání rutiny z jiné rutiny

617

Modifikace uložené rutiny

618

Odstranění uložené rutiny

618

Prohlížení stavu rutiny

618

Prohlížení vytvářecí syntaxe rutiny

620

Podmínky a jejich obsluhy

620

Integrace rutin do webových aplikací

620

Vytvoření rozhraní pro bonusy zaměstnanců

621

Získávání více řádků

622

Shrnutí

Kapitola 33

622

Triggery MySQL

Úvod do triggerů

623 623

Proč používat triggery?

624

Vykonání akce před událostí

624

Vykonání akce po události

624

Triggery spouštěné "před" versus triggery spouštěné "po"

625

Podpora triggerů v MySQL

626

Vytvoření triggeru

626

Prohlížení existujících triggerů

628

Modifikace triggeru

630

Odstranění triggeru

630

Integrace triggerů do webových aplikací

631

Shrnutí

632

Kapitola 34

Pohledy MySQL

633

Úvod do pohledů

634

Podpora pohledů v MySQL

634

Vytváření a spouštění pohledů

634

Prohlížení informací o pohledu

640


23 Modifikace pohledu

641

Odstranění pohledu

642

Aktualizace pohledů

642

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

643

Shrnutí

644

Kapitola 35

Databázové dotazy v praxi

645

Ukázková data

646

Vytváření tabulkových výstupů s PEAR

646

Instalace HTML_Table

647

Vytvoření jednoduché tabulky

647

Vytváření lépe čitelného výstupu řádků

649

Vytvoření tabulky z dat databáze

649

Seřazení výstupu

651

Vytvoření stránkovaného výstupu

652

Číslování stránek výpisu

654

Dotazy na více tabulek s poddotazy

656

Porovnávací operace s poddotazy

657

Určování existence s poddotazy

657

Údržba databáze pomocí poddotazů

658

Používání poddotazů v PHP

658

Procházení sad výsledků pomocí kurzorů

659

Základy práce s kurzory

659

Vytvoření kurzoru

660

Otevření kurzoru

660

Práce s kurzorem

660

Uzavření kurzoru

661

Používání kurzorů s PHP

661

Shrnutí

Kapitola 36

662

Indexy a vyhledávání

663

Indexování databází

663

Primární klíče

664

Jedinečné indexy

665

Normální indexy

666

Fulltextové indexy

668


24 Doporučené praktiky pro práci s indexy Vyhledávání pomocí formuláře

671 672

Jednoduché hledání

672

Rozšíření vyhledávacích možností

673

Fulltextové vyhledávání

675

Shrnutí

Kapitola 37

676

Transakce

Co je transakce?

677 677

Výbava MySQL pro transakční zpracování

678

Systémové požadavky

678

Vytvoření tabulky

679

Ukázkový projekt

679

Ukázková data

680

Vykonání ukázkové transakce

681

Tipy pro práci s transakcemi Budování transakčních aplikací s PHP Směna zboží za hotové ještě jednou Shrnutí

Kapitola 38

682 683 683 685

Import a export dat

687

Ukázková tabulka

687

Oddělování údajů

688

Import dat

688

Import dat s LOAD DATA INFILE

689

Import dat s mysqlimport

692

Načítání dat do tabulky s PHP

694

Export dat Příkaz SELECT INTO OUTFILE Shrnutí

Rejtřík

695 695 699

701


25

O autorovi W. Jason Gilmore je zakladatel společnosti W. J. Gilmore, LLC (www.wjgilmore.com), což je konzultační, publikační a školící firma, která má zkušenosti s obsluhou širokého rozsahu firem, od místních, až po ty, co jsou uvedeny v seznamu Fortune 500. Problematice webového vývoje se věnuje více než deset let, je autorem celkem šesti knih včetně bestsellerů "Beginning PHP and MySQL, Third Edition", "Easy PHP Websites with the Zend Framework" a "Easy PayPal with PHP". Publikoval přes 100 odborných článků, které mj. vyšly na stránkách Developer.com, JSMag a Linux Magazine. Jason je spoluzakladatelem CodeMash, což je nezisková organizace, jejímž úkolem je pořádat stejnojmennou každoroční konferenci vývojářů. Byl také členem výboru pro výběr řečníků na 2008 MySQL Conference.

O odborném recenzentovi Matt Wade je programátor, databázový vývojář a systémový administrátor. V současné době ve dne pracuje pro velkou finanční firmu a v noci je na volné noze. Má zkušenosti s programováním v několika jazycích, ale nejčastěji využívá PHP a C. Pokud jde o databáze, pravidelně používá MySQL a Microsoft SQL Server. Je také také uznávaným administrátorem systémů a má zkušenosti s nejrůznějšími servery běžícími na Windows nebo na Linuxu. Preferuje FreeBSD. Matt žije na Floridě ve městě Jacksonville se svou ženou Michelle a se svými třemi dětmi, Matthewem, Jonathanem a Amandou. Ve svém volném čase rybaří, vypomáhá v kostele, nebo hraje nějakou videohru. Matt je zakladatelem Codewalkers.com, což je web určený vývojářům PHP, který vznikl v roce 2007.

Poděkování Rychle se blíží desáté výročí vydání mé první knihy, je to milník, který vítám s pokorou a zároveň s úžasem. Ačkoli se na obálce objevuje mé jméno, ve skutečnosti je to sdílený milník. Bez velkého úsilí opravdu nenahraditelné skupiny lidí by nebylo příliš reálné, aby tato kniha vydržela celou dekádu. Komentáře plné nápadů mého dlouholetého odborného korektora Matt Wadea opět nesmírně zdokonalily předkládaný materiál. Projektová manažerka Jennifer Blackwellová odvedla skvělou práci tím, že mě držela na správné cestě a neustále kontrolovala silně napjatý rozvrh prací. Editoři Tom Welsh a Michelle Lowman dohlíželi ostřížím zrakem na kapitoly a průběžně poskytovali cenné rady. Korektorka Mary Behrová zručně pochytala a opravila mé četné gramatické prohřešky. Uznání patří také významnému počtu dalších osob, které měly na starost produkci, marketing, prodej a nesčetné další povinnosti, aby mohla tato kniha spatřit světlo světa. Jako vždy bych rád poděkoval Gary Cornellovi, spoluzakladateli vydavatelství Apress, že mi poskytoval dlouhá léta příležitost prezentovat myšlenky v psané podobě. Těším se na dalších skvělých deset let. Nakonec bych chtěl poděkovat Carli, Jodi, Paulovi, Ruby, svým rodičům a samozřejmě i všem ostatním členům rodiny a mým přátelům, že díky nim vím, že pravý život je tam venku, daleko od klávesnice.


26

Úvod Skvělé knihy o programování se spíše zabývají praktickými problémy než čistou teorií. Přestože nepodléhám žádným iluzím, co se týče mého postavení mezi skvělými autory odborných knih naší doby, vždy jsem usiloval, abych psal ve zmíněném duchu a poskytoval takový materiál, který budete moci využít v praxi pro své vlastní potřeby. Vzhledem k vymezenému objemu knihy je také zřejmé, že jsem se snažil z každého probíraného předmětu vymačkat praktičnost až do poslední kapky. Pokud tedy potřebujete získat praktický vhled do programovacího jazyka PHP a databázového serveru MySQL (se zvláštním důrazem na to, jak s oběma produkty vytvářet dynamické webové aplikace řízené databázemi), je tato kniha určena právě vám. Popudem k novému vydání této knihy (poznámka redaktora: v rukou držíte přeložené 4. vydání anglického originálu) vedlo především horečnaté tempo prací komunit PHP a MySQL. Kromě toho, že jsme aktualizovali materiál v knize tak, aby zahrnoval schopnosti nacházející se v nejnovějších vydáních PHP a MySQL, najdete zde také novou kapitolu, ve které se seznámíte s pojmem AJAX a s populární knihovnou jQuery JavaScriptu. Kromě toho byly všechny existující kapitoly pečlivě zrevidovány a v některých případech i značně modifikovány tak, aby se jejich materiál oproti předchozím vydání aktualizoval a zároveň vylepšil. Pokud s PHP teprve začínáte, vřele vám doporučuji, abyste začali s kapitolou 1, protože je dost pravděpodobné, že ze základních vědomostí, které zde prvně získáte, budete moci hodně těžit v dalších kapitolách. Jestliže už PHP znáte, ale databázi MySQL moc ne, zvažte, zda byste neměli raději začít kapitolou 25. Pokročilejší čtenáře vybízím, aby četli knihu podle svého uvážewní – koneckonců, není to žádný milostný román. Bez ohledu na to, jakou strategii při četbě zvolíte, pokusil jsem se každou kapitolu rozškatulkovat na úhledné balíčky tak, abyste z ní mohli vytěžit co nejvíc, aniž byste museli předtím zvládnout všechny ostatní kapitoly (samozřejmě kromě těch, které se soustřeďují na základy dané technologie). I nově příchozí a příležitostní vývojáři PHP a MySQL z této knihy leccos získají, protože jsem ji záměrně napsal v takovém formátu, aby mohla být současně návodem i referenční příručkou. Oceňuji skutečnost, že jste vy, nebo váš zaměstnavatel investovali do této knihy nemalé peníze. Proto jsem se usiloval, abych probíranou látku prezentoval v takovém stylu, aby vám tato kniha byla prospěšná nejenom při několika prvních příležitostech, kdy ji pročítáte, ale i dlouhodobě.

Zdrojové kódy Zdrojové kódy k ukázkám použitým v této knize naleznete zde: http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar


65

KAPITOLA 3 Základy PHP Máme za sebou pouhé dvě kapitoly a už jsme probrali poměrně dost základních informací o jazyku PHP. Seznámili jste se s pozadím a historií vzniku jazyka a hluboko jste se zavrtali do pojmů a postupů souvisejících s instalací a konfigurací. Tím jste si vytvořili dobrou výchozí pozici k tomu, co je jádrem zbývající části knihy: vytváření vyspělých webů řízených PHP. Jejich výklad začíná právě teď a uvedeme si v něm mnoho základních schopností jazyka. Konkrétně se budou probírat tato témata: Jak se vkládá kód PHP do webových stránek. Jak se do kódu vkládají komentáře pomocí různých metodologií, které jsou vy-

půjčeny ze skriptování shellu Unixu a jazyků C a C++. Jak dostanete data na výstup prostřednictvím příkazů echo(), print(), printf() a sprintf(). Jak se vytvářejí sofistikované skripty pomocí typů dat PHP, proměnných, operá-

torů a příkazů.  Pojednání o klíčových řídících strukturách a příkazech PHP: if-else-elseif, while, foreach, include/require, break, continue a declare.

V této kapitole si osvojíte nejen vědomosti nezbytné k tomu, abyste mohli vytvářet sice jen základní, ale přesto prospěšné aplikace PHP. Pochopíte také věci, které vám umožní vytěžit co nejvíce z látky probírané v následujících kapitolách. POZNÁMKA Tato kapitola slouží simultánně jako výukový kurz pro začínající programátory a jako referenční příručka pro zkušené programátory, pro které je jazyk PHP nový. Pokud spadáte do první uvedené kategorie, měli byste asi kapitolu pročíst celou a vyzkoušet si také všechny zde uvedené příklady.

Vkládání kódu PHP do webových stránek Jednou z předností PHP je, že jeho kód můžete vkládat přímo do statických stránek HTML. Aby ale kód mohl něco dělat, musí se stránka předat enginu PHP, který ji bude


66

Kapitola 3 – Základy PHP

interpretovat. Webový server ovšem nepředává každou stránku – předává jen stránky identifikované jistou příponou souboru (typicky .php), což je přesně definováno instrukcemi zmiňovanými v kapitole 2. Při interpretaci kódu by ale bylo hodně neefektivní, kdyby se měl každý řádek brát jako potenciální příkaz PHP. Proto engine potřebuje nějaké prostředky, aby mohl okamžitě určit, které oblasti na stránce představují kód PHP. Toho se logicky docílí tím, že se kód PHP oddělí a existují čtyři varianty, jak to lze udělat.

Výchozí syntaxe Výchozí syntaxe oddělení kódu začíná znaky <?php a končí znaky ?>, jako zde: <h3>Vítejte!</h3> <?php print "<p>Tohle je ukázka PHP.</p>"; ?> <p>Zde se nacházejí nějaké statické informace...</p>

Uložíte-li kód uvedený výše jako test.php a zavoláte ho z nějakého webového serveru, který má zapnutou podporu PHP, uvidíte výstup jako na obrázku 3-1:

Obrázek 3-1 Ukázka výstupu PHP.

Krátké značky Pro lenochy je k dispozici ještě kratší syntaxe oddělovačů. Říká se jí krátký styl značek (short-tags). Obejde se bez reference php, kterou vyžaduje výchozí syntaxe. Chcete-li ale používat krátké značky, musíte nejprve zapnout direktivu short_open_tag PHP. Zde je ukázka této syntaxe: <? print "Tohle je další ukázka PHP."; ?>


Velká kniha PHP 5 a MySQL

67

UPOZORNĚNÍ Přestože jsou krátké značky praktické, nepoužívejte je, pokud vytváříte software řízený PHP, který chcete redistribuovat. Tato schopnost by totiž mohla být vypnutá v souboru php.ini.

Když je zapnutý styl krátkých značek a potřebujete v PHP rychle něco vypsat, lze vynechat patřičné PHP příkazy pro výstup a využít variantu výstupu známou jako zkrácená výstupní syntaxe (short-circuit syntax): <?="Tohle je další ukázka PHP.";?>

Což je funkčně ekvivalentní oběma následujícím variantám: <? print "Tohle je další ukázka PHP."; ?> <? php print "Tohle je další ukázka PHP";?>

Styl <script> Z historických příčin měly některé editory potíže rozpoznat, že se s těmito variantami syntaxe obracíte na PHP. Proto byla do jazyka PHP začleněna ještě jedna varianta oddělovací syntaxe používající <script>: <script language="php"> print "Tohle je další ukázka PHP."; </script>

Styl ASP Dynamické stránky ASP od společnosti Microsoft používají obdobnou strategii. Také oddělují statickou syntaxi od dynamické prostřednictvím předem definovaných znaků. Dynamická syntaxe se uvozuje znaky <% a ukončuje znaky %>. Přicházíte-li z krajiny ASP a už jenom ze zvyku chcete používat tuto syntaxi, PHP ji podporuje. Podívejte se na ukázku: <% print "Tohle je další ukázka PHP."; %>

Mějte ale na paměti, že pokud něco dělat můžete, neznamená to, že byste to tak měli dělat. Oddělovací varianty ve stylu ASP a <script> se v praxi používají jen výjimečně a měli byste se jim vyhýbat, pokud nemáte opravdu pádný důvod je používat. UPOZORNĚNÍ

Od PHP 5.3 už není syntaxe ve stylu ASP k dispozici.

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


Kapitola 3 – Základy PHP

68

<head><title><?php echo "Vítejte na mém webu!";?></title> </head> <body> <?php $date = "11. dubna 2011"; ?> <h3>Dnes je <?=$date;?></h3> </body> </html>

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

Komentáře Zdůraznit, jak moc je důležité, abyste prokládali kód pečlivými komentáři, není nikdy zbytečné. PHP pro komentáře nabízí několik syntaktických variant, které si nyní popíšeme.

Syntaxe jediného řádku z C++ Pro komentář často stačí jediný řádek. Protože je komentář krátký, není třeba ho ukončovat speciálním ukončovacím oddělovačem, protože tuto roli uspokojivě zvládne znak pro nový řádek (\n). PHP podporuje jednořádkové komentáře ve stylu C++, které jsou uvozeny dvěma lomítky (//), jako zde: <?php // Titulek: Můj první skript PHP // Autor: Jason Gilmore print "Tohle je program PHP"; ?>

Syntaxe shellu PHP také podporuje alternativu k syntaxi ve stylu C++, které se říká syntaxe shellu. Komentář je uvozen znakem hash (#). Předchozí ukázka pak vypadá takto: <?php # Titulek: Můj první skript PHP # Autor: Jason Gilmore print "Tohle je program PHP"; ?>

Komentář na několika řádcích ve stylu C Často je žádoucí vložit obšírnější popis, jak daná část kódu funguje, nebo jiné poznámky ke kódu. Takové vysvětlení se obvykle na jediný řádek nevejde. Přestože můžete postupovat tak, že byste každý řádek komen-


Velká kniha PHP 5 a MySQL

69

táře zahájili oddělovačem ve stylu C++ nebo shellu, PHP nabízí mnohem praktičtější variantu s uvozovacím a ukončovacím oddělovačem komentáře. Následující ukázka mluví sama za sebe: <?php /* Zpracovává platby PayPal Tento skript má na starost zpracování platby zákazníka přes PayPal. Přebírá informace o kreditní kartě zákazníka a platební adrese Copyright 2010 W.J. Gilmore, LLC. */ ?>

Pokročilá dokumentace s PHPDOCUMENTOR Protože dokumentace tvoří důležitou část procesu efektivního vytváření kódu a jeho správy, bylo vynaloženo hodně úsilí, aby se našlo dobré řešení, které by opravdu pomáhalo vývojářům tento proces automatizovat. A skutečně, v současné době jsou už k dispozici pokročilá dokumentační řešení pro všechny mainstreamové programovací jazyky, včetně PHP. Nástroj s názvem phpDocumentor (www.phpdoc.org) je open-source projekt, který usnadňuje proces dokumentace tím, že převádí komentáře vložené do zdrojového kódu do různých snadno čitelných formátů, mezi něž patří HTML a PDF. Nástroj phpDocumentor pracuje tak, že analyzuje zdrojový kód aplikace a hledá v něm speciální komentáře známé jako DocBlocks. DocBlocks se používají ke zdokumentování veškerého kódu uvnitř aplikace, včetně skriptů, tříd, funkcí, proměnných a dalších prvků, obsahují lidem srozumitelná vysvětlení spolu s formalizovanými deskriptory, jako jsou jméno autora, verze kódu, prohlášení o copyrightu, návratové hodnoty funkcí a mnoho dalších věcí. I když jste úplně začínající programátor, vřele se doporučuje, abyste se obeznámili s pokročilými dokumentačními řešeními a zvyknuli si je standardně používat i v jednoduchých aplikacích.

Výstup dat do prohlížeče Je samozřejmé, že i nejjednodušší dynamické weby potřebují nějaký výstup dat do prohlížeče. PHP pro tyto účely nabízí několik způsobů, jak to udělat. POZNÁMKA Když v průběhu této kapitoly nebo někde jinde v knize uvádím nějaké funkce, odkazuji se na jejich prototyp. Prototyp je prostě definice funkce, která formalizuje její název, vstupní parametry a datový typ návratové hodnoty. Jestliže nevíte, co je datový typ, podívejte se do sekce "Datové typy podporované PHP" později v této kapitole.

Příkaz print() Příkaz print() vypíše data, která se do něho předají. Jeho prototyp je následující: boolean print(argument)

Všechny následující příkazy jsou platnými příkazy print():


70

Kapitola 3 – Základy PHP

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

Všechny tyto příkazy vyprodukují identický výstup: Zbožňuji léto.

POZNÁMKA Přestože nás oficiální syntaxe vybízí, abychom argument dávali do závorek, máte možnost je vynechat, protože print() vlastně není funkce – je to jazyková konstrukce. Mnozí programátoři je neuvádějí prostě proto, že cílový argument je zřejmý i bez nich.

Návratová hodnota příkazu print() je zavádějící, protože je vždy 1, bez ohledu na výsledek (ovšem jediné, co tento příkaz dělá, nic jiného jsem s tímto příkazem nikdy nezažil, je odeslání požadovaného výstupu do prohlížeče). Liší se od chování většiny funkcí v tom smyslu, že jejich návratová hodnota často slouží jako indikátor, zdali se funkce vykonala tak, jak se očekávalo.

Příkaz echo() Příkaz echo funguje obdobně jako print, ale se dvěma odlišnostmi, které jsou ale pro většinu čtenářů zcela nezajímavé, takže se zde jimi zabývat nebudeme. Prototyp příkazu echo() vypadá takto: void echo(string argument1 [, ...string argumentN])

Chcete-li použít příkaz echo(), použijte argument stejným způsobem jako u print(): echo "Zbožňuji léto.";

Jak je vidět z prototypu, echo umí vypsat několik řetězců. Užitečnost této konkrétní vymoženosti je problematická, vypadá, že je to více než cokoli jiného pouze otázka osobních preferencí. Nicméně tato vymoženost je k dispozici, pokud pocítíte neodolatelnou potřebu ji použít. Tady máte ukázku: <?php $heavyweight = "Lennox Lewis"; $lightweight = "Floyd Mayweather"; echo $heavyweight, " a ", $lightweight, " jsou skvělí bojovníci."; ?>


239

KAPITOLA 10 Práce se souborovým a s operačním systémem V současnosti se jen vzácně vytvářejí aplikace, které by byly zcela soběstačné (tj. programy, které by se nespoléhaly na nějakou úroveň interakce s externími zdroji, jako je třeba podkladový souborový a operační systém). Důvod je zcela prostý: jak postupně dozrávaly programovací jazyky, souborové systémy a operační systémy, značně vzrostly možnosti pro vytváření mnohem efektivnějších, škálovatelných a dobře časovaných aplikací, protože vývojáři mohli integrovat osvědčené schopnosti všech těchto komponent do jediného produktu. Vtip samozřejmě spočívá v tom, zvolit nějaký takový jazyk, který k tomu nabízí příhodné a účinné prostředky. PHP naštěstí splňuje obě podmínky velmi pěkně. Nabízí programátorům báječnou paletu nástrojů nejenom pro zpracování vstupních a výstupních operací týkajících se souborového systému, ale také pro vykonávání programů na úrovni shellu. Tato devátá kapitola slouží jako úvod do celé této funkcionality a probírají se v ní následující témata:  Soubory a adresáře. Zde se naučíte zacházet se souborovým systémem. Dozví-

te se, jak o něm získávat všelijaké podrobnosti, jako je velikost souborů a adresářů, čas poslední modifikace a posledního přístupu a další věci.  Vstupní a výstupní operace se soubory. Zde se naučíte komunikovat se soubo-

ry dat, takže pak budete moci provádět řadu praktických úloh, mezi něž patří vytváření a odstraňování souborů, čtení ze souborů a zapisování do nich.  Obsah adresářů. Zde se dozvíte, jak snadno se dá získat obsah adresářů.  Příkazy shellu. Z PHP můžete prostřednictvím řady zabudovaných funkcí

a mechanismů využívat funkcionalitu operačního systému i jiných jazyků.  Ověřování vstupů. Zde se předvádí výbava PHP pro ověřování vstupů od uži-

vatelů. Dozvíte se, jak uživatelům zabránit v tom, aby předávali taková data, která by případně mohla poškodit vaše data nebo operační systém. POZNÁMKA PHP je obzvlášť zdatný při práci s podkladovým souborovým systémem, takže si získal značnou popularitu jako interpret příkazového řádku (tato schopnost přišla s verzí 4.2.0). Protože se ovšem jedná o téma, které značně přesahuje rámec této knihy, vyhledejte si o něm dodatečné informace v manuálu PHP.


240

Kapitola 10 – Práce se souborovým a s operačním systémem

Soubory a adresáře Uspořádávání provázaných dat do entit, kterým se běžně říká soubory a adresáře, je v počítačovém prostředí už dlouhá léta klíčový pojem. Proto musí programátor často získávat důležité podrobnosti o souborech a adresářích, jako jsou umístění, velikost, čas poslední modifikace a čas posledního přístupu. V tomto oddílu se popisují mnohé ze zabudovaných funkcí PHP, s nimiž se dají tyto důležité podrobnosti získávat.

Rozklad cest k adresářům Často je prospěšné, když rozložíte cestu k adresáři na různé atributy, jako jsou koncová přípona, samotná cesta nebo samotný název souboru. K řešení takových úloh je k dispozici několik funkcí, jejichž popis následuje.

Získání názvu souboru z cesty Funkce basename() vrátí z cesty název souboru. Má prototyp: string basename (string path [, string suffix])

Je-li uveden nepovinný parametr suffix, vynechá se z vraceného názvu souboru specifikovaná přípona, pokud ji soubor obsahuje. Jednoduchá ukázka: <?php $path = "/home/www/data/users.txt"; printf("Název souboru: %s <br />", basename($path)); printf("Název souboru bez přípony: %s <br />", basename($path, ".txt")); ?>

Příklad vyprodukuje tento výstup: Název souboru: users.txt Název souboru bez přípony: users

Získání adresáře z cesty Funkce dirname() je v podstatě protějškem basename(). Vrací cestu ze zadaného parametru path. Má prototyp: string dirname (string path)

Následující kód získá adresář vedoucí k souboru s názvem users.txt: <?php $path = "/home/www/data/users.txt"; printf("Adresář: %s", dirname($path)); ?>

Vrátí se: Adresář: /home/www/data


Velká kniha PHP 5 a MySQL

241

Další informace o cestách Funkce pathinfo() vytvoří asociativní pole obsahující čtyři komponenty cesty specifikované parametrem path: název adresáře, celý název souboru, přípona a název souboru bez přípony. Má prototyp: array pathinfo(string path [, options])

Mějme tuto cestu: /home/www/htdocs/book/chapter10/index.html

Funkce pathinfo() zpracuje tuto cestu do čtyř následujících komponent:  Název adresáře (dirname): /home/www/htdocs/book/chapter10  Celý název souboru (basename): index.html  Přípona názvu souboru (extension): html  Název souboru (filename): index

Funkci pathinfo() můžete pro získání uvedených informací použít třeba takto: <?php $pathinfo = pathinfo("/home/www/htdocs/book/chapter10/index.html"); printf("Název adresáře: %s <br />", $pathinfo['dirname']); printf("Celý název souboru: %s <br />", $pathinfo['basename']); printf("Přípona: %s <br />", $pathinfo['extension']); printf("Název souboru bez přípony: %s <br />", $pathinfo['filename']); ?>

Vrátí se: Název adresáře: /home/www/htdocs/book/chapter10 Název souboru: index.html Přípona: html: Název souboru bez přípony: index

Nepovinným parametrem $options můžete modifikovat, které ze čtyř podporovaných atributů se budou vracet. Nastavíte-li ho například na PATHINFO_FILENAME, naplní se ve vraceném poli pouze atribut filename (název souboru bez přípony). Kompletní seznam podporovaných hodnot $options naleznete v oficiální dokumentaci k PHP.

Identifikace absolutní cesty Funkce realpath() převede všechny symbolické odkazy (symbolic links) a odkazy na relativní cesty (relative path references) umístěné v path na jejich absolutní protějšky. Má tento prototyp: string realpath (string path)

Předpokládejme například, že struktura adresářů vypadá takto: /home/www/htdocs/book/images/

Pak můžete použít realpath() pro vyřešení libovolných odkazů na místní cesty:


242

Kapitola 10 – Práce se souborovým a s operačním systémem

<?php $imgPath = "../../images/cover.gif"; $absolutePath = realpath($imgPath); // Vrátí /www/htdocs/book/images/cover.gif ?>

Zjišťování velikosti souboru, adresáře a disku Zjistit velikost souboru, adresáře, nebo disku? To je běžný úkol v aplikacích všeho druhu. V tomto oddílu se seznámíte s četnými standardními funkcemi PHP, které byly navrženy pro tento účel.

Zjištění velikosti souboru Funkce filesize() vrátí velikost souboru v bajtech. Má prototyp: int filesize (string filename)

Ukázka: <?php $file = "/www/htdocs/book/chapter1.pdf"; $bytes = filesize("$file"); $kilobytes = round($bytes/1024, 2); printf("Soubor %s má $bytes bajtů, neboli %.2f kilobajtů", basename($file), $kilobytes);

Vrátí se následující výstup: Soubor chapter1.pdf má 91815 bajtů, neboli 89.66 kilobajtů

Výpočet volného místa na disku Funkce disk_free_space() vrátí dostupné volné místo (v bajtech) té diskové oblasti (partition), která hostuje specifikovaný adresář. Má prototyp: float disk_free_space (string directory)

Ukázka: <?php $drive = "C:"; printf("Na jednotce %s zbývá volných %.2f MB", $drive, round((disk_free_space($drive) / 1048576), 2)); ?>

Vrátí: Na jednotce C: zbývá volných 32412.85 MB

Připomínám, že v tomto případě je vrácené číslo v megabajtech (MB), protože návratová hodnota disk_ free_space() se vydělila číslem 1 048 576, což je počet bajtů jednoho MB.


Velká kniha PHP 5 a MySQL

243

Výpočet celkové velikosti disku Funkce disk_total_space() vrátí celkovou velikost (v bajtech) té diskové oblasti (partition), která hostuje specifikovaný adresář. Má prototyp: float disk_total_space (string directory)

Použijete-li funkci v součinnosti s funkcí sdisk_free_space(), snadno se dostanete k užitečným statistikám o alokaci prostoru: <?php $partition = "C:"; // Určí celkovou velikost oblasti $totalSpace = disk_total_space($partition) / 1048576; // Určí používaný prostor specifikované oblasti $usedSpace = $totalSpace - disk_free_space($partition) / 1048576; printf("Oblast: %s (Alokováno: %.2f MB. Používá se: %.2f MB.)", $partition, $totalSpace, $usedSpace);} ?>

Vrátí se: Oblast: C: (Alokováno: 97299.93 MB. Používá se: 64887.13 MB.)

Zjištění velikosti adresáře PHP v současné době nenabízí standardní funkci, která by vrátila celkovou velikost adresáře. Přitom je to ale úloha, která se požaduje mnohem častěji než zjistit celkovou velikost disku (viz disk_total_space() v předchozím oddílu). Můžete sice na systémové úrovni zavolat unixový příkaz du pomocí exec() nebo system(), obě probereme později v oddílu "Funkce PHP pro spouštění programů", ale funkce tohoto druhu jsou často z bezpečnostních příčin vypnuté. Alternativním řešením je napsat vlastní funkci PHP. Zdá se, že k tomuto účelu bude vhodná nějaká rekurzivní funkce. Jedno z možných řešení vidíte ve výpisu 10-1. POZNÁMKA Unixový příkaz du shrnuje informace o tom, jak soubor nebo adresář využívá disk. Další informace o něm najdete v manuálu.

Výpis 10-1. Zjištění velikosti obsahu adresáře. <?php function directorySize($directory) { $directorySize=0; // Otevře adresář a přečte jeho obsah. if ($dh = @opendir($directory))


Kapitola 10 – Práce se souborovým a s operačním systémem

244 {

// Iteruje přes všechny položky adresáře. while (($filename = readdir ($dh))) { // Odfiltruje nežádoucí položky adresáře. if ($filename != "." && $filename != "..") { // Máme soubor, takže určíme jeho velikost a přičteme k celku. if (is_file($directory."/".$filename)) $directorySize += filesize($directory."/".$filename); // Nový adresář, takže zahájíme rekurzi. if (is_dir($directory."/".$filename)) $directorySize += directorySize($directory."/".$filename); } } } @closedir($dh); return $directorySize; } $directory = "/usr/book/chapter10/"; $totalSize = round((directorySize($directory) / 1024), 2); echo "Adresář $directory: ". $totalSize. " MB." ?>

Když skript vykonáte, vypíše se toto: Adresář /usr/book/chapter10/: 2.12 MB

Časy posledního přístupu a modifikace Možnost určit čas posledního přístupu k souboru, nebo čas, kdy byl soubor naposled modifikován, hraje důležitou roli při mnoha administračních úlohách, speciálně ve webových aplikacích, v nichž se provádějí intenzivní síťové operace nebo aktualizační operace intenzívně využívající CPU. PHP nabízí celkem tři funkce, jejichž prostřednictvím se dá zjistit poslední přístup k souboru, kdy byl soubor vytvořen a kdy byl naposled modifikován. Jejich popis následuje.

Zjištění času posledního přístupu k souboru Funkce fileatime() vrátí čas posledního přístupu k souboru s názvem filename ve formátu časového razítka Unixu. Při chybě vrátí FALSE. Má prototyp: int fileatime (string filename)


585

KAPITOLA 31 Úvod do PDO Zatímco všechny mainstreamové databáze ve větší nebo menší míře respektují standard SQL, rozhraní, na nichž jsou programátoři závislí, pokud chtěji komunikovat s databází, mohou být značně odlišná (a to dokonce i tehdy, když jsou dotazy z valné části stejné). Proto bývají aplikace téměř vždy svázány s nějakou konkrétní databází, čímž nutí uživatele, aby si také nainstalovali a pracovali s požadovanou databází, i když je méně vyspělá než jiná řešení, která jsou už ve formě používána. Předpokládejme například, že vaše organizace, jejíž IT systém a aplikace fungují na MySQL, uvažuje o koupi nové aplikace, která pro svůj běh vyžaduje databázi Oracle. Odhodláte se investovat značné prostředky, které bude nutno vynaložit, abyste se dostali na takovou úroveň vědomostí o Oracle, že ji budete moci provozovat v nějakém pro organizaci klíčovém prostředí a nasazovat a udržovat tuto databázi v průběhu života aplikace? Aby se programátoři mohli s těmito dilematy nějak vypořádat, začali vyvíjet abstraktní databázové vrstvy s cílem oddělit logiku aplikace od logiky komunikace s databází. Když se všechny příkazy, které souvisejí s databází, mohou prohnat nějakým zevšeobecněným rozhraním, může daná aplikace používat jedno z několika různých databázových řešení, za předpokladu, že daná databáze podporuje schopnosti, které aplikace vyžaduje a že příslušná abstraktní vrstva nabízí ovladač, který je kompatibilní s danou databází. Graficky je tento proces znázorněn na obrázku 23-1.

Obrázek 31-1. Abstraktní databázová vrstva.


586

Kapitola 31 – Úvod do PDO

Zde je seznam několika rozšířenějších implementací tohoto konceptu: MDB2. MDB2 je databázová abstraktní vrstva, která je napsána v PHP a která je k dispozici jako balík

PEAR. (Další informace o PEAR viz kapitola 11.) V současné době podporuje databáze FrontBase, InterBase, MySQL, Oracle, ODBC, PostgreSQL, QuerySim a SQLite. JDBC. Jak už název implikuje, standard Java Database Connectivity (JDBC) umožňuje programá-

torům Javy komunikovat s libovolnou databází, pro kterou je k dispozici ovladač JDBC. Patří sem například Microsoft SQL Server, MySQL, Oracle a PostgreSQL. ODBC. Rozhraní Open Database Connectivity (ODBC) je v současnosti jedna z nejrozšířenějších

abstraktních implementací, podporuje ji široká škála aplikací a jazyků, včetně PHP. Rozhraní ODBC podporuje všechny mainstreamové databáze, včetně těch, co jsou uvedeny v seznamu JDBC výše.  Perl DBI. Modul Perl Database Interface je standardizovaný prostředek Perlu pro komunikaci s data-

bází. Sloužil jako inspirace při tvorbě balíku DB PHP. Protože PHP nabízí MDB2 a podporuje ODBC, může se zdát, že vaše potřeby z hlediska databázové abstrakce jsou vyřešeny, pokud vyvíjíte aplikace řízené PHP, není-liž pravda? I když jsou tato a mnohá jiná řešení hotová a okamžitě po ruce, už nějakou dobu je k dispozici ještě lepší řešení, které bylo oficiálně vydáno s PHP 5.1. Jak můžete odhadnout podle názvu této kapitoly, jedná se o abstraktní vrstvu PDO (PHP Data Objects).

Pro další abstraktní databázová vrstva? S tím, jak PDO v posledních dvou letech dozrával, se objevila spousta nepěkných řečí od vývojářů, kteří byli buď zainteresováni ve vývoji nějakých jiných databázových abstraktních vrstev, nebo příliš soustředěni pouze na schopností databázové abstraktní vrstvy PDO místo toho, aby se raději zaměřili na celou sadu nabízených schopností. A skutečně, PDO poslouží jako ideální náhrada balíku MDB2 PEAR a obdobných řešení. Nicméně PDO je ve skutečnosti mnohem dále a není to jen pouhá další databázová abstraktní vrstva:  Konzistentní kódování. Protože většina z databázových rozšíření, která jsou k dispozici pro PHP, byla

vytvářena přispěvovateli, kteří se k tomu tak nějak "nachomýtli", neexistuje jednotnost v kódování, navzdory faktu, že všechna tato rozšíření nabízejí v zásadě stejné schopnosti. PDO ale tuto nejednotnost odstraňuje, protože nabízí jediné rozhraní, které je jednotné bez ohledu na to, o jakou databázi se jedná. Rozšíření je navíc rozděleno do dvou zřetelně vymezených komponent, takže jádro PDO obsahuje většinu kódu specifického pro PHP. To vede k tomu, že jednotlivé ovladače se mohou soustředit výhradně na manipulaci s daty. Vývojáři PDO také využili svých vědomostí a zkušeností při budování různých databázových rozšíření z posledních let. Co se osvědčilo, to jednoduše zařadili a současně si dávali pečlivý pozor, aby do PDO nezařazovali něco, co se v praxi neprosadilo. Ačkoliv několik jistých nejednotností ještě přetrvává, z valné části jsou databázové schopnosti abstrahovány velmi pěkně.  Flexibilita. Protože PDO načítá potřebný databázový ovladač až při běhu, není potřeba překonfigu-

rovat a překompilovat PHP pokaždé, když se používá jiná databáze. Pokud potřebujete náhle přejít z Oracle na MySQL, prostě jen načtěte ovladač PDO_MYSQL (jak se to udělá, o tom více později).  Objektově orientované schopnosti. PDO využívá objektově orientovaných schopností PHP, což vede

k vyspělejšímu a efektivnějšímu přístupu k databázové komunikaci, než jaký používala dřívější řešení.  Výkon. PDO je napsaný v jazyce C a zakompilován do PHP, což samo o sobě (budou-li všechny ostat-

ní faktory rovnocenné) poskytuje značný nárůst výkonu oproti řešením napsaným v PHP. Vzhledem k těmto přednostem se nabízí otázka, proč to nezkusit? V této kapitole se dostatečně obeznámíte s PDO a s myriádami schopností, které tato abstraktní databázová vrstva nabízí.


Velká kniha PHP 5 a MySQL

587

Způsob práce s PDO PDO se až pozoruhodně podobá všem databázovým rozšířením, která PHP už dlouhou dobu podporuje. Takže pokud jste již někdy používali PHP v součinnosti s nějakou databází, měla by vám látka prezentovaná v tomto oddílu připadat důvěrně známá. Jak už bylo zmíněno, PDO byl vybudován tím stylem, že jeho tvůrci měli stále před očima nejlepší schopnosti mnoha předchozích databázových rozšíření, takže není divu, že v jeho metodách pravděpodobně najdete značné podobnosti s tím, co už znáte. Oddíl zahájíme stručným přehledem procesu instalace PDO, poté bude následovat přehled databázových serverů, které se momentálně podporují. Ve všech příkladech této kapitoly budeme používat následující tabulku MySQL: CREATE TABLE products ( id INT NOT NULL AUTO_INCREMENT, sku CHAR(8) NOT NULL, title VARCHAR(100) NOT NULL, PRIMARY KEY(id) );

Předpokládá se dále, že tabulka už obsahuje výrobky uvedené v tabulce 31-1. Tabulka 31-1. Vzorek dat o výrobcích. id

sku

title

1

ZP457321

Painless Aftershave

2

TY232278

AquaSmooth Toothpaste

3

PO988932

HeadsFree Shampoo

4

KL334899

WhiskerWrecker Razors

Instalace PDO Od verze PHP 5.1 je rozšíření PDO standardně zapnuté, nicméně ovladač MySQL PDO nikoliv. Ačkoliv je možné instalovat PDO a potřebné PDO ovladače jako sdílené moduly, nejsnazší je sestavit PDO a ovladače staticky. Jakmile s tím budete hotovi, nebudete už muset dělat žádné změny vztahující se ke konfiguraci. Protože se momentálně zajímáte pouze o ovladač MySQL PDO, stačí předat indikátor --with-pdo-mysql, když konfigurujete PHP. Pracujete-li s PHP 5.1 nebo novější verzí na platformě Windows, je potřeba přidat odkazy na rozšíření a ovladače PDO v souboru php.ini. Pokud chcete zapnout podporu pro MySQL, jednoduše přidejte do sekce Windows Extensions dva následující řádky: extension=php_pdo.dll extension=php_pdo_mysql.dll

A jako vždy, nezapomeňte restartovat Apache, aby změny v php.ini začaly účinkovat.


588

Kapitola 31 – Úvod do PDO

Podpora databází v PDO Když jsem psal tyto řádky, PDO podporoval poměrně hodně databází kromě, všech těch, které jsou přístupné přes DBLIB a ODBC:  4D. Přístupná přes ovladač PDO_4D.  Firebird/Interbase 6. Přístupná přes ovladač PDO_FIREBIRD.  IBM DB2. Přístupná přes ovladač PDO_IBM.  Informix. Přístupná přes ovladač PDO_INFORMIX.  Microsoft SQL Server. Přístupná přes ovladač PDO_DBLIB.  MySQL. Přístupná přes ovladač PDO_MYSQL. ODBC. Přístupná přes ovladač ODBC. ODBC není databáze sama o sobě, ale umožňuje použití PDO

v součinnosti s libovolnou databází kompatibilní s ODBC, která není uvedena v tomto seznamu.  Oracle. Přístupná přes ovladač PDO_OCI. Podporují se Oracle verze 8 až 11g.  PostgreSQL. Přístupná přes ovladač PGSQL.  SQLite 3.X. Přístupná přes ovladač SQLITE.

TIP Které ovladače PDO máte dostupné ve svém prostředí? Zobrazte si v prohlížeči výstup z phpinfo() a podívejte se do sekce PDO. Nebo zavolejte funkci pdo_drivers(), třeba <?php print_r(pdo_drivers()); ?>.

Připojení k databázovému serveru a výběr databáze Než můžete začít komunikovat s databází přes PDO, musíte zřídit připojení k serveru a vybrat databázi. Udělá se to konstruktorem PDO. Jeho prototyp vypadá takto: PDO PDO::__construct(string DSN [, string username [, string password [, array driver_opts]]])

Parametr DSN (Data Source Name) se skládá ze dvou prvků: z názvu požadovaného databázového ovladače a všech nezbytných proměnných databázových připojení (jako jsou název hostitele, port a název databáze). Parametry username a password specifikují uživatelské jméno a heslo, které se použijí při připojení k databázi. A konečně, pole driver_opts specifikuje jakékoli další volby, které by se mohly požadovat nebo jsou žádoucí pro připojení. Seznam dostupných voleb je uveden na konci tohoto oddílu. Konstruktor lze volat několika způsoby, které si teď uvedeme.

Vložení parametrů do konstruktoru Nejsnáze se připojíte k databázi tak, že prostě vložíte parametry pro připojení přímo do konstruktoru. Například byste ho mohli zavolat třeba takto (jedná se konkrétně o databázi MySQL): $dbh = new PDO('mysql:host=localhost;dbname=chp31', 'webuser', 'secret');


Velká kniha PHP 5 a MySQL

589

Umístění parametrů do souboru PDO využívá schopnost PHP pracovat s proudy, což otevírá možnost umístit řetězec DSN do samostatného souboru, který bude na nějakém místním nebo vzdáleném umístění. Na něj se pak odkážete v konstruktoru, viz následující ukázka: $dbh = new PDO('uri:file://usr/local/mysql.dsn');

Je ale potřeba zajistit, aby soubor vlastnil stejný uživatel, který vykonává skript PHP a aby tento uživatel měl udělena patřičná přístupová oprávnění.

Odkaz na soubor php.ini Informace o DSN je také možné udržovat v souboru php.ini, když je přiřadíte do konfiguračního parametru pdo.dsn.aliasname, kde aliasname je zvolený alias pro DSN, který následně dodáte do konstruktoru. Například v následující ukázce je alias DSN mysqlpdo: [PDO] pdo.dsn.mysqlpdo = 'mysql:dbname=chp31;host=localhost'

Alias pak následně uvedete ve volání konstruktoru PDO, jako zde: $dbh = new PDO('mysqlpdo', 'webuser', 'secret');

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

Volby PDO vztahující se k připojení Existuje několik voleb vztahujících se k připojení, jimiž můžete připojení přizpůsobit svým potřebám. Předávají se v poli driver_opts. Dostupné volby jsou uvedené v následujícím výčtu: PDO::ATTR_AUTOCOMMIT. Určuje, zda bude PDO potvrzovat změny hned po vykonání každého dota-

zu, nebo zda bude čekat, až se vykoná metoda commit(). PDO::ATTR_CASE. PDO můžete donutit, aby převáděl získané názvy sloupců na samá velká nebo

malá písmena, nebo aby používal názvy sloupců přesně v tom tvaru, v jakém jsou v databázi. Volba se nastavuje na jednu ze tří hodnot: PDO::CASE_UPPER, PDO::CASE_LOWER a PDO::CASE_NATURAL. PDO::ATTR_EMULATE_PREPARES. Zapnutím této volby umožníte připraveným příkazům využívat ca-

che dotazů MySQL. PDO::ATTR_ERRMODE. PDO podporuje tři módy oznamování chyb, PDO::ERRMODE_EXCEPTION, PDO::ERRMODE_SILENT a PDO::ERRMODE_WARNING. Určují, za jakých okolností PDO oznámí chybu. Volba se nastavuje na jednu ze tří výše uvedených hodnot, výchozí chování je PDO::ERRMODE_EXCEPTION. Tato volba se probírá podrobněji v pozdějším oddílu "Obsluha chyb". PDO::ATTR_ORACLE_NULLS. Je-li nastavena na TRUE, způsobí, že se budou získané prázdné řetězce převádět na NULL. Výchozí hodnota je FALSE. PDO::ATTR_PERSISTENT. Určuje, zda je připojení trvalé. Výchozí hodnota je FALSE. PDO::ATTR_PREFETCH. Jedná se o databázovou schopnost, při které se získává několik řádků, i když

klient v daném okamžiku požaduje jen jeden řádek, a to na základě filozofie, že pokud klient požádal o jeden řádek, je pravděpodobné, že bude postupně žádat ještě o další. Snižuje počet požadavků obra-


Kapitola 31 – Úvod do PDO

590

cejících se na databázi a zvyšuje efektivitu. Volba nastavuje velikost získávané sady v kilobajtech u těch ovladačů, které tuto schopnost podporují. PDO::ATTR_TIMEOUT. Tato volba nastavuje dobu v sekundách, po kterou se bude čekat, než se skončí. PDO::DEFAULT_FETCH_MODE. Nastavuje výchozí mód získávání (asociativní pole, indexovaná pole

nebo objekty). Pokud tedy dáváte pravidelně přednost jednomu z nich, můžete ušetřit pár úhozů. Další čtyři atributy umožňují dozvědět se dodatečné informace o klientovi, serveru a o stavu připojení. Hodnoty těchto atributů lze získat metodou getAttribute(), která se probírá v pozdějším oddílu "Získávání a nastavování atributů". PDO::ATTR_SERVER_INFO. Obsahuje specifické informace o databázovém serveru. V případě data-

báze MySQL jsou to data vztahující se k době provozu serveru, kolik bylo celkem dotazů, průměrný počet vykonaných dotazů za sekundu a další důležité informace. PDO::ATTR_SERVER_VERSION. Obsahuje informace o čísle verze databázového serveru. PDO::ATTR_CLIENT_VERSION. Obsahuje informace o čísle verze klienta databáze. PDO::ATTR_CONNECTION_STATUS. Obsahuje informace o stavu připojení k databázi. Pokud napří-

klad pracujete s MySQL, po úspěšném připojení atribut obsahuje "localhost via TCP/IP", zatímco při práci s PostgreSQL obsahuje "Connection OK; waiting to send".

Obsluha chyb při připojení Když dojde k chybě při pokusu o připojení, skript okamžitě skončí, pokud řádně nezachytíte vrácený objekt PDOException. S využitím syntaxe pro obsluhu výjimek (další informace viz kapitola 8) to jde snadno. Následující příklad ukazuje, jak zachytíte výjimku, když se při připojení vyskytne nějaký problém: <?php try { $dbh = new PDO('mysql:host=localhost;dbname=chp31', 'webuser', 'secret'); } catch (PDOException $exception) { echo "Chyba při připojení: " . $exception->getMessage(); } ?>

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

Obsluha chyb PDO nabízí tři chybové módy, takže si můžete přizpůsobit, jak má rozšíření obsluhovat vzniklé chyby: PDO::ERRMODE_EXCEPTION. Vygeneruje výjimku pomocí třídy PDOException, vykonávání skriptu

se okamžitě zastaví a nabídnou se informace vztahující se k zjištěné závadě. PDO::ERRMODE_SILENT. Když dojde k chybě, nedělá nic a ponechává na vývojáři, aby sám kontrolo-

val chyby a určil, co se s nimi má dělat. Je to výchozí nastavení. PDO::ERRMODE_WARNING. Dojde-li k nějaké chybě při práci s rozšířením PDO, vyprodukuje se zpráva

PHP E_WARNING. Chcete-li nastavit chybový mód, stačí zavolat metodu setAttribute(), jako zde:


Velká kniha PHP 5 a MySQL

591

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

K dispozici jsou také dvě metody, s nimiž se dají získávat informace o chybě. Jejich popis následuje.

Získání chybových kódů SQL Standard SQL nabízí seznam diagnostických kódů, jimiž se signalizuje, jak dopadly dotazy SQL. Jsou více známy jako kódy SQLSTATE. Když na webu budete hledat "SQLSTATE codes", naleznete seznam těchto kódů a jejich význam. Metodou errorCode() se dá vrátit standardní kód SQLSTATE, který pak můžete uložit do nějakého protokolu nebo na jeho základě vyprodukovat své vlastní chybové zprávy. Má prototyp: int PDOStatement::errorCode()

Následující skript se například pokusí vložit nový výrobek, ale omylem se odkáže na název tabulky jednotným číslem, tedy na product místo správného názvu products: <?php try { $dbh = new PDO('mysql:host=localhost;dbname=chp31', 'webuser', 'secret'); } catch (PDOException $exception) { printf("Chyba při připojení: %s", $exception->getMessage()); } $query = "INSERT INTO product (id, sku, title) VALUES(NULL, 'SS873221', 'Surly Soap') "; $dbh->exec($query); echo $dbh->errorCode(); ?>

Skript by měl vyprodukovat kód 42S02, který odpovídá zprávě MySQL, že tabulka neexistuje. Tato zpráva samotná toho ovšem moc neříká, takže se určitě budete zajímat o metodu errorInfo() uvedenou dále.

Získání chybových zpráv SQL Metoda errorInfo() vyprodukuje pole informací o chybě, která se vztahuje k naposledy vykonávané databázové operaci. Má prototyp: array PDOStatement::errorInfo()

Pole se skládá ze tří hodnot. Na každou z nich se odkazuje číselným indexem, od 0 do 2: 0. Uloží kód SQLSTATE tak, jak je definovaný ve standardu SQL. 1. Uloží chybový kód specifický pro daný databázový ovladač. 2. Uloží chybovou zprávu specifickou pro daný databázový ovladač.


W. Jason Gilmore

PHP 5 a MySQL kompendium znalostí pro začátečníky i pokročilé Velká kniha PHP 5 a MySQL (nové, třetí vydání) je určena všem webovým tvůrcům a programátorům (a to i těm příležitostným), kteří se zajímají o prakticky pojatý a vyčerpávající pohled do PHP 5 a MySQL, se zvláštním důrazem na to, jak s těmito produkty vytvářet dynamické webové aplikace. Pokud jste začátečník v PHP, tato kniha vám pomůže získat všechny nezbytné základy, což mj. zahrnuje konfiguraci prostředí, seznámení se syntaxí PHP, práci s funkcemi, poli a regulárními výrazy, obsluhu chyb a výjimek atd. Pokud patříte mezi zkušenější programátory, jistě vám přijdou vhod pokročilejší témata, jako je obsluha relací, autentizace uživatelů, LDAP, zabezpečení webu, Ajax, Smarty, webové služby a spousta dalších. Tuto knihu by ale nebylo možné označit za vyčerpávající, pokud by v ní chyběly informace o MySQL, populárním databázovém serveru. Problematice MySQL je věnováno 14 kapitol a popisovaná témata sahají od instalace a konfigurace MySQL přes popis ukládacích enginů, zabezpečení MySQL či používání PHP a MySQL až k záležitostem souvisejícím s uloženými rutinami, triggery, pohledy, indexy či transakcemi.

ZONER software, a.s. významný producent softwaru v oblasti digitální fotogra¿e, poþítaþové gra¿ky a multimédií, poskytovatel internetových služeb, souvisejících s prezentací na internetu a e-komercí, a nakladatelství odborné literatury.

Seznam kapitol: x x x x x x x x x x x x x x x x x x x

Úvod do PHP Konfigurace prostředí Základy PHP Funkce Pole Objektově orientované PHP Pokročilé schopnosti OOP Obsluha chyb a výjimek Řetězce a regulární výrazy Práce se souborovým a s operačním systémem PEAR Datum a čas Práce s HTML formuláři Autentizace uživatelů Upload souborů Networking PHP a LDAP Obsluha relací Šablony se Smarty

x x x x x x x x x x x x x x x x x x x

Webové služby Zabezpečení webu Ajax a PHP Budování webů pro celý svět Zend Framework Úvod do MySQL Instalace a konfigurace MySQL Klienti pro MySQL Ukládací enginy MySQL a datové typy Zabezpečení MySQL Používání PHP s MySQL Úvod do PDO Uložené rutiny Triggery MySQL Pohledy MySQL Databázové dotazy v praxi Indexy a vyhledávání Transakce Import a export dat

www.zoner.cz

Zdrojové soubory ke stažení:

E N C Y K L O P E D I E

Z O N E R

P R E S S

Pod tímto logem vycházejí publikace určené pro každého vážného zájemce o práci s počítačem. Od ryze praktických příruček a průvodců až po komplexní publikace o všem, co potřebuje grafik, webdesignér, vývojář či programátor při každodenní práci. Na slevy, které můžete získat, a vydavatelský plán, v němž vedle knih domácích odborníků najdete celou řadu titulů světově uznávaných autorů, se informujte na adrese vydavatelství.

© Foto: Jana Vališová

http://zonerpress.cz/download/velka-kniha-php5-treti-vydani.rar

DOPORUČENÁ CENA: 699 KČ KATALOGOVÉ ČÍSLO: ZR1114

ISBN 978-80-7413-163-9

Zoner Press tel.: 532 190 883 e-mail: knihy@zoner.cz www.zonerpress.cz ZONER software, a.s., Nové sady 18, 602 00 Brno

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


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.