楼主: 苹果六人行
1202 4

[其它] 【独家发布】Beginning PHP and MySQL [推广有奖]

  • 7关注
  • 22粉丝

VIP

教授

38%

还不是VIP/贵宾

-

TA的文库  其他...

能源经济学文库

英文原版图书

威望
1
论坛币
71491 个
通用积分
32.4618
学术水平
30 点
热心指数
69 点
信用等级
23 点
经验
37787 点
帖子
626
精华
0
在线时间
955 小时
注册时间
2011-10-30
最后登录
2024-5-14

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
008. Beginning PHP and MySQL.pdf (17.03 MB, 需要: 3 个论坛币)
Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxvii
About the Technical Reviewers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
■CHAPTER 1 Introducing PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
PHP 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
General Language Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Practicality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Power . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Possibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Price . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
■CHAPTER 2 Configuring Your Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Installation Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Downloading Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Downloading PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Obtaining the Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Installing Apache and PHP on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Installing Apache and PHP on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Installing IIS and PHP on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Installing IIS and PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Configuring FastCGI to Manage PHP Processes . . . . . . . . . . . . . . . . 22
Testing Your Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Configuring PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Configuring PHP at Build Time on Linux. . . . . . . . . . . . . . . . . . . . . . . 25
Customizing the Windows Build . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
viii ■CONTENTS
Run-Time Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Managing PHP’s Configuration Directives . . . . . . . . . . . . . . . . . . . . . 27
PHP’s Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Choosing a Code Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Adobe Dreamweaver CS3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Notepad++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
PDT (PHP Development Tools). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Zend Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Choosing a Web Hosting Provider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Seven Questions for Any Prospective Hosting Provider . . . . . . . . . . 51
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
■CHAPTER 3 PHP Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Embedding PHP Code in Your Web Pages . . . . . . . . . . . . . . . . . . . . . . . . . 56
Default Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Short-Tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
ASP Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Embedding Multiple Code Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Commenting Your Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Single-Line C++ Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Shell Syntax. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Multiple-Line C Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Outputting Data to the Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
The print() Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
The printf() Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
The sprintf() Statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
PHP’s Supported Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Scalar Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Compound Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Converting Between Datatypes Using Type Casting. . . . . . . . . . . . . 69
Adapting Datatypes with Type Juggling. . . . . . . . . . . . . . . . . . . . . . . 70
Type-Related Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Type Identifier Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Variable Declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Variable Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
PHP’s Superglobal Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Variable Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
■CONTENTS ix
Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
String Interpolation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Double Quotes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Single Quotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Heredoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Control Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Conditional Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Looping Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
File-Inclusion Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
■CHAPTER 4 Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Invoking a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Creating a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Passing Arguments by Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Passing Arguments by Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Default Argument Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Returning Values from a Function. . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Recursive Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Function Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
■CHAPTER 5 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
What Is an Array? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Creating an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Creating Arrays with array(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Extracting Arrays with list() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Populating Arrays with a Predefined Value Range . . . . . . . . . . . . . 132
Testing for an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Adding and Removing Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Adding a Value to the Front of an Array . . . . . . . . . . . . . . . . . . . . . . 135
Adding a Value onto the End of an Array . . . . . . . . . . . . . . . . . . . . . 135
Removing a Value from the Front of an Array . . . . . . . . . . . . . . . . . 135
Removing a Value from the End of an Array . . . . . . . . . . . . . . . . . . 136
x ■CONTENTS
Locating Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Searching an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Retrieving Array Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Retrieving Array Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Traversing Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Retrieving the Current Array Key. . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Retrieving the Current Array Value . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Retrieving the Current Array Key and Value. . . . . . . . . . . . . . . . . . . 140
Moving the Array Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Passing Array Values to a Function . . . . . . . . . . . . . . . . . . . . . . . . . 142
Determining Array Size and Uniqueness . . . . . . . . . . . . . . . . . . . . . . . . . 143
Determining the Size of an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Counting Array Value Frequency. . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Determining Unique Array Values . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Sorting Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Reversing Array Element Order . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Flipping Array Keys and Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Sorting an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Merging, Slicing, Splicing, and Dissecting Arrays . . . . . . . . . . . . . . . . . . 153
Merging Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Recursively Appending Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Combining Two Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Slicing an Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Splicing an Array. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Calculating an Array Intersection . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Calculating Associative Array Intersections . . . . . . . . . . . . . . . . . . . 158
Calculating Array Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Calculating Associative Array Differences . . . . . . . . . . . . . . . . . . . . 159
Other Useful Array Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Returning a Random Set of Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Shuffling Array Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
■CHAPTER 6 Object-Oriented PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
The Benefits of OOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Encapsulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
■CONTENTS xi
Key OOP Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Constructors and Destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Destructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Static Class Members . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
The instanceof Keyword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Helper Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Autoloading Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
■CHAPTER 7 Advanced OOP Features . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Advanced OOP Features Not Supported by PHP . . . . . . . . . . . . . . . . . . . 194
Object Cloning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Cloning Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
The __clone() Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Class Inheritance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Inheritance and Constructors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Implementing a Single Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Implementing Multiple Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Abstract Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Introducing Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
■CHAPTER 8 Error and Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Error Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Why Exception Handling Is Handy. . . . . . . . . . . . . . . . . . . . . . . . . . . 221
PHP’s Exception-Handling Implementation . . . . . . . . . . . . . . . . . . . 223
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
xii ■CONTENTS
■CHAPTER 9 Strings and Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . 231
Regular Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Regular Expression Syntax (POSIX). . . . . . . . . . . . . . . . . . . . . . . . . . 232
PHP’s Regular Expression Functions (POSIX Extended) . . . . . . . . . 235
Regular Expression Syntax (Perl) . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Other String-Specific Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Determining the Length of a String . . . . . . . . . . . . . . . . . . . . . . . . . 249
Comparing Two Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Manipulating String Case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Converting Strings to and from HTML . . . . . . . . . . . . . . . . . . . . . . . 254
Alternatives for Regular Expression Functions . . . . . . . . . . . . . . . . . . . . 260
Padding and Stripping a String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Counting Characters and Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Taking Advantage of PEAR: Validate_US . . . . . . . . . . . . . . . . . . . . . . . . . 274
Installing Validate_US. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Using Validate_US . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
■CHAPTER 10 Working with the File and Operating System . . . . . . . . . . . 277
Learning About Files and Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Parsing Directory Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Calculating File, Directory, and Disk Sizes . . . . . . . . . . . . . . . . . . . 281
Determining Access and Modification Times . . . . . . . . . . . . . . . . . 284
Working with Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
The Concept of a Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Recognizing Newline Characters . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Recognizing the End-of-File Character . . . . . . . . . . . . . . . . . . . . . . 287
Opening and Closing a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Reading from a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Writing a String to a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Moving the File Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Reading Directory Contents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Executing Shell Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
System-Level Program Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Sanitizing the Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
PHP’s Program Execution Functions. . . . . . . . . . . . . . . . . . . . . . . . . 305
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
■CONTENTS xiii
■CHAPTER 11 PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Popular PEAR Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Preinstalled Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Installer-Suggested Packages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
The Power of PEAR: Converting Numeral Formats . . . . . . . . . . . . . . . . . 312
Installing and Updating PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Installing PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
PEAR and Hosting Companies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Updating PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Using the PEAR Package Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Viewing an Installed PEAR Package . . . . . . . . . . . . . . . . . . . . . . . . . 316
Learning More About an Installed PEAR Package . . . . . . . . . . . . . . 317
Installing a PEAR Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Including a Package Within Your Scripts . . . . . . . . . . . . . . . . . . . . . 320
Upgrading Packages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Uninstalling a Package. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Downgrading a Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
■CHAPTER 12 Date and Time . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
The Unix Timestamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
PHP’s Date and Time Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Validating Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Formatting Dates and Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Converting a Timestamp to User-Friendly Values . . . . . . . . . . . . . . 330
Working with Timestamps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Date Fu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Displaying the Localized Date and Time . . . . . . . . . . . . . . . . . . . . . 334
Displaying the Web Page’s Most Recent Modification Date . . . . . 338
Determining the Number of Days in the Current Month. . . . . . . . . 339
Determining the Number of Days in Any Given Month . . . . . . . . . . 339
Calculating the Date X Days from the Present Date . . . . . . . . . . . . 340
Taking Advantage of PEAR: Creating a Calendar . . . . . . . . . . . . . . 341
Date and Time Enhancements for PHP 5.1+ Users . . . . . . . . . . . . . . . . 345
Introducing the DateTime Constructor . . . . . . . . . . . . . . . . . . . . . . . 345
Formatting Dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Setting the Date After Instantiation. . . . . . . . . . . . . . . . . . . . . . . . . . 346
Setting the Time After Instantiation . . . . . . . . . . . . . . . . . . . . . . . . . 347
Modifying Dates and Times . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
xiv ■CONTENTS
■CHAPTER 13 Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
PHP and Web Forms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
A Simple Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Passing Form Data to a Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Working with Multivalued Form Components . . . . . . . . . . . . . . . . . 354
Taking Advantage of PEAR: HTML_QuickForm . . . . . . . . . . . . . . . . . . . . 355
Installing HTML_QuickForm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Creating a Simple Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Using Auto-Completion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
■CHAPTER 14 Authenticating Your Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
HTTP Authentication Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
PHP Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Authentication Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Useful Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
PHP Authentication Methodologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Hard-Coded Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
File-based Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Database-based Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
IP-based Authentication. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Taking Advantage of PEAR: Auth_HTTP . . . . . . . . . . . . . . . . . . . . . . 377
User Login Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Testing Password Guessability with the CrackLib Library . . . . . . . 380
One-Time URLs and Password Recovery. . . . . . . . . . . . . . . . . . . . . 383
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
■CHAPTER 15 Handling File Uploads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Uploading Files via HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Uploading Files with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
PHP’s File Upload/Resource Directives . . . . . . . . . . . . . . . . . . . . . . 389
The $_FILES Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
PHP’s File-Upload Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
Upload Error Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
A Simple Example. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
■CONTENTS xv
Taking Advantage of PEAR: HTTP_Upload . . . . . . . . . . . . . . . . . . . . . . . . 395
Installing HTTP_Upload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Uploading a File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396
Learning More About an Uploaded File . . . . . . . . . . . . . . . . . . . . . . 397
Uploading Multiple Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399
■CHAPTER 16 Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
DNS, Services, and Servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Establishing Socket Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Configuration Directives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Sending E-mail Using a PHP Script. . . . . . . . . . . . . . . . . . . . . . . . . . 412
Common Networking Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Pinging a Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Creating a Port Scanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
Creating a Subnet Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 420
Testing User Bandwidth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
■CHAPTER 17 PHP and LDAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425
Using LDAP from PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Connecting to an LDAP Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
Retrieving LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
Counting Retrieved Entries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Sorting LDAP Records . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435
Inserting LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436
Updating LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Deleting LDAP Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Working with the Distinguished Name . . . . . . . . . . . . . . . . . . . . . . . 440
Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
xvi ■CONTENTS
■CHAPTER 18 Session Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
What Is Session Handling? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
The Session-Handling Process . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Configuration Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
Managing the Session Storage Media . . . . . . . . . . . . . . . . . . . . . . . 448
Setting the Session Files Path . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Automatically Enabling Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
Setting the Session Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Choosing Cookies or URL Rewriting . . . . . . . . . . . . . . . . . . . . . . . . . 450
Automating URL Rewriting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Setting the Session Cookie Lifetime. . . . . . . . . . . . . . . . . . . . . . . . . 451
Setting the Session Cookie’s Valid URL Path. . . . . . . . . . . . . . . . . . 451
Setting Caching Directions for Session-Enabled Pages . . . . . . . . . 452
Working with Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Starting a Session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
Destroying a Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Setting and Retrieving the Session ID . . . . . . . . . . . . . . . . . . . . . . . 454
Creating and Deleting Session Variables . . . . . . . . . . . . . . . . . . . . . 455
Encoding and Decoding Session Data . . . . . . . . . . . . . . . . . . . . . . . 456
Practical Session-Handling Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Automatically Logging In Returning Users . . . . . . . . . . . . . . . . . . . . 459
Generating a Recently Viewed Document Index . . . . . . . . . . . . . . . 461
Creating Custom Session Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Tying Custom Session Functions into PHP’s Logic . . . . . . . . . . . . . 463
Using Custom MySQL-Based Session Handlers . . . . . . . . . . . . . . . 464
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
■CHAPTER 19 Templating with Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
What’s a Templating Engine? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Introducing Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474
Installing Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475
Using Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
Smarty’s Presentational Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
Comments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Variable Modifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Control Structures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 490
Creating Configuration Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
config_load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494
Referencing Configuration Variables . . . . . . . . . . . . . . . . . . . . . . . . 494
■CONTENTS xvii
Using CSS in Conjunction with Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
Working with the Cache Lifetime . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
Eliminating Processing Overhead with is_cached() . . . . . . . . . . . . 499
Creating Multiple Caches per Template . . . . . . . . . . . . . . . . . . . . . . 499
Some Final Words About Caching. . . . . . . . . . . . . . . . . . . . . . . . . . . 501
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 501
■CHAPTER 20 Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Why Web Services? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504
Really Simple Syndication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506
Understanding RSS Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Introducing MagpieRSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Loading XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
Parsing XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Introducing SOAP Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
Introducing PHP’s SOAP Extension . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
■CHAPTER 21 Secure PHP Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Configuring PHP Securely . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Safe Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Other Security-Related Configuration Parameters . . . . . . . . . . . . . 543
Hiding Configuration Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Hiding Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546
Hiding PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Hiding Sensitive Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Hiding the Document Root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Denying Access to Certain File Extensions . . . . . . . . . . . . . . . . . . . 550
Sanitizing User Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
File Deletion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
Cross-Site Scripting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Sanitizing User Input: The Solution . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Taking Advantage of PEAR: Validate. . . . . . . . . . . . . . . . . . . . . . . . . 556
Data Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
PHP’s Encryption Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559
The MCrypt Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
xviii ■CONTENTS
■CHAPTER 22 SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Introduction to SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Installing SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Using the SQLite Command-Line Interface . . . . . . . . . . . . . . . . . . . 569
PHP’s SQLite Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
sqlite.assoc_case = 0 | 1 | 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Opening a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Creating a Table in Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Closing a Connection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
Querying a Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Parsing Result Sets. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576
Retrieving Result Set Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580
Manipulating the Result Set Pointer . . . . . . . . . . . . . . . . . . . . . . . . . 582
Retrieving a Table’s Column Types . . . . . . . . . . . . . . . . . . . . . . . . . 585
Working with Binary Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Creating and Overriding SQLite Functions . . . . . . . . . . . . . . . . . . . . 587
Creating Aggregate Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
■CHAPTER 23 Building Web Sites for the World . . . . . . . . . . . . . . . . . . . . . . . . 591
Translating Web Sites with Gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
Step 1: Update the Web Site Scripts. . . . . . . . . . . . . . . . . . . . . . . . . 592
Step 2: Create the Localization Repository . . . . . . . . . . . . . . . . . . . 594
Step 3: Create the Translation Files . . . . . . . . . . . . . . . . . . . . . . . . . 595
Step 4: Translate the Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Step 5: Generate Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Step 6: Set the Desired Language Within Your Scripts . . . . . . . . . 597
Localizing Dates, Numbers, and Times . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
■CHAPTER 24 MVC and the Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Introducing MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
PHP’s Framework Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
The CakePHP Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
The Solar Framework. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
The symfony Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606
The Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
■CONTENTS xix
Introducing the Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Downloading and Installing the Zend Framework. . . . . . . . . . . . . . 609
Creating Your First Zend Framework–Driven Web Site . . . . . . . . . 610
Searching the Web with Zend_Service_Yahoo . . . . . . . . . . . . . . . . 617
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620
■CHAPTER 25 Introducing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
What Makes MySQL So Popular? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Flexibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
Power . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
Flexible Licensing Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
A (Hyper) Active User Community . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
The Evolution of MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
MySQL 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
MySQL 5.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629
MySQL 5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
Prominent MySQL Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
craigslist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631
Wikipedia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Yahoo! Finance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
■CHAPTER 26 Installing and Configuring MySQL . . . . . . . . . . . . . . . . . . . . . . . 635
Downloading MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Downloading MySQL for Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Installing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
Installing MySQL on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Installing and Configuring MySQL on Windows. . . . . . . . . . . . . . . . 642
Setting the MySQL Administrator Password . . . . . . . . . . . . . . . . . . . . . . 645
Starting and Stopping MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Controlling the Daemon Manually. . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Starting and Stopping MySQL Automatically . . . . . . . . . . . . . . . . . . 648
Configuring and Optimizing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
The mysqld_safe Wrapper. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652
MySQL’s Configuration and Optimization Parameters . . . . . . . . . . 653
The my.cnf File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
Configuring PHP to Work with MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Reconfiguring PHP on Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Reconfiguring PHP on Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662
xx ■CONTENTS
■CHAPTER 27 The Many MySQL Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
Introducing the Command-Line Clients . . . . . . . . . . . . . . . . . . . . . . . . . . 663
The mysql Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663
The mysqladmin Client. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
Other Useful Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
Client Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
MySQL’s GUI Client Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686
Installing GUI Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
MySQL Administrator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687
MySQL Query Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688
MySQL Migration Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690
phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692
■CHAPTER 28 MySQL Storage Engines and Datatypes . . . . . . . . . . . . . . . . . 693
Storage Engines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693
MyISAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695
InnoDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
MEMORY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699
MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700
FEDERATED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701
ARCHIVE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
CSV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
EXAMPLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
BLACKHOLE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
Storage Engine FAQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Datatypes and Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
Datatypes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Datatype Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714
Working with Databases and Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Working with Databases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718
Working with Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720
Altering a Table Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 724
The INFORMATION_SCHEMA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728
■CHAPTER 29 Securing MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
What You Should Do First . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732
Securing the mysqld Daemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
301dec1fa5e91e80bc32cf05b48566eb
■CONTENTS xxi
The MySQL Access Privilege System . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
How the Privilege System Works . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
Where Is Access Information Stored?. . . . . . . . . . . . . . . . . . . . . . . . 738
User and Privilege Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Creating Users. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 750
Deleting Users. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
Renaming Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 751
The GRANT and REVOKE Commands . . . . . . . . . . . . . . . . . . . . . . . . 752
Reviewing Privileges. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Limiting User Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
Secure MySQL Connections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 760
Grant Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 761
SSL Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762
Starting the SSL-Enabled MySQL Server . . . . . . . . . . . . . . . . . . . . . 764
Connecting Using an SSL-Enabled Client . . . . . . . . . . . . . . . . . . . . 764
Storing SSL Options in the my.cnf File . . . . . . . . . . . . . . . . . . . . . . . 764
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765
■CHAPTER 30 Using PHP with MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Handling Installation Prerequisites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Enabling the mysqli Extension on Linux/Unix . . . . . . . . . . . . . . . . . 769
Enabling the mysqli Extension on Windows. . . . . . . . . . . . . . . . . . . 769
Managing User Privileges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
Working with Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769
Using the mysqli Extension . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 770
Setting Up and Tearing Down the Connection. . . . . . . . . . . . . . . . . 770
Handling Connection Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Retrieving Error Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772
Storing Connection Information in a Separate File . . . . . . . . . . . . . 774
Securing Your Connection Information. . . . . . . . . . . . . . . . . . . . . . . 775
Interacting with the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
Sending a Query to the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
Parsing Query Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
Determining the Rows Selected and Rows Affected . . . . . . . . . . . 781
Working with Prepared Statements . . . . . . . . . . . . . . . . . . . . . . . . . 782
Executing Database Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Enabling Autocommit Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Committing a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Rolling Back a Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 790
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 791
xxii ■CONTENTS
■CHAPTER 31 Introducing PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Another Database Abstraction Layer? . . . . . . . . . . . . . . . . . . . . . . . . . . . 795
Using PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
Installing PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 796
PDO’s Database Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 797
Connecting to a Database Server and Selecting a Database. . . . . 798
Handling Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 802
Getting and Setting Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 804
Executing Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805
Introducing Prepared Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . 807
Retrieving Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 811
Setting Bound Columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Working with Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 816
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 817
■CHAPTER 32 Stored Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Should You Use Stored Routines? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Stored Routine Advantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
Stored Routine Disadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 820
How MySQL Implements Stored Routines . . . . . . . . . . . . . . . . . . . . . . . . 821
Stored Routine Privilege Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 822
Creating a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 824
Declaring and Setting Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828
Executing a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 830
Creating and Using Multistatement Stored Routines . . . . . . . . . . . 830
Calling a Routine from Within Another Routine . . . . . . . . . . . . . . . . 840
Modifying a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
Deleting a Stored Routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
Viewing a Routine’s Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 841
Viewing a Routine’s Creation Syntax . . . . . . . . . . . . . . . . . . . . . . . . 843
Handling Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 844
Integrating Routines into Web Applications . . . . . . . . . . . . . . . . . . . . . . . 845
Creating the Employee Bonus Interface . . . . . . . . . . . . . . . . . . . . . . 845
Retrieving Multiple Rows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 847
■CONTENTS xxiii
■CHAPTER 33 MySQL Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
Introducing Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 849
Why Use Triggers? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
Taking Action Before an Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 850
Taking Action After an Event . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 851
Before Triggers vs. After Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . 852
MySQL’s Trigger Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 853
Creating a Trigger. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 854
Viewing Existing Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 856
Modifying a Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Deleting a Trigger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 859
Integrating Triggers into Web Applications . . . . . . . . . . . . . . . . . . . . . . . 859
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 861
■CHAPTER 34 MySQL Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 863
Introducing Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 864
MySQL’s View Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Creating and Executing Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865
Viewing View Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 872
Modifying a View. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 874
Deleting a View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875
Updating Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875
Incorporating Views into Web Applications . . . . . . . . . . . . . . . . . . . . . . . 876
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 878
■CHAPTER 35 Practical Database Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 879
Sample Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Creating Tabular Output with PEAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 880
Installing HTML_Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 881
Creating a Simple Table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 882
Creating More Readable Row Output . . . . . . . . . . . . . . . . . . . . . . . . 884
Creating a Table from Database Data . . . . . . . . . . . . . . . . . . . . . . . 885
Generalizing the Output Process. . . . . . . . . . . . . . . . . . . . . . . . . . . . 887
Sorting Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 890
Creating Paged Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 892
xxiv ■CONTENTS
Listing Page Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895
Querying Multiple Tables with Subqueries . . . . . . . . . . . . . . . . . . . . . . . 897
Performing Comparisons with Subqueries . . . . . . . . . . . . . . . . . . . 899
Determining Existence with Subqueries . . . . . . . . . . . . . . . . . . . . . 899
Performing Database Maintenance with Subqueries . . . . . . . . . . . 901
Using Subqueries with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Iterating Result Sets with Cursors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 902
Cursor Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 903
Creating a Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Opening a Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Using a Cursor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 904
Closing a Cursor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906
Using Cursors with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 906
■CHAPTER 36 Indexes and Searching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Database Indexing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 907
Primary Key Indexes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 908
Unique Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 910
Normal Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 911
Full-Text Indexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 913
Indexing Best Practices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 918
Forms-Based Searches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 919
Performing a Simple Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 919
Extending Search Capabilities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921
Performing a Full-Text Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 923
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 924
■CHAPTER 37 Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925
What’s a Transaction? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925
MySQL’s Transactional Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 926
System Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927
Table Creation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 927
A Sample Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 928
Creating Tables and Adding Sample Data . . . . . . . . . . . . . . . . . . . . 929
Executing an Example Transaction. . . . . . . . . . . . . . . . . . . . . . . . . . 930
Backing Up and Restoring InnoDB Tables . . . . . . . . . . . . . . . . . . . . 932
Usage Tips. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 933
■CONTENTS xxv
Building Transactional Applications with PHP . . . . . . . . . . . . . . . . . . . . . 933
The Swap Meet Revisited . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 934
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 937
■CHAPTER 38 Importing and Exporting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . 939
Sample Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Using Data Delimitation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 940
Importing Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 941
Importing Data with LOAD DATA INFILE. . . . . . . . . . . . . . . . . . . . . . 941
Importing Data with mysqlimport . . . . . . . . . . . . . . . . . . . . . . . . . . . 946
Loading Table Data with PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 950
Exporting Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
SELECT INTO OUTFILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Beginning beginn MySQL begin ning

本帖被以下文库推荐

关注我的文库“英文原版图书”,内容多多,各种英文原版小说和有趣的英文图书
https://bbs.pinggu.org/forum.php?mod=collection&action=view&ctid=1222&fromop=my
推广有奖,发图片证明,并@苹果六人行
沙发
yi318 发表于 2013-10-12 07:41:23 |只看作者 |坛友微信交流群
嗨,真的不容易啊,能有个不要钱的吗

使用道具

藤椅
苹果六人行 在职认证  发表于 2013-10-12 08:34:07 |只看作者 |坛友微信交流群
yi318 发表于 2013-10-12 07:41
嗨,真的不容易啊,能有个不要钱的吗
哈哈,挣钱很容易啊!你要是实在没有,邮箱给我,免费发给你
关注我的文库“英文原版图书”,内容多多,各种英文原版小说和有趣的英文图书
https://bbs.pinggu.org/forum.php?mod=collection&action=view&ctid=1222&fromop=my
推广有奖,发图片证明,并@苹果六人行

使用道具

板凳
yi318 发表于 2013-10-14 08:04:40 |只看作者 |坛友微信交流群
苹果六人行 发表于 2013-10-12 08:34
哈哈,挣钱很容易啊!你要是实在没有,邮箱给我,免费发给你
谢谢你,这份文件暂时用不到,但是能请教一下,如何赚点论坛币? 谢谢

使用道具

报纸
苹果六人行 在职认证  发表于 2013-10-14 17:57:33 |只看作者 |坛友微信交流群
yi318 发表于 2013-10-14 08:04
谢谢你,这份文件暂时用不到,但是能请教一下,如何赚点论坛币? 谢谢
上传点好资料,出售!可以赚取,每天签到!可以挣经验,经验可以换取论坛币!
关注我的文库“英文原版图书”,内容多多,各种英文原版小说和有趣的英文图书
https://bbs.pinggu.org/forum.php?mod=collection&action=view&ctid=1222&fromop=my
推广有奖,发图片证明,并@苹果六人行

使用道具

验证问答 换一个

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-30 02:06