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

Beginning PHP and Postgre SQL 8 From Novice to Professional phần 1 ppsx

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 (2.04 MB, 90 trang )

Beginning PHP
and PostgreSQL 8
From Novice to Professional
■■■
W. Jason Gilmore and Robert H. Treat
Gilmore_5475Front.fm Page i Thursday, February 9, 2006 2:42 PM
Beginning PHP and PostgreSQL 8: From Novice to Professional
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-547-3
ISBN-10 (pbk): 1-59059-547-5
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 Reviewers: Greg Sabino Mullane, Matt Wade
Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Jason Gilmore,
Jonathan Hassell, James Huddleston, Chris Mills, Matthew Moodie, Dominic Shakeshaft, Jim Sumser,
Matt Wade
Project Manager: 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


Artist: Kinetic Publishing Services, LLC
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_5475Front.fm Page ii Thursday, February 9, 2006 2:42 PM
This book is dedicated to the memory of my grandfather, William J. Gilmore,
for introducing me to the world of computers.
—W. Jason Gilmore
I dedicate this book to my mother, Gladys Emilia Treat.
Puedes vivir solo una vez,
pero si lo haces bien, una vez es suficiente.
—Robert H. Treat
Gilmore_5475Front.fm Page iii Thursday, February 9, 2006 2:42 PM
Gilmore_5475Front.fm Page iv Thursday, February 9, 2006 2:42 PM
v
Contents at a Glance
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
■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
Gilmore_5475Front.fm Page v Thursday, February 9, 2006 2:42 PM
vi
■CHAPTER 23 Introducing PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
■CHAPTER 24 Introducing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
■CHAPTER 25 Installing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
■CHAPTER 26 PostgreSQL Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
■CHAPTER 27 The Many PostgreSQL Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
■CHAPTER 28 From Databases to Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
■CHAPTER 29 Securing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649

■CHAPTER 30 PHP’s PostgreSQL Functionality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
■CHAPTER 31 Practical Database Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
■CHAPTER 32 Views and Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
■CHAPTER 33 PostgreSQL Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
■CHAPTER 34 PostgreSQL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
■CHAPTER 35 Indexes and Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
■CHAPTER 36 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
■CHAPTER 37 Importing and Exporting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
Gilmore_5475Front.fm Page vi Thursday, February 9, 2006 2:42 PM
vii
Contents
About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
■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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Common Pitfalls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Viewing and Downloading the Documentation . . . . . . . . . . . . . . . . . 18
Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Managing PHP’s Configuration Directives . . . . . . . . . . . . . . . . . . . . . 19
PHP’s Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Contents
Gilmore_5475Front.fm Page vii Thursday, February 9, 2006 2:42 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_5475Front.fm Page viii Thursday, February 9, 2006 2:42 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_5475Front.fm Page ix Thursday, February 9, 2006 2:42 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_5475Front.fm Page x Thursday, February 9, 2006 2:42 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_5475Front.fm Page xi Thursday, February 9, 2006 2:42 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_5475Front.fm Page xii Thursday, February 9, 2006 2:42 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_5475Front.fm Page xiii Thursday, February 9, 2006 2:42 PM
xiv
■CONTENTS
User Login Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

Password Designation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Testing Password Guessability with the CrackLib Library . . . . . . . 339
One-Time URLs and Password Recovery. . . . . . . . . . . . . . . . . . . . . 342
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
■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_5475Front.fm Page xiv Thursday, February 9, 2006 2:42 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_5475Front.fm Page xv Thursday, February 9, 2006 2:42 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 . . . . . . . . . . . . . 441
Custom PostgreSQL-Based Session Handlers. . . . . . . . . . . . . . . . . 442
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
■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
Gilmore_5475Front.fm Page xvi Thursday, February 9, 2006 2:42 PM
■CONTENTS
xvii
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
■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
Gilmore_5475Front.fm Page xvii Thursday, February 9, 2006 2:42 PM

xviii
■CONTENTS
■CHAPTER 22 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Introduction to SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Installing SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Using the SQLite Command-Line Interface . . . . . . . . . . . . . . . . . . . 536
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
Query Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Prepared Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564

Retrieving Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Setting Bound Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Gilmore_5475Front.fm Page xviii Thursday, February 9, 2006 2:42 PM
■CONTENTS
xix
■CHAPTER 24 Introducing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
PostgreSQL’s Key Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Data Integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Highly Scalable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Feature-Complete. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Extensible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Platform Support. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Flexible Security Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Global Development, Local Flavor. . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Hassle-Free Licensing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Multiple Support Avenues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Real-World Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Afilias Inc. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
The National Weather Service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
WhitePages.com. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577
■CHAPTER 25 Installing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
PostgreSQL Licensing Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Downloading PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Downloading the Unix Version. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Downloading the Windows Version . . . . . . . . . . . . . . . . . . . . . . . . . 580
Downloading the Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . 581
Installing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 581

