Tải bản đầy đủ (.pdf) (953 trang)

Apress beginning PHP and MySQL 5 from novice to professional

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (17.59 MB, 953 trang )

Beginning PHP
and MySQL 5
From Novice to Professional,
Second Edition
■■■
W. Jason Gilmore
Gilmore_552-1Front.fm Page i Wednesday, December 21, 2005 3:05 PM
Beginning PHP and MySQL 5: From Novice to Professional, Second Edition
Copyright © 2006 by W. Jason Gilmore
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 owner and the publisher.
ISBN-13 (pbk): 978-1-59059-552-7
ISBN-10 (pbk): 1-59059-552-1
Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1
Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence
of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark
owner, with no intention of infringement of the trademark.
Lead Editor: Matthew Moodie
Technical Reviewer: Matthew Wade
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore,
Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser
Project Managers: Laura Cheu, Beth Christmas
Copy Edit Manager: Nicole LeClerc
Copy Editor: Bill McManus
Assistant Production Director: Kari Brooks-Copony
Production Editor: Laura Cheu
Compositor: Susan Glinert Stevens
Proofreader: Nancy Sixsmith
Indexer: John Collin


Cover Designer: Kurt Krames
Manufacturing Director: Tom Debolski
Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor,
New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail , or
visit .
For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA
94710. Phone 510-549-5930, fax 510-549-5939, e-mail , or visit .
The information in this book is distributed on an “as is” basis, without warranty. Although every precaution
has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to
any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly
by the information contained in this work.
The source code for this book is available to readers at in the Source Code section.
Gilmore_552-1Front.fm Page ii Wednesday, December 21, 2005 3:05 PM
This book is dedicated to the memory of Dr. Giovanni “Nino” Sanzi (1929–2004).
Addio, caro amico.
Gilmore_552-1Front.fm Page iii Wednesday, December 21, 2005 3:05 PM
Gilmore_552-1Front.fm Page iv Wednesday, December 21, 2005 3:05 PM
v
Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
■CHAPTER 1 An Introduction to PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
■CHAPTER 2 Installing and Configuring Apache and PHP . . . . . . . . . . . . . . . . . . . . . 9
■CHAPTER 3 PHP Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
■CHAPTER 4 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
■CHAPTER 5 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
■CHAPTER 6 Object-Oriented PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
■CHAPTER 7 Advanced OOP Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

■CHAPTER 8 Error and Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
■CHAPTER 9 Strings and Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
■CHAPTER 10 Working with the File and Operating System . . . . . . . . . . . . . . . . . 229
■CHAPTER 11 PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
■CHAPTER 12 Date and Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
■CHAPTER 13 Forms and Navigational Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
■CHAPTER 14 Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
■CHAPTER 15 Handling File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
■CHAPTER 16 Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
■CHAPTER 17 PHP and LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
■CHAPTER 18 Session Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
■CHAPTER 19 Templating with Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
■CHAPTER 20 Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
■CHAPTER 21 Secure PHP Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
■CHAPTER 22 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
■CHAPTER 23 Introducing PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Gilmore_552-1Front.fm Page v Wednesday, December 21, 2005 3:05 PM
vi
■CONTENTS AT A GLANCE
■CHAPTER 24 Introducing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
■CHAPTER 25 Installing and Configuring MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
■CHAPTER 26 The Many MySQL Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
■CHAPTER 27 MySQL Storage Engines and Datatypes . . . . . . . . . . . . . . . . . . . . . . 631
■CHAPTER 28 Securing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
■CHAPTER 29 PHP’s MySQL Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
■CHAPTER 30 PHP’s mysqli Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
■CHAPTER 31 Stored Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
■CHAPTER 32 MySQL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
■CHAPTER 33 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
■CHAPTER 34 Practical Database Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793

