本书共分五部分。第一部分通过一些示例概述了PHP语言的主要部分,每一个示例都是在构建真实电子商务站点时可能用到的示例,而不是一些“玩具”代码示例。第二部分介绍一些概念和设计,这些概念和设计包括使用关系型数据库系统(例如MySQL)、使用SQL、使用PHP连接MySQL数据库以及MySQL高级技术(例如,安全性和优化)的使用。第三部分讲解使用任何语言开发电子商务站点所涉及的一些常见问题。我们还将介绍如何使用PHP和MySQL来进行用户身份验证,以及安全地搜集、传输和保存数据。第四部分提供了PHP中一些主要内置函数的详细介绍,读者将学会如何与服务器进行交互、如何与网络进行交互、图像的生成、日期时间的操作以及会话处理。第五部分主要介绍如何解决真实项目中可能遇到的实际问题,例如管理和调试大型项目,提供了一些能够说明PHP和MySQL强大功能的示例项目。
封面图
目录
- 本书赞誉
- 译者序
- 前言
- 作者简介
- 第一篇使用PHP
- 第1章PHP快速入门教程2
- 1.1开始之前:了解PHP3
- 1.2创建示例Web应用:Bob汽车零部件商店3
- 1.2.1创建订单表单3
- 1.2.2表单处理 5
- 1.3在HTML中嵌入PHP5
- 1.3.1PHP标记6
- 1.3.2PHP语句7
- 1.3.3空格7
- 1.3.4注释 8
- 1.4添加动态内容8
- 1.4.1调用函数9
- 1.4.2使用date()函数 9
- 1.5访问表单变量10
- 1.5.1表单变量 10
- 1.5.2字符串连接12
- 1.5.3变量和字面量12
- 1.6理解标识符 13
- 1.7检查变量类型 14
- 1.7.1PHP的数据类型 14
- 1.7.2类型强度 14
- 1.7.3类型转换 15
- 1.7.4可变变量 15
- 1.8声明和使用常量 16
- 1.9理解变量作用域 16
- 1.10使用操作符 17
- 1.10.1算术操作符 18
- 1.10.2字符串操作符18
- 1.10.3赋值操作符 19
- 1.10.4比较操作符 21
- 1.10.5逻辑操作符 22
- 1.10.6位操作符 22
- 1.10.7其他操作符 23
- 1.11计算表单总金额 25
- 1.12理解操作符优先级和结合性 26
- 1.13使用变量处理函数27
- 1.13.1测试和设置变量类型 27
- 1.13.2测试变量状态 28
- 1.13.3变量的重解释 29
- 1.14根据条件进行决策 29
- 1.14.1if语句 29
- 1.14.2代码块 30
- 1.14.3else语句 30
- 1.14.4elseif语句 31
- 1.14.5switch语句 32
- 1.14.6比较不同条件 33
- 1.15通过迭代实现重复动作 34
- 1.15.1while循环 35
- 1.15.2for循环和foreach循环 36
- 1.15.3do...while循环 37
- 1.16从控制结构或脚本中跳出 38
- 1.17使用其他控制结构语法 38
- 1.18使用declare 39
- 1.19下一章 39
- 第2章数据存储和读取40
- 2.1保存数据以便后期使用 40
- 2.2存储和获取Bob的订单 41
- 2.3文件处理 41
- 2.4打开文件 42
- 2.4.1选择文件模式 42
- 2.4.2使用fopen()打开文件 42
- 2.4.3通过FTP或HTTP打开文件 44
- 2.4.4解决打开文件时可能遇到的问题 45
- 2.5写文件 47
- 2.5.1fwrite()的参数 47
- 2.5.2文件格式 47
- 2.6关闭文件 48
- 2.7读文件 50
- 2.7.1以只读模式打开文件:fopen()51
- 2.7.2知道何时读完文件:feof()51
- 2.7.3每次读取一行数据:fgets()、fgetss()和fgetcsv() 52
- 2.7.4读取整个文件:readfile()、fpassthru()、file()以及file_get_contents()53
- 2.7.5读取一个字符:fgetc() 53
- 2.7.6读取任意长度:fread()54
- 2.8使用其他文件函数 54
- 2.8.1查看文件是否存在:file_exists() 54
- 2.8.2确定文件大小:filesize() 55
- 2.8.3删除一个文件:unlink()55
- 2.8.4在文件中定位:rewind()、fseek()和ftell() 55
- 2.9文件锁定 56
- 2.10更好的方式:数据库管理系统 57
- 2.10.1使用普通文件的几个问题 58
- 2.10.2RDBMS是如何解决这些问题的 58
- 2.11进一步学习 59
- 2.12下一章 59
- 第3章使用数组60
- 3.1什么是数组 60
- 3.2数字索引数组 61
- 3.2.1数字索引数组的初始化 61
- 3.2.2访问数组内容 62
- 3.2.3使用循环访问数组 63
- 3.3使用不同索引的数组 64
- 3.3.1初始化数组 64
- 3.3.2访问数组元素 64
- 3.3.3使用循环语句 64
- 3.4数组操作符 66
- 3.5多维数组 66
- 3.6数组排序 69
- 3.6.1使用sort()函数 69
- 3.6.2使用asort()函数和ksort()函数对数组排序 70
- 3.6.3反向排序 70
- 3.7多维数组排序 70
- 3.7.1使用array_multisort()函数71
- 3.7.2用户定义排序 71
- 3.7.3自定义排序函数的反序 73
- 3.8对数组进行重新排序 73
- 3.8.1使用shuffle()函数 73
- 3.8.2逆序数组内容75
- 3.9从文件载入数组 75
- 3.10执行其他数组操作 79
- 3.10.1在数组中浏览:each()、current()、reset()、end()、next()、pos()和prev()79
- 3.10.2对数组每一个元素应用函数:array_walk() 80
- 3.10.3统计数组元素个数:count()、sizeof()和array_count_values() 81
- 3.10.4将数组转换成标量变量:extract() 81
- 3.11进一步学习 83
- 3.12下一章 83
- 第4章字符串操作与正则表达式84
- 4.1创建一个示例应用:智能表单邮件 84
- 4.2字符串的格式化86
- 4.2.1字符串截断:chop()、ltrim()和trim() 87
- 4.2.2格式化字符串以便输出 87
- 4.3使用字符串函数连接和分割字符串93
- 4.3.1使用函数explode()、implode()和join() 93
- 4.3.2使用strtok()函数 94
- 4.3.3使用substr()函数 95
- 4.4字符串比较 96
- 4.4.1字符串的排序:strcmp()、strcasecmp()和strnatcmp() 96
- 4.4.2使用strlen()函数判断字符串长度 96
- 4.5使用字符串函数匹配和替换子字符串 97
- 4.5.1在字符串中查找字符串:strstr()、strchr()、strrchr()和stristr() 97
- 4.5.2查找子字符串的位置:strpos()和strrpos() 98
- 4.5.3替换子字符串:str_replace()和substr_replace() 99
- 4.6正则表达式的介绍 100
- 4.6.1基础知识 100
- 4.6.2分隔符101
- 4.6.3字符类和类型 101
- 4.6.4重复 102
- 4.6.5子表达式 102
- 4.6.6子表达式计数 103
- 4.6.7定位到字符串的开始或末尾 103
- 4.6.8分支103
- 4.6.9匹配特殊字符 103
- 4.6.10元字符一览 104
- 4.6.11转义序列104
- 4.6.12回溯引用105
- 4.6.13断言105
- 4.6.14在智能表单中应用 106
- 4.7用正则表达式查找子字符串 107
- 4.8用正则表达式替换子字符串 107
- 4.9使用正则表达式分割字符串 108
- 4.10进一步学习 109
- 4.11下一章 109
- 第5章代码重用与函数编写110
- 5.1代码重用的好处 110
- 5.1.1成本111
- 5.1.2可靠性 111
- 5.1.3一致性 111
- 5.2使用require()和include()函数 111
- 5.2.1使用require()函数引入代码112
- 5.2.2使用require()制作Web站点模板113
- 5.2.3使用auto_prepend_file和 auto_append_file 118
- 5.3使用PHP函数 119
- 5.3.1调用函数 119
- 5.3.2调用未定义函数 120
- 5.3.3理解大小写和函数名称121
- 5.4自定义函数121
- 5.5了解函数基本结构 122
- 5.6参数使用 123
- 5.7理解作用域126
- 5.8引用传递和值传递128
- 5.9使用return关键字 129
- 5.10递归实现 131
- 5.11进一步学习 134
- 5.12下一章 134
- 第6章面向对象特性135
- 6.1理解面向对象概念 135
- 6.1.1类和对象 136
- 6.1.2多态性 137
- 6.1.3继承 137
- 6.2在PHP中创建类、属性和操作 138
- 6.2.1类结构 138
- 6.2.2构造函数 138
- 6.2.3析构函数139
- 6.3类的实例化139
- 6.4使用类属性 140
- 6.5调用类操作141
- 6.6使用private和public关键字控制访问 141
- 6.7编写访问器函数142
- 6.8在PHP中实现继承 143
- 6.8.1通过继承使用private和protected控制可见性 144
- 6.8.2覆盖145
- 6.8.3使用final关键字禁止继承和覆盖 147
- 6.8.4理解多重继承 147
- 6.8.5实现接口 148
- 6.9使用Trait149
- 6.10类设计 151
- 6.11编写自定义类代码 151
- 6.12理解PHP面向对象高级功能 158
- 6.12.1使用类级别常量 159
- 6.12.2实现静态方法 159
- 6.12.3检查类类型和类型提示 159
- 6.12.4延迟静态绑定160
- 6.12.5对象克隆 161
- 6.12.6使用抽象类 161
- 6.12.7使用__call()重载方法 162
- 6.12.8使用__autoload()方法 163
- 6.12.9实现迭代器和迭代 163
- 6.12.10生成器165
- 6.12.11将类转换成字符串 166
- 6.12.12使用反射API 166
- 6.12.13名称空间168
- 6.12.14使用子名称空间169
- 6.12.15理解全局名称空间169
- 6.12.16名称空间的导入和别名170
- 6.13下一章 170
- 第7章错误和异常处理 171
- 7.1异常处理的概念 171
- 7.2Exception类173
- 7.3用户自定义异常 174
- 7.4Bob汽车零部件商店应用的异常 176
- 7.5异常和PHP的其他错误处理机制 179
- 7.6进一步学习 180
- 7.7下一章 180
- 第二篇使用MySQL
- 第8章Web数据库设计182
- 8.1关系型数据库的概念 183
- 8.1.1表183
- 8.1.2列183
- 8.1.3行183
- 8.1.4值184
- 8.1.5键184
- 8.1.6模式185
- 8.1.7关系185
- 8.2设计Web数据库185
- 8.2.1考虑真实建模对象186
- 8.2.2避免保存冗余数据187
- 8.2.3使用原子列值188
- 8.2.4选择有意义的键188
- 8.2.5思考需要从数据库获得的数据189
- 8.2.6避免多个空属性的设计189
- 8.2.7表类型总结190
- 8.3Web数据库架构190
- 8.4进一步学习191
- 8.5下一章191
- 第9章Web数据库创建192
- 9.1使用MySQL监视程序193
- 9.2登录MySQL194
- 9.3创建数据库和用户195
- 9.4设置用户与权限195
- 9.5MySQL权限系统介绍196
- 9.5.1最少权限原则196
- 9.5.2创建用户和设置权限:CREATEUSER和GRANT命令196
- 9.5.3权限的类型和级别198
- 9.5.4REVOKE命令200
- 9.5.5使用GRANT和REVOKE示例200
- 9.6设置Web用户201
- 9.7使用正确的数据库202
- 9.8创建数据库表202
- 9.8.1理解其他关键字204
- 9.8.2理解列类型205
- 9.8.3使用SHOW和DESCRIBE来查看数据库207
- 9.8.4创建索引207
- 9.9理解MySQL标识符208
- 9.10选择列数据类型209
- 9.10.1数字类型210
- 9.10.2日期和时间类型211
- 9.10.3字符串类型212
- 9.11进一步学习213
- 9.12下一章213
- 第10章使用MySQL数据库214
- 10.1什么是SQL214
- 10.2在数据库中插入数据215
- 10.3从数据库读取数据217
- 10.3.1读取满足特定条件的数据218
- 10.3.2多表数据读取220
- 10.3.3以特定顺序读取数据224
- 10.3.4数据分组和聚合225
- 10.3.5选择要返回的数据行227
- 10.3.6使用子查询227
- 10.4更新数据库记录229
- 10.5创建后修改表230
- 10.6删除数据库记录232
- 10.7删除表233
- 10.8删除数据库233
- 10.9进一步学习233
- 10.10下一章233
- 第11章使用PHP从Web访问MySQL数据库234
- 11.1Web数据库架构及工作原理234
- 11.2从Web查询数据库238
- 11.2.1检查并过滤输入数据238
- 11.2.2设置连接239
- 11.2.3选择要使用的数据库240
- 11.2.4查询数据库240
- 11.2.5使用prepared statement241
- 11.2.6读取查询结果242
- 11.2.7断开数据库连接243
- 11.3向数据库写入数据243
- 11.4使用其他PHP与数据库交互接口247
- 11.5进一步学习250
- 11.6下一章250
- 第12章MySQL高级管理251
- 12.1深入理解权限系统251
- 12.1.1user表253
- 12.1.2db表254
- 12.1.3tables_priv、columns_priv、procs_priv以及proxies_priv表254
- 12.1.4访问控制:MySQL如何使用Grant表256
- 12.1.5更新权限:更新结果何时生效256
- 12.2提升MySQL数据库安全257
- 12.2.1从操作系统视角看MySQL257
- 12.2.2密码257
- 12.2.3用户权限258
- 12.2.4Web问题258
- 12.3获取数据库的更多信息259
- 12.3.1使用SHOW获取信息259
- 12.3.2使用DESCRIBE获取列信息261
- 12.3.3使用EXPLAIN了解查询的执行过程261
- 12.4优化数据库265
- 12.4.1设计优化265
- 12.4.2权限265
- 12.4.3表优化265
- 12.4.4使用索引266
- 12.4.5使用默认值266
- 12.4.6其他技巧266
- 12.5MySQL数据库备份266
- 12.6MySQL数据库恢复267
- 12.7实现复制267
- 12.7.1设置主服务器268
- 12.7.2执行初始数据传输268
- 12.7.3设置从服务器269
- 12.8进一步学习269
- 12.9下一章269
- 第13章MySQL高级编程270
- 13.1LOAD DATA INFILE语句270
- 13.2存储引擎271
- 13.3事务272
- 13.3.1理解事务定义272
- 13.3.2使用InnoDB 事务272
- 13.4外键273
- 13.5存储过程274
- 13.5.1基础示例274
- 13.5.2本地变量277
- 13.5.3游标和控制结构278
- 13.6触发器281
- 13.7进一步学习283
- 13.8下一章283
- 第三篇Web应用安全性
- 第14章Web应用安全风险286
- 14.1识别面临的安全威胁286
- 14.1.1访问敏感数据286
- 14.1.2数据篡改288
- 14.1.3数据丢失或破坏289
- 14.1.4拒绝服务289
- 14.1.5恶意代码注入291
- 14.1.6被攻破服务器291
- 14.1.7否认292
- 14.2了解对手292
- 14.2.1攻击者和破解者292
- 14.2.2受影响机器的无意识用户293
- 14.2.3不满的员工293
- 14.2.4硬件窃贼293
- 14.2.5我们自己293
- 14.3下一章293
- 第15章构建安全的Web应用294
- 15.1安全策略294
- 15.1.1从正确心态开始295
- 15.1.2安全性和可用性之间的平衡295
- 15.1.3安全监控295
- 15.1.4基本方法296
- 15.2代码安全296
- 15.2.1过滤用户输入296
- 15.2.2转义输出300
- 15.2.3代码组织结构302
- 15.2.4代码自身问题303
- 15.2.5文件系统因素303
- 15.2.6代码稳定性和缺陷304
- 15.2.7执行命令305
- 15.3Web服务器和PHP的安全306
- 15.3.1保持软件更新306
- 15.3.2查看php.ini文件307
- 15.3.3Web服务器配置307
- 15.3.4Web应用共享主机托管服务308
- 15.4数据库服务器的安全308
- 15.4.1用户和权限系统308
- 15.4.2发送数据至服务器309
- 15.4.3连接服务器309
- 15.4.4运行服务器310
- 15.5保护网络310
- 15.5.1防火墙310
- 15.5.2使用隔离区311
- 15.5.3应对DoS和DDoS攻击311
- 15.6计算机和操作系统的安全312
- 15.6.1保持操作系统更新312
- 15.6.2只运行必需的软件312
- 15.6.3服务器的物理安全312
- 15.7灾难计划313
- 15.8下一章313
- 第16章使用PHP实现身份验证方法314
- 16.1识别访问者314
- 16.2实现访问控制315
- 16.2.1保存密码317
- 16.2.2加密密码318
- 16.2.3保护多页面319
- 16.3使用基本认证320
- 16.4在PHP中使用基本认证320
- 16.5使用Apache的.htaccess基本认证321
- 16.6创建自定义认证324
- 16.7进一步学习325
- 16.8下一章325
- 第四篇PHP高级编程技术
- 第17章与文件系统和服务器交互328
- 17.1上传文件328
- 17.1.1文件上传的HTML329
- 17.1.2编写处理文件的PHP脚本330
- 17.1.3会话上传进度334
- 17.1.4避免常见上传问题335
- 17.2使用目录函数336
- 17.2.1从目录读入336
- 17.2.2获取当前目录信息340
- 17.2.3创建和删除目录340
- 17.3与文件系统交互341
- 17.3.1获取文件信息341
- 17.3.2修改文件属性343
- 17.3.3创建、删除和移动文件344
- 17.4使用程序执行函数344
- 17.5与环境交互:getenv()和putenv()347
- 17.6进一步学习347
- 17.7下一章347
- 第18章使用网络和协议函数348
- 18.1了解可用协议348
- 18.2发送和读取邮件349
- 18.3使用其他站点数据349
- 18.4使用网络查询函数352
- 18.5备份或镜像文件355
- 18.5.1使用FTP备份或镜像文件356
- 18.5.2上传文件362
- 18.5.3避免超时362
- 18.5.4使用其他FTP函数362
- 18.6进一步学习363
- 18.7下一章363
- 第19章管理日期和时间364
- 19.1在PHP中获得日期和时间364
- 19.1.1理解时区364
- 19.1.2使用date()函数365
- 19.1.3处理UNIX时间戳366
- 19.1.4使用getdate()函数368
- 19.1.5使用checkdate()函数验证日期369
- 19.1.6格式化时间戳369
- 19.2PHP和MySQL的日期格式互转371
- 19.3在PHP中计算日期372
- 19.4在MySQL中计算日期373
- 19.5使用微秒374
- 19.6使用日历函数375
- 19.7进一步学习375
- 19.8下一章376
- 第20章国际化与本地化377
- 20.1本地化不只是翻译377
- 20.2理解字符集378
- 20.2.1字符集的安全风险379
- 20.2.2使用PHP多字节字符串函数379
- 20.3创建可本地化页面基础结构380
- 20.4在国际化应用中使用gettext()函数383
- 20.4.1配置系统使用gettext()383
- 20.4.2创建翻译文件384
- 20.4.3使用gettext()在PHP中实现本地化内容385
- 20.5进一步学习386
- 20.6下一章386
- 第21章生成图像387
- 21.1设置PHP图像支持387
- 21.2理解图像格式388
- 21.2.1JPEG388
- 21.2.2PNG388
- 21.2.3GIF389
- 21.3创建图像389
- 21.3.1创建画布图像390
- 21.3.2在图像上绘制或打印文本390
- 21.3.3最终图形输出392
- 21.3.4清理393
- 21.4在其他页面中使用自动创建的图像393
- 21.5使用文本和字体创建图像394
- 21.5.1设置基础画布397
- 21.5.2调整按钮文本大小398
- 21.5.3文本定位400
- 21.5.4在按钮上写入文本401
- 21.5.5完成401
- 21.6绘制图形图像数据401
- 21.7使用其他图像函数409
- 21.8下一章409
- 第22章使用PHP会话控制410
- 22.1什么是会话控制410
- 22.2理解基本会话功能410
- 22.2.1什么是cookie411
- 22.2.2通过PHP设置cookie411
- 22.2.3在会话中使用cookie412
- 22.2.4保存会话ID412
- 22.3实现简单会话412
- 22.3.1启动会话413
- 22.3.2注册会话变量413
- 22.3.3使用会话变量413
- 22.3.4销毁变量和会话414
- 22.4创建简单会话示例414
- 22.5配置会话控制416
- 22.6使用会话控制实现身份验证417
- 22.7下一章423
- 第23章JavaScript与PHP集成424
- 23.1理解AJAX424
- 23.2jQuery概述425
- 23.3在Web应用中使用jQuery425
- 23.4在PHP中使用jQuery和AJAX434
- 23.4.1支持AJAX的聊天脚本/服务器434
- 23.4.2jQuery AJAX方法437
- 23.4.3聊天客户端/jQuery应用439
- 23.5进一步学习445
- 23.6下一章445
- 第24章PHP的其他有用特性446
- 24.1字符串计算函数:eval()446
- 24.2终止执行:die()和exit()447
- 24.3序列化变量和对象448
- 24.4获取PHP环境信息448
- 24.4.1找到已载入的扩展449
- 24.4.2识别脚本属主450
- 24.4.3获知脚本被修改时间450
- 24.5临时修改运行时环境450
- 24.6高亮源代码451
- 24.7在命令行上使用PHP452
- 24.8下一章453
- 第五篇构建实用的PHP和MySQL项目
- 第25章在大型项目中使用PHP和MySQL456
- 25.1在Web开发中应用软件工程技术457
- 25.2规划和运营Web应用项目457
- 25.3代码重用458
- 25.4编写可维护代码458
- 25.4.1代码标准459
- 25.4.2代码分解461
- 25.4.3使用标准目录结构462
- 25.4.4文档化和共享内部函数462
- 25.5实现版本控制462
- 25.6选择开发环境463
- 25.7项目文档化463
- 25.8原型定义464
- 25.9隔离逻辑和内容464
- 25.10代码优化465
- 25.11测试466
- 25.12进一步学习466
- 25.13下一章467
- 第26章调试和日志468
- 26.1编程错误468
- 26.1.1语法错误468
- 26.1.2运行时错误469
- 26.1.3逻辑错误474
- 26.2变量调试辅助475
- 26.3错误报告级别477
- 26.4修改错误报告设置478
- 26.5触发自定义错误479
- 26.6错误日志记录480
- 26.7错误日志文件482
- 26.8下一章483
- 第27章构建用户身份验证和个性化484
- 27.1解决方案组件484
- 27.1.1用户识别和个性化485
- 27.1.2保存书签485
- 27.1.3推荐书签485
- 27.2解决方案概述486
- 27.3实现数据库487
- 27.4实现基本网站488
- 27.5实现用户身份验证491
- 27.5.1用户注册491
- 27.5.2登录496
- 27.5.3退出500
- 27.5.4修改密码501
- 27.5.5重设密码502
- 27.6实现书签存储和读取507
- 27.6.1添加书签507
- 27.6.2显示书签509
- 27.6.3删除书签510
- 27.7实现书签推荐513
- 27.8考虑可能的扩展516
- 第28章使用Laravel构建基于Web的电子邮件客户端(第一部分)517
- 28.1Laravel 5介绍517
- 28.1.1创建Laravel新项目517
- 28.1.2Laravel应用结构518
- 28.1.3Laravel请求周期与MVC模式519
- 28.1.4理解Laravel模型、视图和控制器类520
- 第29章使用Laravel构建基于Web的电子邮件客户端(第二部分) 536
- 29.1使用Laravel构建简单的IMAP客户端536
- 29.1.1PHP IMAP函数536
- 29.1.2为Laravel应用封装IMAP544
- 29.2创建基于Web的电子邮件客户端561
- 29.2.1实现ImapServiceProvider562
- 29.2.2Web客户端认证页面563
- 29.2.3实现主视图567
- 29.2.4实现删除和发送邮件576
- 29.3小结581
- 第30章社交媒体集成分享以及验证582
- 30.1OAuth:Web服务认证582
- 30.1.1认证码授权583
- 30.1.2隐式授权584
- 30.1.3创建Instagram Web客户端585
- 30.1.4Instagram的点赞照片功能593
- 30.2小结594
- 第31章构建购物车595
- 31.1解决方案组件595
- 31.1.1构建在线类目596
- 31.1.2记录用户希望购买的商品596
- 31.1.3实现支付系统596
- 31.1.4构建管理界面597
- 31.2解决方案概述597
- 31.3实现数据库599
- 31.4实现在线类目601
- 31.4.1类目列表603
- 31.4.2类目图书清单605
- 31.4.3显示图书详情607
- 31.5实现购物车608
- 31.5.1使用show_cart.php脚本609
- 31.5.2查看购物车612
- 31.5.3向购物车中添加商品614
- 31.5.4保存更新的购物车615
- 31.5.5打印标题栏总结信息616
- 31.5.6结账617
- 31.6实现支付622
- 31.7实现管理界面624
- 31.8扩展项目631
- 附录A安装Apache、PHP和MySQL632