Installing PostgreSQL on Linux and Unix . . . . . . . . . . . . . . . . . . . . . 582
Installing PostgreSQL on Windows 2000, XP, and 2003 . . . . . . . . 585
Installing PostgreSQL on Windows 95, 98, and ME . . . . . . . . . . . . 589
Starting PostgreSQL for the First Time . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
■CHAPTER 26 PostgreSQL Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Starting and Stopping the Server . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Tuning Your PostgreSQL Installation . . . . . . . . . . . . . . . . . . . . . . . . 596
Working with Tablespaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Vacuum and Analyze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Autovacuum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
Backup and Recovery. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
Upgrading Between Versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Gilmore_5475Front.fm Page xix Thursday, February 9, 2006 2:42 PM
xx
■CONTENTS
■CHAPTER 27 The Many PostgreSQL Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
What Is psql? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611
psql Options. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Commonplace psql Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Logging Onto and Off the Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
psql Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
Storing psql Variables and Options. . . . . . . . . . . . . . . . . . . . . . . . . . 615
Learning More About Supported SQL Commands . . . . . . . . . . . . . 617
Executing a Query. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Modifying the psql Prompt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
Controlling the Command History. . . . . . . . . . . . . . . . . . . . . . . . . . . 619
GUI-based Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
pgAdmin III. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620

phpPgAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
Navicat. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
■CHAPTER 28 From Databases to Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Working with Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Default Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625
Creating a Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Connecting to a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Deleting a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
Modifying Existing Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Working with Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Creating Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Altering Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Dropping Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
The Schema Search Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Working with Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Creating a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
Copying a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
Creating a Temporary Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
Viewing a Database’s Available Tables . . . . . . . . . . . . . . . . . . . . . . 631
Viewing Table Structure. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Deleting a Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Altering a Table Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Gilmore_5475Front.fm Page xx Thursday, February 9, 2006 2:42 PM
■CONTENTS
xxi
Working with Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Creating a Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Modifying Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Sequence Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634

Deleting a Sequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Datatypes and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635
Datatype Attributes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
Composite Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Creating Composite Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Altering Composite Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Dropping Composite Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Working with Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Creating Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Altering Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Dropping Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
■CHAPTER 29 Securing PostgreSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
What You Should Do First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Securing the PostgreSQL Daemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651
The PostgreSQL Access Privilege System . . . . . . . . . . . . . . . . . . . . . . . . 651
How the Privilege System Works . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
Where Is Access Information Stored?. . . . . . . . . . . . . . . . . . . . . . . . 652
User and Privilege Management. . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Secure PostgreSQL Connections. . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
■CHAPTER 30 PHP’s PostgreSQL Functionality . . . . . . . . . . . . . . . . . . . . . . . . . 665
Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Enabling PHP’s PostgreSQL Extension . . . . . . . . . . . . . . . . . . . . . . . 665
PHP’s PostgreSQL Configuration Directives. . . . . . . . . . . . . . . . . . . 666
Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
PHP’s PostgreSQL Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
Establishing and Closing a Connection . . . . . . . . . . . . . . . . . . . . . . 667
Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671

Query Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671
Gilmore_5475Front.fm Page xxi Thursday, February 9, 2006 2:42 PM
xxii
■CONTENTS
Retrieving Status and Error Information . . . . . . . . . . . . . . . . . . . . . . . . . . 673
Recuperating Query Memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Retrieving and Displaying Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Rows Selected and Rows Affected . . . . . . . . . . . . . . . . . . . . . . . . . . 681
Inserting, Modifying, and Deleting Data . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Inserting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682
Mass Inserts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
Modifying Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684
Deleting Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
Prepared Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
The Information Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
■CHAPTER 31 Practical Database Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689
Creating a PostgreSQL Database Class . . . . . . . . . . . . . . . . . . . . . . . . . . 690
Why Use the PostgreSQL Database Class? . . . . . . . . . . . . . . . . . . . 692
Executing a Simple Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
Retrieving Multiple Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Counting Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694
Tabular Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
Linking to a Detailed View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
Sorting Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
Creating Paged Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
Listing Page Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
■CHAPTER 32 Views and Rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707

Working with Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
The PostgreSQL Rule System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Working with Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Rule Types. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
Making Views Interactive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
Working with Views from Within PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
Gilmore_5475Front.fm Page xxii Thursday, February 9, 2006 2:42 PM
■CONTENTS
xxiii
■CHAPTER 33 PostgreSQL Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Logical Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Comparison Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Mathematical Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
String Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721
Operator Precedence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722
Internal Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
Date and Time Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723
String Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Aggregate Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
Conditional Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
More Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
Create Function Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
SQL-Based Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
PL/pgSQL-Based Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 730
Other Procedural Languages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738
■CHAPTER 34 PostgreSQL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739

What Is a Trigger? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Adding Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Modifying Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 740
Removing Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Writing Trigger Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 741
Example Trigger Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742
Viewing Existing Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 747
■CHAPTER 35 Indexes and Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Database Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Primary Key Indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Unique Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Normal Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Full-Text Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 755
Indexing Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Gilmore_5475Front.fm Page xxiii Thursday, February 9, 2006 2:42 PM
xxiv
■CONTENTS
Forms-Based Searches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Performing a Simple Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Extending Search Capabilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
Performing a Full-Text Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
■CHAPTER 36 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
What’s a Transaction? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
PostgreSQL’s Transactional Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . 766
Transaction Isolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766
Sample Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
A Simple Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Transaction Usage Tips . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771

Building Transactional Applications with PHP . . . . . . . . . . . . . . . . . . . . . 771
Beware of pg_query(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
The Swap Meet Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
■CHAPTER 37 Importing and Exporting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
The COPY Command . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 777
Copying Data to and from a Table . . . . . . . . . . . . . . . . . . . . . . . . . . 778
Calling COPY from a PHP Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782
Importing and Exporting Data with phpPgAdmin . . . . . . . . . . . . . . . . . . 783
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 787
Gilmore_5475Front.fm Page xxiv Thursday, February 9, 2006 2:42 PM

×