PHP和MySQL都是如今比较流行的开源技术,而且它们都是便于使用、运行速度快且功能十分强大的免费软件包,非常适用于开发面向数据库的Web应用程序。
PHP是一种服务器端解释的脚本语言,它是目前最流行的Web编程脚本语言之一。PHP可以产生动态网页。它功能强大,可以和HTML脚本融合在一起,并内置有访问数据库的功能。
MySQL是基于SQL的、完全网络化的跨平台关系型数据库系统,同时是具有客户/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性高等优点,用户可利用许多语言编写访问MySQL 数据库的程序。
本书将PHP开发与MySQL应用相结合,分别对PHP和MySQL做了深入浅出的分析。在介绍了PHP和MySQL的一般概念后,本书还对PHP和MySQL的Web应用程序做了较全面的阐述,最后是几个经典且实用的例子。
本书是第4版,经过了全面的更新、重写和扩展,包括了PHP最新改进的特性(例如,更好的错误和异常处理),MySQL的存储过程和存储引擎,Ajax技术与Web 2.0以及Web应用程序需要注意的安全问题。
具体地说,本书由6大部分组成。
1. PHP概述
这一部分主要介绍了PHP的基本概念以及作为编程语言的基础知识。例如,PHP的数据处理机制,代码重用的实现以及面向对象特性。这对于初级编程人员来说是非常重要的。
2. MySQL概述
这一部分主要介绍了MySQL的基本概念及其基本应用。通过一些标准的SQL查询例子,详尽地介绍了MySQL的使用。
3. 电子商务和安全性的基本概念
这一部分主要介绍了电子商务的基本概念和流程,以及在电子商务站点中可能出现的安全问题。这里还给出了关于Web应用程序的安全问题。
4. PHP的高级应用
这一部分主要介绍了PHP的一些高级应用,例如,与文件系统和服务器的交互、网络和协议函数的使用以及会话控制等。这些内容都为创建实用项目奠定了基础。
5. 创建实用的PHP和MySQL项目
这一部分是本书与实际结合最为紧密的部分。它给出了关于PHP和MySQL最常见的应用技术。其中一些技术可能就是编程人员或公司最需要的,具有很高的实用和参考价值。最后给出了Ajax和Web 2.0技术的应用示例。
6. 附录部分
这一部分给出了一些关于如何在不同的操作系统平台下安装PHP和MySQL的指南,此外,还列举了一些读者可能感兴趣的Web资源。
综观本书全篇,内容广泛,风格严谨,理论和实践紧密结合,既有详细的概念说明,又有复杂而完整的实例代码,读者能够轻松地将自己所学的理论知识付诸实践。正是由于这个原因,本书适用的对象非常广泛。对于初学者来说,本书可以作为教材和参考书,对于有丰富经验的PHP和MySQL高手,本书也是一本很好的参考手册,因此本书适用于各个层次的PHP程序员。
封面图
目录
- 对本书的赞誉
- 译者序
- 前言
- 第一篇使用PHP
- 第1章 PHP快速入门1
- 1.1 开始之前:了解PHP2
- 1.2 创建一个示例应用:Bob的汽车零部件
- 商店2
- 1.2.1 创建订单表单2
- 1.2.2 表单处理3
- 1.3 在HTML中嵌入PHP4
- 1.3.1 PHP标记5
- 1.3.2 PHP语句6
- 1.3.3 空格6
- 1.3.4 注释7
- 1.4 添加动态内容7
- 1.4.1 调用函数8
- 1.4.2 使用date()函数8
- 1.5 访问表单变量9
- 1.5.1 简短、中等以及冗长风格的表单
- 变量9
- 1.5.2 字符串的连接11
- 1.5.3 变量和文本12
- 1.6 理解标识符12
- 1.7 检查变量类型13
- 1.7.1 PHP的数据类型13
- 1.7.2 类型强度13
- 1.7.3 类型转换14
- 1.7.4 可变变量14
- 1.8 声明和使用常量15
- 1.9 理解变量的作用域15
- 1.10 使用操作符16
- 1.10.1 算术操作符16
- 1.10.2 字符串操作符17
- 1.10.3 赋值操作符17
- 1.10.4 比较操作符19
- 1.10.5 逻辑操作符20
- 1.10.6 位操作符21
- 1.10.7 其他操作符21
- 1.11 计算表单总金额23
- 1.12 理解操作符的优先级和结合性24
- 1.13 使用可变函数25
- 1.13.1 测试和设置变量类型25
- 1.13.2 测试变量状态26
- 1.13.3 变量的重解释27
- 1.14 根据条件进行决策27
- 1.14.1 if语句27
- 1.14.2 代码块28
- 1.14.3 else语句28
- 1.14.4 elseif语句29
- 1.14.5 switch语句30
- 1.14.6 比较不同的条件31
- 1.15 通过迭代实现重复动作31
- 1.15.1 while循环33
- 1.15.2 for和foreach循环34
- 1.15.3 do...while循环35
- 1.16 从控制结构或脚本中跳出35
- 1.17 使用可替换的控制结构语法36
- 1.18 使用declare36
- 1.19 下一章36
- 第2章 数据的存储与检索37
- 2.1 保存数据以便后期使用37
- 2.2 存储和检索Bob的订单37
- 2.3 文件处理38
- 2.4 打开文件38
- 2.4.1 选择文件模式39
- 2.4.2 使用fopen()打开文件39
- 2.4.3 通过FTP或HTTP打开文件41
- 2.4.4 解决打开文件时可能遇到的问题41
- 2.5 写文件43
- 2.5.1 fwrite()的参数44
- 2.5.2 文件格式44
- 2.6 关闭文件45
- 2.7 读文件47
- 2.7.1 以只读模式打开文件:fopen()47
- 2.7.2 知道何时读完文件:feof()48
- 2.7.3 每次读取一行数据:fgets()、fgetss()和fgetcsv()48
- 2.7.4 读取整个文件:readfile()、fpassthru()和file()49
- 2.7.5 读取一个字符:fgetc()50
- 2.7.6 读取任意长度:fread()50
- 2.8 使用其他有用的文件函数50
- 2.8.1 查看文件是否存在:
- file_exists()51
- 2.8.2 确定文件大小:filesize()51
- 2.8.3 删除一个文件:unlink()51
- 2.8.4 在文件中定位:rewind()、fseek()
- 和ftell()51
- 2.9 文件锁定52
- 2.10 更好的方式:数据库管理系统53
- 2.10.1 使用普通文件的几个问题53
- 2.10.2RDBMS是如何解决这些问题的54
- 2.11 进一步学习54
- 2.12 下一章54
- 第3章 使用数组55
- 3.1 什么是数组55
- 3.2 数字索引数组56
- 3.2.1 数字索引数组的初始化56
- 3.2.2 访问数组的内容57
- 3.2.3 使用循环访问数组57
- 3.3 使用不同索引的数组58
- 3.3.1 初始化关联数组58
- 3.3.2 访问数组元素58
- 3.3.3 使用循环语句58
- 3.4 数组操作符60
- 3.5 多维数组60
- 3.6 数组排序63
- 3.6.1 使用sort()函数63
- 3.6.2 使用asort()函数和ksort()函数
- 对关联数组排序64
- 3.6.3 反向排序64
- 3.7 多维数组的排序64
- 3.7.1 用户定义排序64
- 3.7.2 反向用户排序66
- 3.8 对数组进行重新排序66
- 3.8.1 使用shuffle()函数66
- 3.8.2 使用array_reverse()函数68
- 3.9 从文件载入数组68
- 3.10 执行其他数组操作71
- 3.10.1 在数组中浏览:each()、
- current()、reset()、end()、next()、pos()和prev()71
- 3.10.2 对数组的每一个元素应用任何函数:array_walk()72
- 3.10.3 统计数组元素个数:count()、sizeof()和array_count_ values()73
- 3.10.4 将数组转换成标量变量:
- extract()74
- 3.11 进一步学习75
- 3.12 下一章75
- 第4章 字符串操作与正则表达式76
- 4.1 创建一个示例应用程序:智能表单
- 邮件76
- 4.2 字符串的格式化78
- 4.2.1 字符串的整理:chop()、ltrim()
- 和trim()78
- 4.2.2 格式化字符串以便显示78
- 4.2.3 格式化字符串以便存储:addslashes()
- 和stripslashes()81
- 4.3 用字符串函数连接和分割字符串83
- 4.3.1 使用函数explode()、implode()
- 和join()83
- 4.3.2 使用strtok()函数84
- 4.3.3 使用substr()函数84
- 4.4 字符串的比较85
- 4.4.1 字符串的排序:strcmp()、strcasecmp()和strnatcmp()85
- 4.4.2 使用strlen()函数测试字符串的
- 长度86
- 4.5 使用字符串函数匹配和替换子字符串86
- 4.5.1 在字符串中查找字符串:strstr()、strchr()、strrchr()和
- stristr()86
- 4.5.2 查找子字符串的位置:strpos()、strrpos()87
- 4.5.3 替换子字符串:str_replace()、substr_replace()88
- 4.6 正则表达式的介绍89
- 4.6.1 基础知识89
- 4.6.2 字符集和类89
- 4.6.3 重复90
- 4.6.4 子表达式91
- 4.6.5 子表达式计数91
- 4.6.6 定位到字符串的开始或末尾91
- 4.6.7 分支92
- 4.6.8 匹配特殊字符92
- 4.6.9 特殊字符一览92
- 4.6.10 在智能表单中应用93
- 4.7 用正则表达式查找子字符串93
- 4.8 用正则表达式替换子字符串94
- 4.9 使用正则表达式分割字符串94
- 4.10 进一步学习95
- 4.11 下一章95
- 第5章 代码重用与函数编写96
- 5.1 代码重用的好处96
- 5.1.1 成本96
- 5.1.2 可靠性97
- 5.1.3 一致性97
- 5.2 使用require()和include()函数97
- 5.2.1 文件扩展名和require()函数97
- 5.2.2 使用require()制作Web站点的
- 模板99
- 5.2.3 使用auto_prepend_file和auto_append_file103
- 5.3 在PHP中使用函数104
- 5.3.1 调用函数104
- 5.3.2 调用未定义的函数105
- 5.3.3 理解字母大小写和函数名称106
- 5.4 理解为什么要定义自己的函数106
- 5.5 了解基本的函数结构106
- 5.6 使用参数108
- 5.7 理解作用域110
- 5.8 参数的引用传递和值传递112
- 5.9 使用Return关键字113
- 5.10 实现递归115
- 5.11 进一步学习116
- 5.12 下一章116
- 第6章 面向对象的PHP117
- 6.1 理解面向对象的概念117
- 6.1.1 类和对象117
- 6.1.2 多态性118
- 6.1.3 继承119
- 6.2 在PHP中创建类、属性和操作119
- 6.2.1 类的结构119
- 6.2.2 构造函数120
- 6.2.3 析构函数120
- 6.3 类的实例化121
- 6.4 使用类的属性121
- 6.5 使用private和public关键字控制
- 访问123
- 6.6 类操作的调用124
- 6.7 在PHP中实现继承124
- 6.7.1 通过继承使用private和protected
- 访问修饰符控制可见性125
- 6.7.2 重载126
- 6.7.3 使用final关键字禁止继承和重载128
- 6.7.4 理解多重继承128
- 6.7.5 实现接口129
- 6.8 类的设计130
- 6.9 编写类代码130
- 6.10 理解PHP面向对象的高级功能138
- 6.10.1 使用Per-Class常量138
- 6.10.2 实现静态方法138
- 6.10.3 检查类的类型和类型提示139
- 6.10.4 延迟静态绑定139
- 6.10.5 克隆对象140
- 6.10.6 使用抽象类140
- 6.10.7 使用__call()重载方法141
- 6.10.8 使用__autoload()方法141
- 6.10.9 实现迭代器和迭代142
- 6.10.10 将类转换成字符串144
- 6.10.11 使用Reflection(反射)API144
- 6.11 下一章145
- 第7章错误和异常处理146
- 7.1 异常处理的概念146
- 7.2 Exception类148
- 7.3 用户自定义异常148
- 7.4 Bob的汽车零部件商店应用程序的异常151
- 7.5 异常和PHP的其他错误处理机制154
- 7.6 进一步学习154
- 7.7 下一章154
- 第二篇使用MySQL
- 第8章 设计Web数据库155
- 8.1 关系数据库的概念155
- 8.1.1 表格156
- 8.1.2 列156
- 8.1.3 行156
- 8.1.4 值156
- 8.1.5 键156
- 8.1.6 模式157
- 8.1.7 关系158
- 8.2 设计Web数据库158
- 8.2.1 考虑要建模的实际对象158
- 8.2.2 避免保存冗余数据159
- 8.2.3 使用原子列值160
- 8.2.4 选择有意义的键161
- 8.2.5 考虑需要询问数据库的问题161
- 8.2.6 避免多个空属性的设计161
- 8.2.7 表格类型的总结162
- 8.3 Web数据库架构162
- 8.4 进一步学习163
- 8.5 下一章163
- 第9章 创建Web数据库164
- 9.1 使用MySQL监视程序165
- 9.2 登录到MySQL165
- 9.3 创建数据库和用户166
- 9.4 设置用户与权限167
- 9.5 MySQL权限系统的介绍167
- 9.5.1 最少权限原则167
- 9.5.2 创建用户:GRANT命令167
- 9.5.3 权限的类型和级别169
- 9.5.4 REVOKE命令170
- 9.5.5 使用GRANT和REVOKE的例子170
- 9.6 创建一个Web用户171
- 9.7 使用正确的数据库172
- 9.8 创建数据库表172
- 9.8.1 理解其他关键字的意思174
- 9.8.2 理解列的类型174
- 9.8.3 用SHOW和DESCRIBE来查看
- 数据库176
- 9.8.4 创建索引177
- 9.9 理解MySQL的标识符177
- 9.10 选择列数据类型178
- 9.10.1 数字类型178
- 9.10.2 日期和时间类型179
- 9.10.3 字符串类型180
- 9.11 进一步学习181
- 9.12 下一章181
- 第10章 使用MySQL数据库182
- 10.1 SQL是什么182
- 10.2 在数据库中插入数据183
- 10.3 从数据库中获取数据185
- 10.3.1 获取满足特定条件的数据186
- 10.3.2 从多个表中获取数据187
- 10.3.3 以特定的顺序获取数据191
- 10.3.4 分组与合计数据192
- 10.3.5 选择要返回的行194
- 10.3.6 使用子查询194
- 10.4 更新数据库记录196
- 10.5 创建后修改表197
- 10.6 删除数据库中的记录198
- 10.7 表的删除199
- 10.8 删除整个数据库199
- 10.9 进一步学习199
- 10.10 下一章199
- 第11章 使用PHP从Web访问MySQL
- 数据库200
- 11.1 Web数据库架构的工作原理200
- 11.2 从Web查询数据库的基本步骤203
- 11.2.1 检查与过滤用户输入数据203
- 11.2.2 建立一个连接204
- 11.2.3 选择使用的数据库205
- 11.2.4 查询数据库206
- 11.2.5 检索查询结果206
- 11.2.6 从数据库断开连接207
- 11.3 将新信息放入数据库208
- 11.4 使用Prepared语句211
- 11.5 使用PHP与数据库交互的其他接口212
- 11.6 进一步学习215
- 11.7 下一章215
- 第12章 MySQL高级管理216
- 12.1 深入理解权限系统216
- 12.1.1 user表217
- 12.1.2 db表和host表218
- 12.1.3 tables_priv表、columns_priv
- 表和procs_priv表219
- 12.1.4 访问控制:MySQL如何使用
- grant表220
- 12.1.5 更新权限:修改什么时候生效221
- 12.2 提高MySQL数据库的安全性221
- 12.2.1 从操作系统角度来保护MySQL221
- 12.2.2 密码222
- 12.2.3 用户权限222
- 12.2.4 Web问题223
- 12.3 获取更多关于数据库的信息223
- 12.3.1 使用SHOW获取信息223
- 12.3.2 使用DESCRIBE获取关于列的信息225
- 12.3.3 用EXPLAIN理解查询操作的工作
- 过程225
- 12.4 数据库的优化229
- 12.4.1 设计优化229
- 12.4.2 权限229
- 12.4.3 表的优化229
- 12.4.4 使用索引230
- 12.4.5 使用默认值230
- 12.4.6 其他技巧230
- 12.5 备份MySQL数据库230
- 12.6 恢复MySQL数据库231
- 12.7 实现复制231
- 12.7.1 设置主服务器232
- 12.7.2 执行初始的数据传输232
- 12.7.3 设置一个/多个从服务器233
- 12.8 进一步学习233
- 12.9 下一章233
- 第13章 MySQL高级编程234
- 13.1 LOAD DATA INFILE语句234
- 13.2 存储引擎234
- 13.3 事务235
- 13.3.1 理解事务的定义235
- 13.3.2 通过InnoDB使用事务236
- 13.4 外键237
- 13.5 存储过程238
- 13.5.1 基本示例238
- 13.5.2 局部变量240
- 13.5.3 游标和控制结构241
- 13.6 进一步学习244
- 13.7 下一章244
- 第三篇电子商务与安全性
- 第14章 运营一个电子商务网站245
- 14.1 我们要实现什么目标245
- 14.2 考虑电子商务网站的类型245
- 14.2.1 使用在线说明书公布信息246
- 14.2.2 接收产品或服务的订单247
- 14.2.3 提供服务和数字产品250
- 14.2.4 为产品或服务增值251
- 14.2.5 减少成本251
- 14.3 理解风险和威胁252
- 14.3.1 网络黑客252
- 14.3.2 不能招揽足够的生意253
- 14.3.3 计算机硬件故障253
- 14.3.4 电力、通信、网络或运输故障253
- 14.3.5 广泛的竞争253
- 14.3.6 软件错误254
- 14.3.7 不断变化的政府政策和税收254
- 14.3.8 系统容量限制254
- 14.4 选择一个策略254
- 14.5 下一章254
- 第15章 电子商务的安全问题255
- 15.1 信息的重要程度255
- 15.2 安全威胁256
- 15.2.1 机密数据的泄露256
- 15.2.2 数据丢失和数据破坏257
- 15.2.3 数据修改258
- 15.2.4 拒绝服务258
- 15.2.5 软件错误259
- 15.2.6 否认 260
- 15.3 易用性、性能、成本和安全性261
- 15.4 建立一套安全政策261
- 15.5 身份验证原则262
- 15.6 加密技术基础263
- 15.6.1 私有密钥加密264
- 15.6.2 公有密钥加密264
- 15.6.3 数字签名265
- 15.7 数字证书265
- 15.8 安全的Web服务器266
- 15.9 审计与日志记录267
- 15.10 防火墙267
- 15.11 备份数据268
- 15.11.1 备份常规文件268
- 15.11.2 备份与恢复MySQL数据库268
- 15.12 自然环境的安全性268
- 15.13 下一章269
- 第16章 Web应用的安全270
- 16.1 处理安全性问题的策略270
- 16.1.1 以正确心态为开始270
- 16.1.2 安全性和可用性之间的平衡271
- 16.1.3安全监视271
- 16.1.4基本方法271
- 16.2 识别所面临的威胁271
- 16.2.1 访问或修改敏感数据272
- 16.2.2 数据丢失或破坏272
- 16.2.3 拒绝服务272
- 16.2.4 恶意代码注入272
- 16.2.5 服务器被攻破273
- 16.3 了解与我们“打交道”的用户273
- 16.3.1 破解人员273
- 16.3.2 受影响机器的未知情用户274
- 16.3.3 对公司不满的员工274
- 16.3.4 硬件被盗274
- 16.3.5 我们自身274
- 16.4 代码的安全性274
- 16.4.1 过滤用户输入274
- 16.4.2 转义输出278
- 16.4.3 代码组织279
- 16.4.4 代码自身的问题280
- 16.4.5 文件系统因素281
- 16.4.6 代码稳定性和缺陷281
- 16.4.7 执行引号和exec282
- 16.5 Web服务器和PHP的安全性283
- 16.5.1 保持软件的更新283
- 16.5.2 查看php.ini文件284
- 16.5.3 Web服务器配置284
- 16.5.4 Web应用的商业主机服务285
- 16.6 数据库服务器的安全性286
- 16.6.1 用户和权限系统286
- 16.6.2 发送数据至服务器287
- 16.6.3 连接服务器287
- 16.6.4 运行服务器288
- 16.7 保护网络288
- 16.7.1 安装防火墙288
- 16.7.2 使用隔离区域(DMZ)288
- 16.7.3 应对DoS和DDoS攻击289
- 16.8 计算机和操作系统的安全性289
- 16.8.1 保持操作系统的更新289
- 16.8.2 只运行必需的软件290
- 16.8.3 服务器的物理安全性 290
- 16.9 灾难计划290
- 16.10 下一章291
- 第17章 使用PHP和MySQL实现身份验证292
- 17.1 识别访问者292
- 17.2 实现访问控制293
- 17.2.1 保存密码294
- 17.2.2 密码的加密296
- 17.2.3 保护多个网页298
- 17.3 使用基本身份验证298
- 17.4 在PHP中使用基本身份验证299
- 17.5 在Apache的.htaccess文件中使用基
- 本身份验证301
- 17.6 使用mod_auth_mysql身份验证303
- 17.6.1 安装mod_auth_mysql304
- 17.6.2 使用mod_auth_mysql304
- 17.7 创建自定义身份验证305
- 17.8 进一步学习306
- 17.9 下一章306
- 第18章 使用PHP和MySQL实现安全
- 事务307
- 18.1 提供安全的事务处理307
- 18.1.1 用户机器308
- 18.1.2 Internet309
- 18.1.3 我们的系统309
- 18.2 使用加密套接字层(SSL)310
- 18.3 屏蔽用户的输入312
- 18.4 提供安全存储313
- 18.5 存储信用卡号码314
- 18.6 在PHP中使用加密技术314
- 18.6.1 安装GPG315
- 18.6.2 测试GPG317
- 18.7 进一步学习321
- 18.8 下一章321
- 第四篇PHP的高级技术
- 第19章 与文件系统和服务器的交互323
- 19.1 文件上传323
- 19.1.1 文件上传的HTML代码324
- 19.1.2 编写处理文件的PHP325
- 19.1.3 避免常见上传问题329
- 19.2 使用目录函数329
- 19.2.1 从目录读取329
- 19.2.2 获得当前目录的信息332
- 19.2.3 创建和删除目录333
- 19.3 与文件系统的交互333
- 19.3.1 获取文件信息333
- 19.3.2 更改文件属性336
- 19.3.3 创建、删除和移动文件336
- 19.4 使用程序执行函数337
- 19.5 与环境变量交互:getenv()和
- putenv()339
- 19.6 进一步学习339
- 19.7 下一章339
- 第20章 使用网络函数和协议函数340
- 20.1 了解可供使用的协议340
- 20.2 发送和读取电子邮件340
- 20.3 使用其他Web站点的数据341
- 20.4 使用网络查找函数343
- 20.5 备份或镜像一个文件347
- 20.5.1 使用FTP备份或镜像一个文件347
- 20.5.2 上传文件353
- 20.5.3 避免超时353
- 20.5.4 使用其他的FTP函数353
- 20.6 进一步学习354
- 20.7 下一章354
- 第21章 日期和时间的管理355
- 21.1 在PHP中获取日期和时间355
- 21.1.1 使用date()函数355
- 21.1.2 使用UNIX时间戳356
- 21.1.3 使用getdate()函数357
- 21.1.4 使用checkdate()函数检验日期
- 有效性358
- 21.1.5 格式化时间戳358
- 21.2 在PHP日期格式和MySQL日期格式之间
- 进行转换360
- 21.3 在PHP中计算日期362
- 21.4 在MySQL中计算日期363
- 21.5 使用微秒364
- 21.6 使用日历函数364
- 21.7 进一步学习365
- 21.8 下一章365
- 第22章 创建图像366
- 22.1 在PHP中设置图像支持366
- 22.2 理解图像格式367
- 22.2.1 JPEG367
- 22.2.2 PNG367
- 22.2.3 WBMP368
- 22.2.4 GIF368
- 22.3 创建图像368
- 22.3.1 创建一个背景图像369
- 22.3.2 在图像上绘图或打印文本369
- 22.3.3 输出最终图形371
- 22.3.4 清理372
- 22.4 在其他页面中使用自动生成的图像372
- 22.5 使用文本和字体创建图像372
- 22.5.1 创建基本画布375
- 22.5.2 将文本调整到适合按钮375
- 22.5.3 放置文本378
- 22.5.4 将文本写到按钮上378
- 22.5.5 完成378
- 22.6 绘制图像与用图表描绘数据379
- 22.7 使用其他图像函数386
- 22.8 进一步学习386
- 22.9 下一章386
- 第23章 在PHP中使用会话控制387
- 23.1 什么是会话控制387
- 23.2 理解基本的会话功能387
- 23.2.1 什么是cookie388
- 23.2.2 通过PHP设置cookie388
- 23.2.3 在会话中使用cookie388
- 23.2.4 存储会话 ID389
- 23.3 实现简单的会话389
- 23.3.1 开始一个会话389
- 23.3.2 注册一个会话变量390
- 23.3.3 使用会话变量390
- 23.3.4 注销变量与销毁会话390
- 23.4 创建一个简单的会话例子391
- 23.5 配置会话控制392
- 23.6 通过会话控制实现身份验证393
- 23.7 进一步学习398
- 23.8 下一章398
- 第24章 其他有用的特性399
- 24.1 使用eval()函数对字符串求值399
- 24.2 终止执行:die()和exit()399
- 24.3 序列化变量和对象400
- 24.4 获取PHP环境信息401
- 24.4.1 找到所加载的PHP扩展部件401
- 24.4.2 识别脚本所有者402
- 24.4.3 确定脚本最近修改时间402
- 24.5 暂时改变运行时环境402
- 24.6 源代码加亮403
- 24.7 在命令行中使用PHP404
- 24.8 下一章404
- 第五篇 创建实用的PHP和MySQL项目
- 第25章 在大型项目中使用PHP和
- MySQL405
- 25.1 在Web开发中应用软件工程405
- 25.2 规划和运行Web应用程序项目406
- 25.3 重用代码406
- 25.4 编写可维护代码407
- 25.4.1 编码标准407
- 25.4.2 分解代码410
- 25.4.3 使用标准的目录结构410
- 25.4.4 文档化和共享内部函数410
- 25.5 实现版本控制411
- 25.6 选择一个开发环境412
- 25.7 项目的文档化412
- 25.8 建立原型413
- 25.9 将逻辑和内容分离413
- 25.10 优化代码414
- 25.10.1 使用简单优化414
- 25.10.2 使用Zend产品414
- 25.11 测试415
- 25.12 进一步学习415
- 25.13 下一章416
- 第26章 调试417
- 26.1 编程错误417
- 26.1.1 语法错误417
- 26.1.2 运行时错误418
- 26.1.3 逻辑错误423
- 26.2 使用变量帮助调试424
- 26.3 错误报告级别426
- 26.4 改变错误报告设置427
- 26.5 触发自定义错误428
- 26.6 巧妙地处理错误428
- 26.7 下一章431
- 第27章 建立用户身份验证机制和个性化
- 设置432
- 27.1 解决方案的组成432
- 27.1.1 用户识别和个性化设置432
- 27.1.2 保存书签433
- 27.1.3 推荐书签433
- 27.2 解决方案概述433
- 27.3 实现数据库435
- 27.4 实现基本的网站436
- 27.5 实现用户身份验证438
- 27.5.1 注册用户438
- 27.5.2 登录443
- 27.5.3 登出447
- 27.5.4 修改密码447
- 27.5.5 重设遗忘的密码449
- 27.6 实现书签的存储和检索454
- 27.6.1 添加书签454
- 27.6.2 显示书签456
- 27.6.3 删除书签457
- 27.7 实现书签推荐459
- 27.8 考虑可能的扩展462
- 27.9 下一章462
- 第28章 创建一个购物车463
- 28.1 解决方案的组成463
- 28.1.1 创建一个在线目录463
- 28.1.2 在用户购买商品的时候记录
- 购买行为464
- 28.1.3 实现一个付款系统464
- 28.1.4 创建一个管理界面464
- 28.2 解决方案概述465
- 28.3 实现数据库467
- 28.4 实现在线目录469
- 28.4.1 列出目录470
- 28.4.2 列出一个目录中的所有图书472
- 28.4.3 显示图书详细信息474
- 28.5 实现购物车475
- 28.5.1 使用show_cart.php脚本476
- 28.5.2 浏览购物车479
- 28.5.3 将物品添加到购物车481
- 28.5.4 保存更新后的购物车483
- 28.5.5 打印标题栏摘要483
- 28.5.6 结账484
- 28.6 实现付款490
- 28.7 实现一个管理界面491
- 28.8 扩展该项目498
- 28.9 使用一个已有系统498
- 28.10 下一章499
- 第29章 创建一个基于Web的电子邮件
- 服务系统500
- 29.1 解决方案的组成500
- 29.1.1 电子邮件协议:POP3和IMAP500
- 29.1.2 PHP对POP3和IMAP的支持501
- 29.2 解决方案概述502
- 29.3 建立数据库503
- 29.4 了解脚本架构504
- 29.5 登录与登出510
- 29.6 建立账户513
- 29.6.1 创建一个新账户515
- 29.6.2 修改已有账户516
- 29.6.3 删除账户516
- 29.7 阅读邮件517
- 29.7.1 选择账户517
- 29.7.2 查看邮箱内容519
- 29.7.3 阅读邮件消息522
- 29.7.4 查看消息标题525
- 29.7.5 删除邮件525
- 29.8 发送邮件526
- 29.8.1 发送一则新消息526
- 29.8.2 回复或转发邮件528
- 29.9 扩展这个项目530
- 29.10 下一章530
- 第30章 创建一个邮件列表管理器531
- 30.1 解决方案的组成531
- 30.1.1 建立列表和订阅者数据库532
- 30.1.2 上载新闻信件532
- 30.1.3 发送带附件的邮件532
- 30.2 解决方案概述533
- 30.3 建立数据库534
- 30.4 定义脚本架构536
- 30.5 实现登录543
- 30.5.1 新账户的创建543
- 30.5.2 登录546
- 30.6 用户函数的实现548
- 30.6.1 查看列表548
- 30.6.2 查看邮件列表信息553
- 30.6.3 查看邮件列表存档555
- 30.6.4 订阅与取消订阅556
- 30.6.5 更改账户设置557
- 30.6.6 更改密码558
- 30.6.7 登出559
- 30.7 管理功能的实现560
- 30.7.1 创建新的邮件列表560
- 30.7.2 上载新的新闻信件562
- 30.7.3 多文件上载的处理565
- 30.7.4 预览新闻信件569
- 30.7.5 发送邮件570
- 30.8 扩展这个项目576
- 30.9 下一章576
- 第31章 创建一个Web论坛577
- 31.1 理解流程577
- 31.2 解决方案的组成577
- 31.3 解决方案概述579
- 31.4 数据库的设计579
- 31.5 查看文章的树形结构581
- 31.5.1 展开和折叠583
- 31.5.2 显示文章585
- 31.5.3 使用treenode类586
- 31.6 查看单个的文章592
- 31.7 添加新文章593
- 31.8 添加扩充600
- 31.9 使用一个已有的系统600
- 31.10 下一章600
- 第32章 生成PDF格式的个性化文档601
- 32.1 项目概述601
- 32.2 解决方案的组成604
- 32.2.1 问题与回答系统605
- 32.2.2 文档生成软件605
- 32.3 解决方案概述607
- 32.3.1 提问607
- 32.3.2 给答题评分609
- 32.3.3 生成RTF证书611
- 32.3.4 从模板生成PDF证书615
- 32.3.5 使用PDFlib生成PDF文档618
- 32.3.6 使用PDFlib的一个“Hello World”
- 程序618
- 32.3.7 用PDFlib生成证书621
- 32.4 处理标题的问题628
- 32.5 扩展该项目629
- 32.6 下一章629
- 第33章 使用XML和SOAP来连接Web
- 服务630
- 33.1 项目概述:使用XML和Web服务630
- 33.1.1 理解XML631
- 33.1.2 理解Web服务633
- 33.2 解决方案的组成635
- 33.2.1 使用Amazon的Web服务接口635
- 33.2.2XML的解析:REST响应636
- 33.2.3 在PHP中使用SOAP636
- 33.2.4 缓存636
- 33.3 解决方案概述636
- 33.3.1 核心应用程序640
- 33.3.2 显示特定种类的图书646
- 33.3.3 获得一个AmazonResultSet类647
- 33.3.4 使用REST发送和接收请求656
- 33.3.5 使用SOAP发送和接收请求662
- 33.3.6 缓存请求返回的数据664
- 33.3.7 创建购物车666
- 33.3.8 到Amazon付账670
- 33.4 安装项目代码670
- 33.5 扩展这个项目671
- 33.6 进一步学习671
- 第34章 使用Ajax构建Web 2.0应用672
- 34.1 Ajax是什么672
- 34.1.1 HTTP请求和响应673
- 34.1.2 DHTML和XHTML673
- 34.1.3 级联样式单674
- 34.1.4 客户端编程675
- 34.1.5 服务器端编程675
- 34.1.6 XML和XSLT676
- 34.2 Ajax基础676
- 34.2.1 XMLHTTPRequest对象676
- 34.2.2 与服务器通信678
- 34.2.3 处理服务器响应679
- 34.2.4 整合应用681
- 34.3 在以前的项目添加Ajax元素683
- 34.4进一步学习694
- 34.4.1 进一步了解文档对象模型
- (DOM)694
- 34.4.2 Ajax应用可用的JavaScript
- 函数库694
- 34.4.3 Ajax开发人员网站695
- 附录
- 附录A 安装PHP及MySQL697
- 附录B Web资源712