1、 PHP Web开发实战8.4 新闻分类管理功能的设计2本节主要内容本节主要内容l PDO(PHP Data Object)的介绍l 使用PDO实现数据库操作层,实现数据库的CRUD l 基于PDO数据库操作层实现新闻分类数据访问层l 新闻分类列表页面的设计l 新闻分类编辑页面的设计l 新闻分类添加页面的设计3PDO 概述及其使用概述及其使用l 在早前的PHP版本中,各种不同的数据库扩展各不兼容,每个扩展都有各种的操作函数,导致PHP的维护非常困难,可移植性也非常差。l 为了解决这一问题,PHP开发了PDO数据库抽象层,当选择不同的数据库时,只需修改PDO中的DSN(数据源)即可。4PDO的安
2、装的安装l 安装PHP 5.1以上版本都会默认安装PDO,但在使用之前,仍需进行一些相关的配置,打开PHP的配置文件php.ini,在Dynamic Extensions一节中,将希望使用的数据库PDO扩展库前面的注释去掉,重新启动服务器即可。;extension=PHP_pdo_mssql.dll /MSSQL Server PDO访问驱动访问驱动extension=PHP_pdo_mysql.dll /MySQL Server PDO访问驱动访问驱动;extension=PHP_pdo_oci.dll /Oracle PDO访问驱动访问驱动extension=PHP_pdo_odbc.dl
3、l /ODBC PDO访问驱动访问驱动extension=PHP_pdo_sqlite.dll /Sqlite PDO访问驱动访问驱动5PDO访问访问数据库数据库的一般步骤的一般步骤l 连接数据库;l 设置字符集;l 创建结果集;l 读取一条记录到数组;l 将数组元素显示在页面上6创建创建PDO对象连接数据库对象连接数据库l 在使用PDO与数据库交互之前,必须先创建PDO对象。l 对象名=new PDO(DSN, username, password, driver_options); DSN是数据源名称,用来指定一个要连接的数据库和连接使用的驱动程序,其语法格式:驱动程序名:参数名=参数值;
4、 参数名=参数值例如,连接MySQL数据库和连接Oracle数据库的DSN格式分别如下:mysql:host=localhost;dbname=db_news;oci:dbname=/localhost:1521/mydb7示例:示例:PDO连接到连接到MySQL的的db_news数据库数据库try $dsn=mysql:host=localhost;dbname=db_news; $conn=new PDO($dsn, root, root); $conn-query(set names utf8); echo 数据库连接成功数据库连接成功!; catch(PDOException $ex)
5、 print Error: .$ex-getMessage(). ; die();连接到连接到mysql数据库的数据库的dsn创建创建PDO对象对象$conn,用来连接数据库,用来连接数据库8PDO类中常用方法类中常用方法序号序号方法名方法名描述描述1query()执行一条有结果集返回的SQL语句,并返回一个结果集PDOStatement对象2exec()执行一条SQL语句,并返回所影响的记录数3lastInsertId()获取最近一条插入到表中记录的自增id值4prepare()负责准备要执行的SQL语句,用于执行存储过程等9使用使用prepare方法执行预处理语句方法执行预处理语句l PD
6、O提供了对所预处理语句的支持,预处理语句的作用是:编译一次,多次执行。l 它会在服务器缓存查询的语法和执行过程,而只在服务器和客户端之间传输有变化的列值,从而减少额外的开销,同时对于复杂查询来说,通过预处理语句可以避免重复分析、编译和优化的环境,并能有效防止SQL注入。10使用使用PDO 实现数据库操作层实现数据库操作层l 打开网站examples,打开文件夹“chapter8”下的“common”文件夹,新增一个PHP文件,并将文件重命名为“pdo_common.php”,用来实现PDO数据库访问方法。11使用使用PDO 实现数据库操作层实现数据库操作层 function pdo_get_c
7、onnect()/数据库默认连接信息数据库默认连接信息$config = array(host = 127.0.0.1,user = root,password = root,charset = utf8,dbname = db_news, port = 3306);try $dsn=mysql:host=.$confighost.;dbname=.$configdbname; $link=new PDO($dsn,$configuser,$configpassword); $link-query(set names .$configcharset);catch(PDOException $e
8、x)die(数据库连接失败数据库连接失败!) . $ex-getMessage(); return $link; 使用关联数组保存数据库的各项默认连接信息使用关联数组保存数据库的各项默认连接信息mysql数据库的数据库的dsn连接信息连接信息设置数据库字符编码设置数据库字符编码12使用使用PDO 实现数据库操作层实现数据库操作层 /执行查询操作执行查询操作function pdo_execQuery($strQuery,$params) $link=pdo_get_connect(); $stmt=$link-prepare($strQuery); $stmt-execute($params)
9、; $result=$stmt-fetchAll(PDO:FETCH_ASSOC); return $result; /执行增、删、改操作执行增、删、改操作 function pdo_execUpdate($strUpdate,$params) $link= pdo_get_connect(); $stmt=$link-prepare($strUpdate); $result=$stmt-execute($params); return $result; 使用使用preaprea方法处理预处理语句方法处理预处理语句13使用使用PDO 实现新闻分类数据访问层实现新闻分类数据访问层l 打开网站ex
10、amples,打开文件夹“chapter8”下的“common”文件夹,新增一个PHP文件,并将文件重命名为“pdo_newsclass.dao.php”,用来实现PDO方法的新闻分类表的数据访问层。require_once pdo_common.php;/添加新闻分类添加新闻分类function addNewsClass($classname,$classdesc) $sql = insert into tbl_newsclass (classname,classdesc) values (?,?); $params=array($classname,$classdesc); $result
11、=pdo_execUpdate($sql,$params);return $result; 带带?占位符的占位符的sql语句,意味着这两个值为参数语句,意味着这两个值为参数创建参数数组,参数值分别为创建参数数组,参数值分别为$classname和和$classdesc的值的值14使用使用PDO 实现新闻分类数据访问层实现新闻分类数据访问层/编辑新闻分类编辑新闻分类function updateNewsClass($classname,$classdesc,$classid) $sql = update tbl_newsclass set classname=?,classdesc=? wher
12、e classid=?; $params=array($classname,$classdesc,$classid); $result=pdo_execUpdate($sql,$params); return $result;/删除新闻分类删除新闻分类function deleteNewsClass($classid) $sql=delete from tbl_newsclass where classid=?; $params=array($classid); $result=pdo_execUpdate($sql,$params); return $result;15使用使用PDO 实现新
13、闻分类数据访问层实现新闻分类数据访问层/根据编号查找新闻分类根据编号查找新闻分类function findNewsClassById($classid) $sql = select * from tbl_newsclass where classid=?; $params=array($classid); $result=pdo_execQuery($sql,$params); if(count($result)0)return $result0; return $result; /查找新闻分类信息查找新闻分类信息function findNewsClass() $sql = select *
14、 from tbl_newsclass ; $params=array(); $result=pdo_execQuery($sql,$params); return $result; 16新闻分类列表新闻分类列表页页设计思路设计思路l 新闻类别列表实现对所有已有新闻分类的管理,包括新闻分类的编辑和新闻分类的删除。l 若新闻分类下有新闻存在,则不能删除新闻分类。删除操作在列表通过用户确认操作后,可以在同一页面完成。l 编辑操作将跳转到新闻分类编辑页面完成。17新闻分类列表新闻分类列表页页的功能设计的功能设计 18新闻分类列表页新闻分类列表页的功能设计的功能设计 $newsclass_rst=fi
15、ndNewsClass(); if(isset($_GETid) $news_rst= findNewsByClassid($_GETid); if(!empty($news_rst) alertGo(该新闻分类下有新闻,不能删除该新闻分类下有新闻,不能删除,newsclasslist.php); $result=deleteNewsClass($_GETid); if($result) alertGo(新闻分类删除成功新闻分类删除成功,newsclasslist.php); 19新闻分类列表页新闻分类列表页的功能设计的功能设计 新闻类别管理新闻类别管理 > 类别列表类别列表 编号编号分
16、类标题分类标题分类描述分类描述操作操作 a href=updateNewsclass.php?id=编辑编辑 a href=?id= onclick=javascript:if(confirm(确定要删除此信息吗?确定要删除此信息吗?)return true;return false;删除删除 . 跳转地址仅有参数跳转地址仅有参数id,意味着跳转在网页自身的同时传递参数,意味着跳转在网页自身的同时传递参数id,js代代码由用户确认删除操作。码由用户确认删除操作。20新闻分类编辑新闻分类编辑页页设计思路设计思路l 用户访问新闻列表管理页面,可以选定新闻进行编辑,即可跳转到
17、新闻分类编辑页面。21新闻分类编辑新闻分类编辑页页的功能设计的功能设计编辑新闻类别信息编辑新闻类别信息若若$_GET变量有值传入的话,则将变量有值传入的话,则将id变量提取出来变量提取出来22新闻分类编辑页新闻分类编辑页的功能设计的功能设计 新闻类别管理新闻类别管理 > 编辑新闻类别信息编辑新闻类别信息 input type=hidden name=classid value=/ 新闻类别标题:新闻类别标题:input type=text class=form-text name=classname value= 新闻类别描述:新闻类别描述: . 思考:若用户直接在地址栏输入思考:若用户
18、直接在地址栏输入updateNewsclass.php地址,但没有地址,但没有传递传递id值,会发生什么问题?如何解决?值,会发生什么问题?如何解决?23新闻分类编辑处理页面新闻分类编辑处理页面doUpdateNewsclass.php require ./common/pdo_newsclass.dao.php $error=array(); if(empty($error) $rs=updateNewsClass($save_dataclassname,$save_dataclassdesc,$save_dataclassid); if($rs) alertGo(新闻类别编辑成功新闻类别编辑成功,newsclasslist.php); else alertBack(新闻类别编辑失败新闻类别编辑失败); else/调用公共文件调用公共文件error.php显示错误提示信息显示错误提示信息 require ./common/error.php; 24