<<

. 2
( 132 .)



>>

Appendix E MySQL User Administration . . . . . . . . . . . . . . . . 597
Appendix F PHP Function Reference . . . . . . . . . . . . . . . . . . . 607
Appendix G Regular Expressions Overview . . . . . . . . . . . . . . . 659
Appendix H Helpful User-Defined Functions . . . . . . . . . . . . . . 669
Appendix I PHP and MySQL Resources . . . . . . . . . . . . . . . . . 691
Appendix J MySQL Function Reference . . . . . . . . . . . . . . . . . 697

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735

End-User License Agreement . . . . . . . . . . . . . . . . 765




xiii
Contents
Preface. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix

Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi

Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv

Part I Working with MySQL

Chapter 1 Database Design with MySQL . . . . . . . . . . . . . . . . . . . . . 3
Why Use a Relational Database? . . . . . . . . . . . . . . . . . . . . . . 3
Blasted Anomalies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
The update anomaly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
The delete anomaly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
The insert anomaly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Normalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
First normal form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Second normal form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Third normal form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Types of Relationships . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
The one-to-many relationship . . . . . . . . . . . . . . . . . . . . . . . . 15
The one-to-one relationship . . . . . . . . . . . . . . . . . . . . . . . . . . 16
The many-to-many relationship . . . . . . . . . . . . . . . . . . . . . . . 17
Advanced Database Concepts . . . . . . . . . . . . . . . . . . . . . . . 19
Referential integrity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Stored procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Chapter 2 The Structured Query Language for Creating
and Altering Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Essential Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Null values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
The create database Statement . . . . . . . . . . . . . . . . . . . . . . . 26
The use database Statement . . . . . . . . . . . . . . . . . . . . . . . . . 27
The create table Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Column Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
String column types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Numeric column types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Date and time types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
xv
Creating Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
xvi Contents

Table Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
InnoDB Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
BerkeleyDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
The alter table Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Changing a table name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Adding columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Dropping columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Adding indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Dropping indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Changing column definitions . . . . . . . . . . . . . . . . . . . . . . . . . 43
Using the show Command . . . . . . . . . . . . . . . . . . . . . . . . . . 44
show databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
show tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
show columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
show index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
show table status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
show create table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
GUI Tools for Manipulating MySQL Tables and Data . . . . . . 48
Using phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
MySQL Control Center . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Using MacSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Chapter 3 The Structured Query Language for Inserting,
Editing, and Selecting Data . . . . . . . . . . . . . . . . . . . . . . 53
The insert Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
The update Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
The delete Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
The replace Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
The Basic select Statement . . . . . . . . . . . . . . . . . . . . . . . . . . 64
The where clause . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
order by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
group by and aggregate functions . . . . . . . . . . . . . . . . . . . . . 74
Joining Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The two-table join (equi-join) . . . . . . . . . . . . . . . . . . . . . . . . . 80
The multi-table join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
The outer join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
The self join . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Correlated subqueries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Contents xvii

Part II Working with PHP

Chapter 4 Getting Started with PHP ” Variables . . . . . . . . . . . . . 91
Assigning Simple Variables Within a Script . . . . . . . . . . . . . 91
Delimiting strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Assigning arrays within a script . . . . . . . . . . . . . . . . . . . . . . . 96
Assigning two-dimensional arrays in a script . . . . . . . . . . . . . . 99
Accessing Variables Passed from the Browser . . . . . . . . . . 100
HTML forms variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Passing arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Using Built-In Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
PHP variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Apache variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Other Web server variables . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Testing Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
isset() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
empty() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
is_null() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
is_int() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
is_double() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
is_string() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
is_array() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
is_bool() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
is_object() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
is_resource() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
is_scalar() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
gettype() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Changing Variable Types . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Type casting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Using settype() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
intval(), doubleval(), and stringval() . . . . . . . . . . . . . . . . . . . . 115
Variable Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Chapter 5 Control Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
The if Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Determining true or false in PHP . . . . . . . . . . . . . . . . . . . . . . 118
Comparison operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Logical operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Complex if statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
if ... else statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
if ... elseif statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
switch ... case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
xviii Contents

Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
while ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
do ... while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
foreach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
continue and break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Chapter 6 PHP™s Built-in Functions . . . . . . . . . . . . . . . . . . . . . . . 133
Function Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Return values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Function Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Important PHP Functions . . . . . . . . . . . . . . . . . . . . . . . . . 137
String handling functions . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Regular expression functions . . . . . . . . . . . . . . . . . . . . . . . . 142
Variable functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Type-conversion functions . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Array functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Object/class functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Print functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Date/time functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
File-system functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Script Control functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Random number generator functions . . . . . . . . . . . . . . . . . . 177
Session functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
MySQL functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
HTTP header functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Image functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Mail function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
URL functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Error functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Output buffering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Information functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Chapter 7 Writing Organized and Readable Code . . . . . . . . . . . 191
Indenting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Code blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Function calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
SQL statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Includes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
include() and require() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
include_once() and require_once() . . . . . . . . . . . . . . . . . . . . . 199
Contents xix

User-Defined Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Function basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Returning values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Using a variable number of arguments . . . . . . . . . . . . . . . . . 205
Variable scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Object-Oriented Programming . . . . . . . . . . . . . . . . . . . . . . 209
Classes, Continued . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Object cloning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Object-Oriented Code versus Procedural Code . . . . . . . . . . 220
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

Part III Simple Applications

Chapter 8 Guestbook 2003, the (Semi-)Bulletproof
Guestbook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Determining the Scope and Goals of the Application . . . . 229
Necessary pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
What do we need to prevent? . . . . . . . . . . . . . . . . . . . . . . . . 231
Designing the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Code Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Code Breakdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
From functions/basic.php . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Interesting code flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Chapter 9 Survey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Determining the Scope and Goals of the Application . . . . . 261
Necessary pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Preventive measures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Designing the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Code Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
Code Breakdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
HTML functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
The survey application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Interesting Code Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
admin/questions.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
admin/get_winner.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
admin/winners.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
claim.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
xx Contents

Part IV Not So Simple Applications

Chapter 10 Threaded Discussion . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Determining the Scope and Goals of the Application . . . . . 312
What do you need? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
What do you need to prevent? . . . . . . . . . . . . . . . . . . . . . . . 314
The Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Code Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Code Breakdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Reusable functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Functions from /book/discussion/functions . . . . . . . . . . . . . . 321
Error-handling and debugging functions . . . . . . . . . . . . . . . . 332
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Chapter 11 Content-Management System . . . . . . . . . . . . . . . . . . 349
Determining the Scope and Goals of the Application . . . . 350
Necessary pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
What do we need to prevent? . . . . . . . . . . . . . . . . . . . . . . . . 353
Designing the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Code Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Code Breakdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Functions from /dsn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
Functions from /book/functions/database . . . . . . . . . . . . . . . 365
Functions from /content/functions . . . . . . . . . . . . . . . . . . . . 374
Interesting Code Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
content/authenticate.php . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
content/admin/user.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
content/story.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Chapter 12 Catalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Determining the Scope and Goals of the Application . . . . 398
Necessary pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398

<<

. 2
( 132 .)



>>