■CHAPTER 35 Indexes and Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
■CHAPTER 36 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 831
■CHAPTER 37 Importing and Exporting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Gilmore_552-1Front.fm Page vi Wednesday, December 21, 2005 3:05 PM
vii
Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
■CHAPTER 1 An Introduction to PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
General Language Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Practicality. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Power. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Possibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Price . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
■CHAPTER 2 Installing and Configuring Apache and PHP . . . . . . . . . . . . . . 9
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Obtaining the Distributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
The Installation Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Testing Your Installation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Customizing the Unix Build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Customizing the Windows Build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Common Pitfalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Viewing and Downloading the Documentation . . . . . . . . . . . . . . . . . 19

Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Managing PHP’s Configuration Directives . . . . . . . . . . . . . . . . . . . . . 20
PHP’s Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Contents
Gilmore_552-1Front.fm Page vii Wednesday, December 21, 2005 3:05 PM
viii
■CONTENTS
■CHAPTER 3 PHP Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Escaping to PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Default Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Short-Tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
ASP-Style. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Embedding Multiple Code Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Single-line C++ Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Shell Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Multiple-Line C Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
print() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
echo() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
printf(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
sprintf(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Scalar Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Compound Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Special Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Type Casting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Type Juggling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Type-Related Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Type Identifier Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Variable Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Variable Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
PHP’s Superglobal Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Variable Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
String Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Double Quotes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Single Quotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Heredoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Gilmore_552-1Front.fm Page viii Wednesday, December 21, 2005 3:05 PM
■CONTENTS
ix
Control Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Execution Control Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Looping Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
File Inclusion Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
■CHAPTER 4 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Invoking a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Creating a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Passing Arguments by Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Passing Arguments by Reference. . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Default Argument Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Optional Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Returning Values from a Function. . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Nesting Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Recursive Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Variable Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Function Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
■CHAPTER 5 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
What Is an Array? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Outputting Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Creating an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Testing for an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Adding and Removing Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Locating Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Traversing Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Determining Array Size and Uniqueness . . . . . . . . . . . . . . . . . . . . . . . . . 116
Sorting Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Merging, Slicing, Splicing, and Dissecting Arrays . . . . . . . . . . . . . . . . . . 124
Other Useful Array Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Gilmore_552-1Front.fm Page ix Wednesday, December 21, 2005 3:05 PM
x
■CONTENTS
■CHAPTER 6 Object-Oriented PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The Benefits of OOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Key OOP Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Objects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
__set() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Type Hinting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Constructors and Destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Static Class Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
The instanceof Keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Helper Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Autoloading Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
■CHAPTER 7 Advanced OOP Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Advanced OOP Features Not Supported by PHP . . . . . . . . . . . . . . . . . . . 157
Object Cloning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Cloning Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
The __clone() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Class Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Inheritance and Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Implementing a Single Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Implementing Multiple Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Gilmore_552-1Front.fm Page x Wednesday, December 21, 2005 3:05 PM
■CONTENTS

xi
Reflection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Writing the ReflectionClass Class . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Writing the ReflectionMethod Class . . . . . . . . . . . . . . . . . . . . . . . . . 172
Writing the ReflectionParameter Class. . . . . . . . . . . . . . . . . . . . . . . 174
Writing the ReflectionProperty Class . . . . . . . . . . . . . . . . . . . . . . . . 175
Other Reflection Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
■CHAPTER 8 Error and Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Error Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Why Exception Handling Is Handy. . . . . . . . . . . . . . . . . . . . . . . . . . . 183
PHP’s Exception-Handling Implementation . . . . . . . . . . . . . . . . . . . 185
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
■CHAPTER 9 Strings and Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . 191
Complex (Curly) Offset Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Regular Expression Syntax (POSIX). . . . . . . . . . . . . . . . . . . . . . . . . . 193
PHP’s Regular Expression Functions (POSIX Extended) . . . . . . . . . 195
Regular Expression Syntax (Perl Style). . . . . . . . . . . . . . . . . . . . . . . 198
Other String-Specific Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Determining the Length of a String . . . . . . . . . . . . . . . . . . . . . . . . . 205
Comparing Two Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Manipulating String Case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Converting Strings to and from HTML . . . . . . . . . . . . . . . . . . . . . . . 209
Alternatives for Regular Expression Functions . . . . . . . . . . . . . . . . 214
Padding and Stripping a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Counting Characters and Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Taking Advantage of PEAR: Validate_US . . . . . . . . . . . . . . . . . . . . . . . . . 226

Installing Validate_US. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Using Validate_US . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Gilmore_552-1Front.fm Page xi Wednesday, December 21, 2005 3:05 PM
xii
■CONTENTS
■CHAPTER 10 Working with the File and Operating System . . . . . . . . . . . 229
Learning About Files and Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
Parsing Directory Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
File Types and Links. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Calculating File, Directory, and Disk Sizes . . . . . . . . . . . . . . . . . . . 235
Access and Modification Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
File Ownership and Permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
File I/O . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
The Concept of a Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Newline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
End-of-File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Opening and Closing a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Reading from a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Moving the File Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Writing to a File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Reading Directory Contents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Executing Shell Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
PHP’s Built-in System Commands . . . . . . . . . . . . . . . . . . . . . . . . . . 252
System-Level Program Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Sanitizing the Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
PHP’s Program Execution Functions. . . . . . . . . . . . . . . . . . . . . . . . . 255
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
■CHAPTER 11 PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Popular PEAR Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

Converting Numeral Formats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Installing and Updating PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Installing PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
PEAR and Hosting Companies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Updating PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Using the PEAR Package Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Viewing Installed Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Learning More About an Installed Package . . . . . . . . . . . . . . . . . . . 265
Installing a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Using a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Upgrading a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Uninstalling a Package. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Downgrading a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Gilmore_552-1Front.fm Page xii Wednesday, December 21, 2005 3:05 PM
■CONTENTS
xiii
■CHAPTER 12 Date and Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
The Unix Timestamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
PHP’s Date and Time Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Date Fu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
Displaying the Localized Date and Time . . . . . . . . . . . . . . . . . . . . . 279
Displaying the Web Page’s Most Recent Modification Date . . . . . 283
Determining the Number Days in the Current Month . . . . . . . . . . . 283
Calculating the Date X Days from the Present Date . . . . . . . . . . . . 284
Creating a Calendar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
PHP 5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Date Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
The Date Constructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Accessors and Mutators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

Validators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Manipulation Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
■CHAPTER 13 Forms and Navigational Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
PHP and Web Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
A Simple Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Passing Form Data to a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Working with Multivalued Form Components . . . . . . . . . . . . . . . . . 307
Generating Forms with PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Autoselecting Forms Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
PHP, Web Forms, and JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Navigational Cues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
User-Friendly URLs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Breadcrumb Trails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Creating Custom Error Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
■CHAPTER 14 Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
HTTP Authentication Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
PHP Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Authentication Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Authentication Methodologies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Gilmore_552-1Front.fm Page xiii Wednesday, December 21, 2005 3:05 PM
xiv
■CONTENTS
User Login Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Password Designation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Testing Password Guessability with the CrackLib Library . . . . . . . 339
One-Time URLs and Password Recovery. . . . . . . . . . . . . . . . . . . . . 341
■CHAPTER 15 Handling File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Uploading Files via the HTTP Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

Handling Uploads with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
PHP’s File Upload/Resource Directives . . . . . . . . . . . . . . . . . . . . . . 346
The $_FILES Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
PHP’s File-Upload Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Upload Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
File-Upload Examples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Taking Advantage of PEAR: HTTP_Upload . . . . . . . . . . . . . . . . . . . . . . . . 355
Installing HTTP_Upload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Learning More About an Uploaded File . . . . . . . . . . . . . . . . . . . . . . 355
Moving an Uploaded File to the Final Destination. . . . . . . . . . . . . . 356
Uploading Multiple Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
■CHAPTER 16 Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
DNS, Services, and Servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Establishing Socket Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Configuration Directives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Sending a Plain-Text E-Mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Sending an E-Mail with Additional Headers. . . . . . . . . . . . . . . . . . . 369
Sending an E-Mail to Multiple Recipients . . . . . . . . . . . . . . . . . . . . 369
Sending an HTML-Formatted E-Mail . . . . . . . . . . . . . . . . . . . . . . . . 370
Sending an Attachment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
IMAP, POP3, and NNTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Establishing and Closing a Connection . . . . . . . . . . . . . . . . . . . . . . 374
Learning More About Mailboxes and Mail . . . . . . . . . . . . . . . . . . . . 375
Gilmore_552-1Front.fm Page xiv Wednesday, December 21, 2005 3:05 PM
■CONTENTS

xv
Retrieving Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Composing a Message. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Sending a Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Mailbox Administration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Message Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Stream Wrappers and Contexts . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Stream Filters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Common Networking Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Pinging a Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
A Port Scanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Subnet Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Testing User Bandwidth. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
■CHAPTER 17 PHP and LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
An Introduction to LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Learning More About LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 400
Using LDAP from PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Connecting to the LDAP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Binding to the LDAP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Closing the LDAP Server Connection . . . . . . . . . . . . . . . . . . . . . . . . 403
Retrieving LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Working with Entry Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405
Counting Retrieved Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Retrieving Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Sorting and Comparing LDAP Entries. . . . . . . . . . . . . . . . . . . . . . . . 410
Working with Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412
Deallocating Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Inserting LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415

Updating LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Deleting LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
Configuration Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Character Encoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Working with the Distinguished Name . . . . . . . . . . . . . . . . . . . . . . . 421
Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Gilmore_552-1Front.fm Page xv Wednesday, December 21, 2005 3:05 PM
xvi
■CONTENTS
■CHAPTER 18 Session Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
What Is Session Handling? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
URL Rewriting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
The Session-Handling Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Key Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Starting a Session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432
Destroying a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433
Retrieving and Setting the Session ID . . . . . . . . . . . . . . . . . . . . . . . 434
Creating and Deleting Session Variables . . . . . . . . . . . . . . . . . . . . . 434
Encoding and Decoding Session Data . . . . . . . . . . . . . . . . . . . . . . . 435
Practical Session-Handling Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Auto-Login. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Recently Viewed Document Index. . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Creating Custom Session Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Tying Custom Session Functions into PHP’s Logic . . . . . . . . . . . . . 442
Custom MySQL-Based Session Handlers . . . . . . . . . . . . . . . . . . . . 442
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
■CHAPTER 19 Templating with Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447

What’s a Templating Engine? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Introducing Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Installing Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Using Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Smarty’s Presentational Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Variable Modifiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Control Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Creating Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
config_load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Referencing Configuration Variables . . . . . . . . . . . . . . . . . . . . . . . . 466
Using CSS in Conjunction with Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . 467
Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Working with the Cache Lifetime . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Eliminating Processing Overhead with is_cached() . . . . . . . . . . . . 469
Creating Multiple Caches per Template. . . . . . . . . . . . . . . . . . . . . . 470
Some Final Words About Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Gilmore_552-1Front.fm Page xvi Wednesday, December 21, 2005 3:05 PM
■CONTENTS
xvii
■CHAPTER 20 Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Why Web Services? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Real Simple Syndication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
RSS Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
MagpieRSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
SimpleXML Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486
SimpleXML Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488

SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
NuSOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492
PHP 5’s SOAP Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Using a C# Client with a PHP Web Service . . . . . . . . . . . . . . . . . . . . . . . 512
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
■CHAPTER 21 Secure PHP Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
Configuring PHP Securely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Safe Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516
Other Security-Related Configuration Parameters . . . . . . . . . . . . . 518
Hiding Configuration Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Hiding Apache and PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Hiding Sensitive Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522
Take Heed of the Document Root. . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Denying Access to Certain File Extensions . . . . . . . . . . . . . . . . . . . 523
Sanitizing User Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
File Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Cross-Site Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
Sanitizing User Input: The Solution. . . . . . . . . . . . . . . . . . . . . . . . . . 526
Data Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
PHP’s Encryption Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
mhash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
MCrypt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
■CHAPTER 22 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Introduction to SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Installing SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Using the SQLite Command-Line Interface . . . . . . . . . . . . . . . . . . . 536
Gilmore_552-1Front.fm Page xvii Wednesday, December 21, 2005 3:05 PM
xviii
■CONTENTS

PHP’s SQLite Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
SQLite Directives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
Opening a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 538
Creating a Table in Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Closing a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Querying a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Parsing Result Sets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Retrieving Result Set Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544
Manipulating the Result Set Pointer . . . . . . . . . . . . . . . . . . . . . . . . . 546
Learning More About Table Schemas . . . . . . . . . . . . . . . . . . . . . . . 548
Working with Binary Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Creating and Overriding SQLite Functions . . . . . . . . . . . . . . . . . . . . 550
Creating Aggregate Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
■CHAPTER 23 Introducing PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Another Database Abstraction Layer? . . . . . . . . . . . . . . . . . . . . . . . . . . . 556
Using PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
Installing PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
PDO’s Database Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558
Connecting to a Database Server and Selecting a Database. . . . . 559
Getting and Setting Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Query Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Prepared Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Retrieving Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Setting Bound Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
■CHAPTER 24 Introducing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
What Makes MySQL So Popular? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573

Flexibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Power. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Flexible Licensing Options. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
A (Hyper) Active User Community. . . . . . . . . . . . . . . . . . . . . . . . . . . 577
MySQL 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
MySQL 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
Gilmore_552-1Front.fm Page xviii Wednesday, December 21, 2005 3:05 PM
■CONTENTS
xix
Prominent MySQL Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
craigslist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Yahoo! Finance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Wikipedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
■CHAPTER 25 Installing and Configuring MySQL . . . . . . . . . . . . . . . . . . . . . . . 581
PHP and MySQL Licensing Issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582
Downloading MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Installing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588
Set the MySQL Administrator Password . . . . . . . . . . . . . . . . . . . . . . . . . 591
Starting and Stopping MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Controlling the Daemon Manually. . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Starting and Stopping MySQL Automatically. . . . . . . . . . . . . . . . . . 594
Configuring and Optimizing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
mysqld_safe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Configuration and Optimization Parameters . . . . . . . . . . . . . . . . . . 597
The my.cnf File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
■CHAPTER 26 The Many MySQL Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Standard Client Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Connection Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608
General Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
mysql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Key mysql Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Using mysql in Interactive Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Viewing Configuration Variables and System Status . . . . . . . . . . . 614
Using mysql in Batch Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
Useful mysql Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616
mysqladmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
mysqladmin Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 619
Gilmore_552-1Front.fm Page xix Wednesday, December 21, 2005 3:05 PM
xx
■CONTENTS
The Other Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
mysqldump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
mysqlshow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
mysqlhotcopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
mysqlimport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
myisamchk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
mysqlcheck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
Third-Party Client Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
MySQL Administrator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624
phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
MySQL Query Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Navicat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
■CHAPTER 27 MySQL Storage Engines and Datatypes . . . . . . . . . . . . . . . . . 631

Storage Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
MEMORY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
BDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
FEDERATED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
ARCHIVE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638
CSV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
EXAMPLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
BLACKHOLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Storage Engine FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Datatypes and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Datatype Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 648
Working with Databases and Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Working with Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
Working with Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653
Altering a Table Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
The INFORMATION_SCHEMA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659
Gilmore_552-1Front.fm Page xx Wednesday, December 21, 2005 3:05 PM
■CONTENTS
xxi
■CHAPTER 28 Securing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
What You Should Do First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Securing the mysqld Daemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
The MySQL Access Privilege System . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
How the Privilege System Works . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Where Is Access Information Stored?. . . . . . . . . . . . . . . . . . . . . . . . 665

User and Privilege Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
CREATE USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675
DROP USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
RENAME USER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
The GRANT and REVOKE Commands . . . . . . . . . . . . . . . . . . . . . . . . 676
Reviewing Privileges. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Limiting User Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Secure MySQL Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Grant Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
SSL Options. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
Starting the SSL-Enabled MySQL Server. . . . . . . . . . . . . . . . . . . . . 686
Connecting Using an SSL-Enabled Client . . . . . . . . . . . . . . . . . . . . 686
Storing SSL Options in the my.cnf File. . . . . . . . . . . . . . . . . . . . . . . 686
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
■CHAPTER 29 PHP’s MySQL Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Enabling the MySQL Extension on Linux . . . . . . . . . . . . . . . . . . . . . 689
Enabling the MySQL Extension on Windows . . . . . . . . . . . . . . . . . . 690
User Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
PHP’s MySQL Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Establishing and Closing a Connection . . . . . . . . . . . . . . . . . . . . . . 691
Storing Connection Information in a Separate File . . . . . . . . . . . . . 693
Securing Your Connection Information. . . . . . . . . . . . . . . . . . . . . . . 693
Choosing a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Querying MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Retrieving and Displaying Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Inserting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
Modifying Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
Gilmore_552-1Front.fm Page xxi Wednesday, December 21, 2005 3:05 PM

xxii
■CONTENTS
Deleting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
Rows Selected and Rows Affected . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Retrieving Database and Table Information . . . . . . . . . . . . . . . . . . . . . . . 706
Retrieving Field Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Viewing Table Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
Retrieving Error Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713
Helper Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
■CHAPTER 30 PHP’s mysqli Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Enabling the mysqli Extension on Unix. . . . . . . . . . . . . . . . . . . . . . . 720
Enabling the mysqli Extension on Windows. . . . . . . . . . . . . . . . . . . 720
Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Using the mysqli Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Connecting to the MySQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Connection Error Reporting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
Selecting a MySQL Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Closing a MySQL Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
Query Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 726
Recuperating Query Memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
Readying the Result Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
Parsing Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730
Multiple Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733
Prepared Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
Database Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743
■CHAPTER 31 Stored Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745

Should You Use Stored Routines? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 745
Stored Routine Advantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Stored Routine Disadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
How MySQL Implements Stored Routines . . . . . . . . . . . . . . . . . . . . . . . . 747
Stored Routine Privilege Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
Creating a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Declaring and Setting Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Gilmore_552-1Front.fm Page xxii Wednesday, December 21, 2005 3:05 PM
■CONTENTS
xxiii
Executing a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Multistatement Stored Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
Calling a Routine from Within Another Routine . . . . . . . . . . . . . . . . 761
Modifying a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Deleting a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
Viewing a Routine’s Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
Viewing a Routine’s Creation Syntax . . . . . . . . . . . . . . . . . . . . . . . . 763
Conditions and Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
Integrating Routines into Web Applications . . . . . . . . . . . . . . . . . . . . . . . 764
Creating the Employee Bonus Interface. . . . . . . . . . . . . . . . . . . . . . 764
Retrieving Multiple Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
■CHAPTER 32 MySQL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Introducing Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Why Use Triggers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Taking Action Before an Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Taking Action After an Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Before Triggers vs. After Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . 769
MySQL’s Trigger Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Creating a Trigger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771

Viewing Existing Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Modifying a Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Deleting a Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774
Cascading Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
Integrating Triggers into Web Applications . . . . . . . . . . . . . . . . . . . . . . . 776
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 778
■CHAPTER 33 Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
Introducing Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780
MySQL’s View Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 780
Creating and Executing Views. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
Viewing View Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 786
Modifying a View. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788
Deleting a View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788
Updating Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 788
Incorporating Views into Web Applications . . . . . . . . . . . . . . . . . . . . . . . 789
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791
Gilmore_552-1Front.fm Page xxiii Wednesday, December 21, 2005 3:05 PM
xxiv
■CONTENTS
■CHAPTER 34 Practical Database Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
Creating Tabular Output with PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794
Installing HTML_Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795
Creating a Simple Table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795
Creating More Readable Row Output . . . . . . . . . . . . . . . . . . . . . . . . 797
Creating a Table from Database Data . . . . . . . . . . . . . . . . . . . . . . . 798
Generalizing the Output Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . 799
Sorting Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802
Creating Paged Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 803
Listing Page Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 806

Subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 808
Performing Comparisons with Subqueries . . . . . . . . . . . . . . . . . . . 809
Determining Existence with Subqueries . . . . . . . . . . . . . . . . . . . . . 809
Database Maintenance with Subqueries . . . . . . . . . . . . . . . . . . . . . 811
Using Subqueries with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812
Cursor Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812
Creating a Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Opening a Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Using a Cursor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813
Closing a Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Using Cursors with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
■CHAPTER 35 Indexes and Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Database Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
Primary Key Indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818
Unique Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Normal Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Full-Text Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Indexing Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825
Forms-Based Searches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Performing a Simple Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 826
Extending Search Capabilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 827
Performing a Full-Text Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 829
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Gilmore_552-1Front.fm Page xxiv Wednesday, December 21, 2005 3:05 PM

×