PHP动态网站开发实践教程教案第7章.docx
《PHP动态网站开发实践教程教案第7章.docx》由会员分享,可在线阅读,更多相关《PHP动态网站开发实践教程教案第7章.docx(17页珍藏版)》请在冰点文库上搜索。
PHP动态网站开发实践教程教案第7章
授课课题
第7章PHP操作数据库
7.1PHP中常用的数据库扩展
7.2PHP操作数据库的一般步骤
7.3PHP操作数据库的方法
授课
形式
理论教学
学时
2
教学目的
与要求
1.了解PHP中常用的数据库扩展;
2.掌握PHP操作数据库的一般步骤;
3.掌握PHP操作数据库的方法。
教学重点
和难点
1.PHP操作数据库的一般步骤;
2.PHP操作数据库的方法。
教学方法
与手段
1.讲练结合和演示法
2.利用多媒体计算机辅助教学
教学内容及过程设计
一、引入新课
1.老师组织学生回顾在MySQL中如何实现数据的增删查改操作,进而提出问题:
如何在PHP中实现对数据库中数据的增删查改操作?
2.老师演示一个PHP显示数据和增加数据的案例,让学生继续思考在刚才的案例中数据从何处来?
数据又是如何写入数据表中去?
激发学生的学习兴趣。
二、学习新知
1.PHP中常用的数据库扩展
PHP本身并不能直接操作数据库,而是要借助相应的数据库扩展来实现PHP应用和数据库之间的交互。
PHP中常用的数据库扩展有MySQL、MySQLi和PDO三种方式。
重点分别介绍三种扩展方式的特点。
2.PHP操作数据库的一般步骤
组织学生回忆去图书馆借还书的步骤:
找到图书馆→刷卡认证→选择书库→进行借还操作→离开图书馆
引出PHP操作数据库的一般步骤:
连接数据库服务器、选择数据库、执行SQL语句、处理执行结果、关闭连接和释放资源五个步骤
3.PHP操作数据库的方法
(1)连接数据库服务器
讲解:
MySQLi扩展提供了mysqli_connect()函数来进行连接,其基本语法如下:
mysqlimysqli_connect([string$host[,string$username[,string$password[,
string$dbname
[,string$port[,string$socket]]]]]]);
执行成功返回一个MySQLi对象,表示到MySQL服务器的连接;执行失败则返回false。
演示:
连接数据库服务器
(2)删除Cookie
讲解:
一台数据库服务器上可创建多个数据库,使用PHP进行数据库操作时需指定本次操作的数据库名称。
在使用mysqli_connect()函数连接数据库服务器时可通过第4个参数指定要操作的数据库名称,也可以在连接数据库服务器后使用mysqli_select_db()函数选择要操作的数据库。
mysqli_select_db()函数的语法如下:
boolmysqli_select_db(mysqli$link,string$dbname);
(3)设置编码方式
PHP访问MySQL时使用的字符集可以使用mysqli_set_charset()函数设置,其语法如下:
boolmysqli_set_charset(mysqli$link,string$charset);
强调:
为避免乱码,建议将PHP文件的header头编码、网页的标记、PHP访问MySQL时使用的字符集、MySQL数据库的字符集设置为统一的字符集。
(4)执行SQL语句
MySQLi扩展提供了mysqli_query()函数实现对数据库发送、执行SQL语句。
其语法如下:
mixedmysqli_query(mysqli$link,string$query[,int$resultmode]);
(5)读取结果集
讲解:
mysqli_query()函数执行查询类SQL语句返回的mysqli_result对象不能直接被使用,需要将对象中的数据取出保存在数组中才能在页面中进行输出显示。
MySQLi扩展提供的处理结果集的函数有mysqli_fetch_assoc()、mysqli_fetch_row()、mysqli_fetch_array()、mysqli_fetch_object()、mysqli_fetch_all()。
演示:
例7-1比较读取结果集的几种方法
(6)释放资源和关闭连接
mysqli_free_result()函数用于关闭结果集对象,以释放系统资源,其语法如下:
voidmysqli_free_result(resource$result)
mysqli_close()函数用于断开与MySQL数据库服务器的连接,其语法如下:
boolmysqli_close(mysqli$link)
三、课堂小结,布置作业
对这节的主要内容进行总结,布置作业。
最后留几分钟让学生和老师或者同学之间互相讨论,加深课程内容印象,及时提出问题、解决问题。
作业
无
教学反思
授课课题
第7章PHP操作数据库
7.4.1数据显示
7.4.2数据搜索
授课
形式
理论教学
学时
2
教学目的
与要求
1.掌握数据显示的实现方法;
2.掌握数据搜索的实现方法。
教学重点
和难点
1.数据显示的实现方法;
2.数据搜索的实现方法。
教学方法
与手段
1.讲练结合和演示法
2.利用多媒体计算机辅助教学
教学内容及过程设计
一、引入新课
展示本节课要实现的案例效果,引导学生讨论案例的应用场景并简单思考分析其实现的流程,引入新课。
二、学习新知
1.数据显示
(1)准备数据
创建一张学生党员信息表memberInfo,表中包含学号、姓名、性别、班级、入党时间字段。
(2)分离数据库连接
为避免频繁书写数据库连接代码,提高代码的可维护性,通常将数据库连接单独写带一个文件中,在需要进行数据库操作前通过include、include_once、require或require_once等语句以文件包含的形式将其引入即可。
(3)制作数据文件
数据文件中需要首先加载数据库连接文件conn.php,然后执行相关查询语句,之后使用mysqli_fetch_all()函数将结果集中的数据读取到二维数组$dataArr中,最后加载视图文件进行显示即可。
(4)制作视图文件
在视图文件中制作一个两行五列的表格,其中表格第一行为表头,第二行为循环体。
在视图文件中内嵌PHP代码,遍历输出数据文件查询得到的数据数组$dataArr即可实现数据显示
2.数据搜索
随着信息量增多,要想精确地查看某一个党员信息就比较困难,为实现方便、快捷地查找所需党员信息,在数据显示的基础上增加数据搜索功能。
初始状态仍显示所有党员信息,同时可根据党员姓名进行模糊搜索。
分析搜索功能的实现原理:
根据用户输入的关键词使用LIKE进行模糊查询即可。
(1)添加搜索表单
在数据显示功能的视图文件中增加一个表单,表单中包含一个文本框和一个提交按钮。
此外,为便于后续在对搜索结果进行分页时同时传递搜索关键词参数,在这里采用GET方式提交表单。
(2)构造模糊查询
由于初始状态显示所有党员信息,因此定义SQL语句初值为查询memberInfo中所有信息,如果通过GET方式获取到用户提交的数据则在原有基础上拼接where条件构造模糊查询语句。
由于用户可通过表单提交任意数据,出于安全角度考虑使用mysqli_real_escape_string()函数对SQL语句中的特殊字符进行转义处理。
(3)多关键词搜索
多关键字搜索是指用户可以一次输入两个或两个以上的关键字进行搜索,关键字之间一般用空格分隔。
与单关键字搜索相比,这种搜索方式更为灵活,在实际应用中使用更为广泛。
多关键词搜索的原理:
首先使用explode()函数将用户提交的关键字根据“空格”分隔符拆分为数组,然后遍历这个关键字数组,在循环体中构造多个where查询条件,多个条件之间为or关系。
在循环结束之后使用rtrim()函数去除右侧多余的“or”即可拼接成完整的查询语句。
三、课堂小结,布置作业
对这节的主要内容进行总结,布置作业。
最后留几分钟让学生和老师或者同学之间互相讨论,加深课程内容印象,及时提出问题、解决问题。
作业
7.7实践操作
教学反思
授课课题
第7章PHP操作数据库
7.4.3数据分页
授课
形式
理论教学
学时
2
教学目的
与要求
1.掌握数据分页的原理;
2.掌握数据分页的实现方法。
教学重点
和难点
1.数据分页的原理;
2.数据分页的实现方法。
教学方法
与手段
1.讲练结合和演示法
2.利用多媒体计算机辅助教学
教学内容及过程设计
一、引入新课
展示本节课要实现的案例效果,引导学生讨论案例的应用场景并简单思考分析其实现的流程,引入新课。
二、学习新知
学生党员数量会不断增多,在一个页面中一次显示所有学生党员信息不仅可读性差,也会影响页面加载的速度。
一般地,当数据量较大时会对数据进行分页显示。
1.两种数据分页方式
由数据分页效果引出数据分页的两种方式:
物理分页和逻辑分页。
进一步介绍物理分页和逻辑分页的概念和优、缺点。
(1)物理分页依赖于数据库这个物理实体,在MySQL数据库中依赖limit子句来实现。
物理分页在每次翻页时都需要访问数据库以获取当前页的数据,所占用的内存空间较少,但需要频繁操作数据库,因此对数据库服务器造成的压力较大。
(2)逻辑分页则是一次从数据库中读取全部数据,然后由程序人员通过相应的代码控制每页应该显示的数据范围。
逻辑分页减少了对数据库服务器的访问次数,但却需占用较多的内存开销,且不能实时反映出数据库中的最新数据变化,适合数据量较小且数据变化频率较低的场合。
2.分页的原理
借助LIMIT子句可用于强制SELECT语句返回指定的记录数。
在LIMIT子句中需要确定偏移量和记录数,记录数由每页显示的数据量来确定,偏移量和当前的页数有关,偏移量offset=(page-1)*pageSize,因此只需要确定当前是第几页即可实现数据分页,而页码可在浏览数据时通过GET方式传递。
3.实现数据分页
1)定义每页显示的记录数;
2)查询数据表中的总记录数,将总记录数除以每页显示的记录数并向上取整得到总页码;
3)对传入的页码进行最大、最小临界值验证,判断页码的合法性;
4)计算当前页读取数据的偏移量;
5)执行带有LIMIT子句的SQL语句并处理结果集;
6)加载视图文件进行显示。
演示:
数据分页的实现
4.查询参数的处理
演示:
根据以上讲解对搜索结果进行分页,在翻页时出现所有的数据而并非搜索结果的第二页数据,组织学生思考出现这种情况的原因是什么?
教师总结:
由于在翻页时没有传递搜索的关键词导致搜索关键词丢失,故显示的是对所有数据的分页结果。
教师提问:
如何在翻页的同时传递查询参数?
讲解:
在处理这类查询参数时,首先通过$_GET来获取所有的GET传值,在得到的数组$params中包含了当前的页码参数page和其他参数,由于翻页时需传递新的page参数,故使用unset()函数删除$params中的原有page参数,然后使用http_build_query()函数将数组$data生成为一个经过URLencode的请求字符串,最后再拼接上新的page参数值。
演示:
对搜索结果进行分页
5.对分页导航进行优化
假设以当前页码为中心显示左右各3页的页码,定义$pageOffset表示页码偏移量,$pageHtml表示分页导航对应的HTML内容。
如果当前页码减去偏移量大于1则显示首页页码,如果当前页码加上偏移量小于总页码则显示尾页页码,然后循环输出以当前页码为中心的左右页码即可。
强调:
在循环输出过程中需要对页码的边界值进行验证,避免出现非法页码。
对于当前页码添加样式表中定义的current样式,以高亮显示当前页码。
5.分页效率的优化
可在查询过程中记录上一页数据中最后一条数据的ID,假设上一页最后一条数据的ID是198711,然后通过下面的语句来读取当前页10条数据:
select*frommemberInfowhereid>198711orderbyiddesclimit10
三、课堂小结,布置作业
对这节的主要内容进行总结,布置作业。
最后留几分钟让学生和老师或者同学之间互相讨论,加深课程内容印象,及时提出问题、解决问题。
作业
7.7实践操作
教学反思
授课课题
第7章PHP操作数据库
7.4.4数据添加
7.4.5数据修改
7.4.6数据删除
授课
形式
理论教学
学时
2
教学目的
与要求
1.掌握数据添加的实现方法;
2.掌握数据修改的实现方法;
3.掌握数据删除的实现方法。
教学重点
和难点
1.数据添加的实现方法;
2.数据修改的实现方法;
3.数据删除的实现方法。
教学方法
与手段
1.讲练结合和演示法
2.利用多媒体计算机辅助教学
教学内容及过程设计
一、引入新课
展示本节课要实现的案例效果,引导学生讨论案例的应用场景并简单思考分析其实现的流程,引入新课。
二、学习新知
1.数据添加
(1)制作添加表单
在表单中需要添加文本框、单选按钮、下拉列表、日期等表单元素,并为每个表单元素添加name属性值以便于获取用户输入的内容。
当提交表单时,以POST方式提交给当前页面
(2)处理表单数据
在数据文件中,首先通过$_POST判断有无提交表单。
如果没有提交表单则加载表单视图文件,显示添加页面;如果提交了表单则首先获取用户填写的相应数据,然后拼接组成一个完整的INSERT语句,最后执行该语句实现数据添加功能。
(3)优化添加语句
在实现数据添加功能时,如需填写的信息比较多,则在数据文件中需要一一获取用户填写的信息并拼接SQL语句,操作较为繁琐且容易出错。
针对添加单条数据的操作,可使用insertintoset语句代替insert语句实现自动拼接。
insertintoset语句的语法如下:
insertintotablesetfield1=value1,field2=value2…
首先使用$_POST一次获取用户提交的所有数据,然后遍历该数组,在循环体中自动拼接完成insertintoset语句中field和value的对应关系。
循环结束后使用rtrim()函数去除语句最右侧多余的逗号即可得到完整的添加语句。
2.数据修改
(1)制作“修改”链接
单击该链接跳转到数据修改页面modify.php,同时使用GET方式传递当前数据所对应的主键值,以便于在数据修改页面显示该信息的原始数据。
(2)制作修改表单
修改表单与数据添加的表单相同,只是在表单中通过添加value属性来显示该信息的原始数据。
(3)实现数据修改
在数据修改的数据文件中判断是否提交表单,如未提交表单则根据接收的mebID值查询原始数据信息;如提交表单则做数据更新操作。
实现数据更新的过程与数据添加的过程类似,需要用update语句代替insertintoset语句,且要注意拼接更新条件。
强调:
执行更新语句update时一定要注意添加where条件,否则将会更新所有数据,且操作不可逆。
3.数据删除
(1)制作“删除”链接
单击“删除”链接时通过GET方式传递要删除信息的主键值,同时为避免误操作使用JavaScript中的confirm()方法弹出消息框再次提醒用户是否确定删除。
(2)实现删除操作
接收GET方式传递的主键值,然后拼接完整的delete语句并执行即可完成数据删除功能。
三、课堂小结,布置作业
对这节的主要内容进行总结,布置作业。
最后留几分钟让学生和老师或者同学之间互相讨论,加深课程内容印象,及时提出问题、解决问题。
作业
7.7实践操作
教学反思
授课课题
第7章PHP操作数据库
7.5PHP操作数据库常见错误分析
7.6数据库操作中的常见Web安全问题分析与防御
授课
形式
理论教学
学时
2
教学目的
与要求
1.了解PHP操作数据库常见错误及排错方法;
2.掌握数据库操作中的常见Web安全问题与防御措施。
教学重点
和难点
数据库操作中的常见Web安全问题与防御措施。
教学方法
与手段
1.讲练结合和演示法
2.利用多媒体计算机辅助教学
教学内容及过程设计
一、引入新课
7.5节安排学生课前自主学习。
(1)演示一个用户登录的案例,在用户名出输入1’or1=1#,密码处输入任意内容,点击“登录”按钮进行登录,结果登录成功。
(2)组织学生思考讨论为什么会登录成功?
(3)教师将案例中本次执行的查询语句进行打印输出并总结出现这种情况的原因。
二、学习新知
1.SQL注入
攻击者通过把非法的SQL命令插入到Web表单中或页面请求查询字符串中提交给服务器,最终达到欺骗服务器执行恶意SQL语句的目的。
SQL注入包含常规注入、宽字节注入、Base64编码注入等。
(1)原理分析
开发者没有对用户提交的数据进行过滤或者过滤被攻击者绕过,从而在将获取的用户数据拼接到SQL语句中执行时,被用户插入的恶意SQL代码非法操作数据库,导致敏感信息泄露或数据库被破坏,甚至其他更为严重的后果。
(2)防御方法
针对SQL注入产生的原因,避免将用户传递的数据直接拼接在SQL语句中即可防止SQL注入。
在PHP操作数据库中MySQLi扩展和PDO扩展均提供了相应的预处理函数来实现参数化查询。
1)创建预编译对象
mysqli_prepare()函数用于做好执行SQL语句的准备,其基本语法如下:
mysqli_stmtmysqli_prepare(mysqli$link,string$query)
强调:
通过预编译,SQL引擎会预先进行语法分析,产生语法树,生成执行计划,此后无论用户提交什么数据都只会作为字符串字面值参数而不会作为SQL命令来执行,因此预编译可以有效防御SQL注入。
2)绑定参数
mysqli_stmt_bind_param()函数用于将变量作为参数绑定到mysqli_prepare()创建的预编译SQL语句中,其基本语法如下:
boolmysqli_stmt_bind_param(mysqli_stmt$stmt,string$types,mixed&$var1[,mixed&$...])
3)执行预处理语句
mysqli_stmt_execute()函数用于执行由mysqli_prepare()函数创建的预编译对象,执行时所有的参数标记将被替换成绑定的参数,其基本语法如下:
boolmysqli_stmt_execute(mysqli_stmt$stmt)
mysqli_stmt_execute()函数中stmt表示由mysqli_prepare()创建的预编译对象,该函数执行成功返回true,执行失败返回false。
如果执行的语句是UPDATE、DELETE或INSERT等非查询语句,则可以使用mysqli_stmt_affected_rows()函数来确定受影响行的总数。
如果执行的是SELECT等类型的查询语句,则可以使用mysqli_stmt_get_result()函数从执行后的预编译对象中获取结果集,其基本语法如下:
mysqli_resultmysqli_stmt_get_result(mysqli_stmt$stmt)
演示:
使用参数化查询改进用户登录案例并再次使用课前的测试数据进行测试。
强调:
在参数化查询中,模糊匹配的通配符在绑定参数时进行处理。
2.CSRF跨站请求伪造
攻击者盗用了用户的身份,并以用户的名义向第三方网站发送恶意请求。
通过CRSF可以盗用用户的身份发邮件、发短信、进行交易转账等。
(1)原理分析
CSRF的原理是在用户已登录受信任服务器的前提下,攻击者诱导访问攻击者服务器,然后在攻击者服务器返回的页面中嵌入代码,从而在用户不知情的情况下以受害者的名义向受信任服务器发起请求,实现在并未授权的情况下执行在权限保护之下的操作。
(2)防御方法
防御的基本思想是在请求中放入攻击者不能伪造的信息,并且该信息不存在于Cookie中,然后在受信任服务器端以此信息作为判断正常访问和非法访问的标准。
常用的防御CSRF的方法有验证HTTPReferer字段、token验证、在HTTP头中自定义属性等。
1)生成token
用户访问页面时,生成一个伪随机数token,将其保存在服务器Session中,同时在页面中隐藏保存该随机数,用户正常发起请求时会一并携带token值,而通过CSRF发起的欺骗性攻击中由于无法事先获取token,导致不能正常回传token值而被服务器拒绝请求。
强调:
加入token验证后要考虑“并行会话的兼容”,即如果用户在一个站点上同时打开了多个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交,因此生成的token应该保存在数组中,从而避免多个token之间的相互覆盖。
2)Web表单保存token
在Web表单中通过隐藏域保存生成的token值。
3)验证token
在服务端接收到token后验证该值是否有效,验证有效后为防止重复使用应及时将其删除。
三、课堂小结,布置作业
对这节的主要内容进行总结,布置作业。
最后留几分钟让学生和老师或者同学之间互相讨论,加深课程内容印象,及时提出问题、解决问题。
作业
7.7实践操作
教学反思