中级篇项目二内容管理系统.ppt
《中级篇项目二内容管理系统.ppt》由会员分享,可在线阅读,更多相关《中级篇项目二内容管理系统.ppt(110页珍藏版)》请在三一办公上搜索。
1、【中级篇】项目二:内容管理系统,模块五 后台功能实现,MySQL安装与使用HTTP、会话技术,PHP操作数据库文件、图像技术,任务一,任务二,任务三,项目准备,管理员登录,栏目管理,任务四,任务五,文章管理,排序与搜索,任务五,分页导航,目录,在项目开发的初始阶段,先进行项目的目录结构划分,才能合理、规范地管理项目中的各种文件。根据功能模块划分,本项目的目录结构如下所示。,项目初始化,任务一:项目准备,项目初始化,任务一:项目准备,项目初始化,项目首先分成了前台和后台两个平台将common和upload目录作为前后台公共目录后台相关的文件全部放到了admin目录中从而在目录结构上对前后台进行了
2、区分,任务一:项目准备,项目初始化,在完成目录划分后,接下来为项目的前后台创建初始化文件,为项目定义一些基础的常量,方便在项目中使用。,任务一:项目准备,项目初始化,为前台创建初始化文件init.php定义常量APP_DEBUG,用于表示是否开启调试,其值可以为true和false。当开启时将提示完整的错误信息以便于调试,否则只进行简单的错误提示。定义常量COMMON_PATH和UPLOAD_PATH,用于表示公共文件目录和上传文件目录的路径。从前台进行访问时,从当前目录“./”开始。,任务一:项目准备,项目初始化,为后台创建初始化文件admininit.php定义常量APP_DEBUG,用于
3、表示是否开启调试,其值可以为true和false。当开启时将提示完整的错误信息以便于调试,否则只进行简单的错误提示。定义常量COMMON_PATH和UPLOAD_PATH,用于表示公共文件目录和上传文件目录的路径。从后台进行访问时,从上级目录“./”开始。,任务一:项目准备,函数库与配置文件,函数库,在项目开发时,有许多常用的功能可以通过函数来完成,因此应该为项目创建一个函数库,保存项目中的常用函数。常用函数的名称,通过一个大写字母的命名风格,既书写方便,又便于程序阅读。,任务一:项目准备,函数库与配置文件,函数库,在common目录中创建文件function.php,编写一个“E()”函数。
4、,函数名是英文单词“error”的首字母缩写,表示程序遇到错误。该函数有两个参数$msg和$debug,参数$debug的默认值为空字符串该函数的参数$msg表示错误信息,$debug表示调试信息当开启调试时,显示错误信息和调试信息,而关闭调试时,只显示错误信息在完成编写函数库后,接下来在项目的初始化文件中载入函数库,任务一:项目准备,函数库与配置文件,配置文件,在项目中通常有一些常用的配置,如数据库连接信息,使用独立的配置文件来保存配置可以使代码更利于维护。,任务一:项目准备,函数库与配置文件,配置文件,接下来在common目录中创建配置文件config.php,保存数据库的连接信息。,在c
5、onfig.php中,直接返回数组,数组中的元素用于设置项目的配置信息DB_CONNECT元素的值是一个数组,用于保存数据库的连接信息,如数据库服务器地址、用户名、密码、默认数据库和端口号。DB_CHARSET元素用于保存数据库字符集,任务一:项目准备,函数库与配置文件,访问配置文件,完成配置文件commonconfig.php的创建后,接下来还需要对配置文件进行访问。,任务一:项目准备,函数库与配置文件,访问配置文件,在函数库文件commonfunction.php中编写函数C()实现此功能。,函数名是英文字母“config”的首字母缩写,表示访问程序的设置。参数$name表示待访问的数组元
6、素,如DB_CONNECT。在C()函数中设置静态变量$config,用于保存项目配置信息判断$config是否为null,若为null,则载入配置文件判断要获取的配置信息是否存在,若不存在赋值为空字符串返回要获取的配置信息,任务一:项目准备,函数库与配置文件,示例演示,在后台初始化文件admininit.php中,添加以下代码用于测试函数的使用。,/访问数据库连接信息$config=C(DB_CONNECT);echo$confighost;/输出结果:localhost/访问数据库字符集echo C(DB_CHARSET);/输出结果:utf8,任务一:项目准备,数据库函数,在基于数据库的
7、项目中,对数据库的操作是非常频繁的,因此可以利用函数将这部分代码提取出来,以方便后续的代码编写。接下来在common目录中创建db.php,保存数据库的常见操作函数,任务一:项目准备,数据库函数,连接数据库,编写db_connect()函数,用于完成数据库连接和设置字符集操作设置静态变量$link用于保存数据库连接实现函数第一次调用时进行数据库连接实现函数执行后返回数据库连接$link,任务一:项目准备,数据库函数,执行SQL语句,在完成数据库连接后接下来就可以执行SQL语句。由于MySQLi扩展提供的预处理语句更加高效和安全,因此在项目中执行SQL语句时,将通过预处理来实现。,任务一:项目准
8、备,数据库函数,执行SQL语句,编写函数db_query(),完成SQL语句的预处理操作该函数的参数依次为SQL语句、数据格式和数据内容。其中,数据格式的默认值为空字符串、数据内容的默认值为空数组。获取数据库连接后,利用mysqli_prepare()预处理SQL语句,获取$stmt数据内容为空,利用mysqli_stmt_execute()直接执行SQL语句。数据内容不为空,则执行自定义函数db_bind_param()进行参数绑定后,再执行SQL语句最后返回预处理结果$stmt,任务一:项目准备,数据库函数,执行SQL语句,编写函数db_bind_param(),完成SQL语句的参数绑定该
9、函数的参数依次$stmt、数据格式和引用传递的数据内容利用$params保存预处理函数mysqli_stmt_bind_param()需要的每个参数首先依次保存前两个参数$stmt和数据格式由于mysqli_stmt_bind_param()的参数绑定需要引用传参,因此通过遍历数据内容,为每个参数创建引用,并依次赋值给$param最后调用mysqli_stmt_bind_param()函数完成参数的绑定,任务一:项目准备,数据库函数,示例演示,/准备SQL语句$sql=INSERT INTO cms_category(name,sort)VALUES(?,?);/执行SQL语句db_query
10、($sql,si,test,0);,第二个参数si,表示插入数据的类型s表示字符串i表示整型,任务一:项目准备,数据库函数,批量操作,在db_query()函数中,第3个参数用于传入数据内容,目前只支持一维数组。MySQLi扩展的预处理机制还可以实现批量操作。因此,还可以改进db_query()函数,当传入数据内容是二维数组时,自动进行批量操作。,任务一:项目准备,数据库函数,批量操作,在db_query()函数实现参数绑定的位置进行修改首先进行预处理操作的参数绑定并执行预处理操作然后删除执行完的数据最后批量执行剩余的其他数据,任务一:项目准备,数据库函数,示例演示,/准备SQL语句$sql=
11、INSERT INTO cms_category(name,sort)VALUES(?,?);/准备数据$data=aa,1,bb,12,cc,30;/执行SQL语句db_query($sql,si,$data);,任务一:项目准备,数据库函数,其他数据库操作,在数据库操作中,除了执行SQL语句,还需要处理结果集、获取受影响行数、获取最后插入的ID等后续操作。接下来继续完善数据库操作函数。,任务一:项目准备,数据库函数,其他数据库操作,定义常用常量,用于表示后续的具体操作定义函数db_fetch(),处理有结果集的SQL语句;定义函数db_exec(),处理没有结果集的SQL语句。两个函数的参
12、数依次为后续的操作,SQL语句,数据格式和数据内容最后结合switch语句根据不同的操作,执行不同的处理函数,任务一:项目准备,数据库函数,示例演示,/查询数据,获得保存所有结果的关联数组$data=db_fetch(DB_ALL,SELECT*FROM cms_category);var_dump($data);/插入数据,获得最后插入的ID$sql=INSERT INTO cms_category(name,sort)VALUES(?,?);$id=db_exec(DB_LASTID,$sql,si,test,0);echo$id;,任务一:项目准备,输入过滤函数,在项目开发中,对于$_G
13、ET、$_POST数组的访问是非常频繁的,但是这两个数组保存的是来自外部提交的数据,如果直接进行访问,会带来安全隐患。因此,通过函数来统一接收外部变量,可以使项目代码更加严谨和规范。接下来,在commonfunction.php中编写I()函数用于接收外部变量。,任务一:项目准备,输入过滤函数,该函数名取自英文单词“input”的首字母,表示输入。该函数的参数依次为需要处理的变量名、接收方法、数据类型、默认值根据接收方法确定数据变量使用哪种接收类型通过isset()判断接收的数据变量是否存在,若不存在将其值设为默认值结合switch和数据类型进行不同的过滤处理,具体有字符串型、html转义、整
14、数、无符号整数、页码、浮点数、布尔型、数组型。,任务一:项目准备,输入过滤函数,结合htmlspecialchars()函数把一些预定义的 HTML 实体转换为字符,并设置第二个参数ENT_QUOTES完成对单引号和双引号的转义操作。结合trim()函数去除字符串首尾处的空白字符(或者其他字符)结合str_replace()函数将字符串中的空格替换成,其中,在对数据进行HTML特殊字符转义时,为方便管理和操作,接下来在commonfunction.php中实现该函数toHTML()。具体思路如下:,任务一:项目准备,输入过滤函数,示例演示,/POST方式$_POSTname=测试;$name=
15、I(name,post,html);echo$name;/输出结果:测试,/GET方式$_GETid=123abc;$id=I(id,get,id);echo$id;/输出结果:123,任务一:项目准备,后台页面布局,下面开始进入网站后台页面的开发。在设计后台页面时,通常使用“品”字形的页面布局,此布局的具体结构如图。,top是页面的顶部,通常用于显示系统名称、相关链接;nav是页面的左侧导航菜单,后台中的各个功能模块通过这个菜单进入;content是页面内容,根据当前访问的功能而改变。,任务一:项目准备,后台页面布局,在adminview目录中创建后台的布局文件layout.html,页面顶
16、部和左侧导航标签中添加响应,页面内容部分嵌套一个框架,用于动态改变内容创建后台首页adminindex.php,载入后台初始化文件和布局文件接下来在当前目录下,创建admincp_index.php文件,载入后台首页信息创建文件adminviewindex.html,该文件是后台首页的HTML模板文件,任务一:项目准备,后台页面布局,后台页面布局展示图,任务一:项目准备,实现管理员登录,添加管理员信息,在管理员表中添加初始数据,具体字段应包括ID、用户名和密码,SQL语句如下。,INSERT INTO cms_admin VALUES(1,admin,123456);,任务二:管理员登录,实现
17、管理员登录,创建后台登录表单,在后台adminview中创建后台用户登录的HTML表单login.html。,用户名:密码:,任务二:管理员登录,实现管理员登录,载入数据库操作函数,修改前后台的初始化文件admininit.php,载入数据库操作函数db.php。将数据库操作函数载入后,在项目中就可以使用来自db.php中的函数。,任务二:管理员登录,实现管理员登录,接收登录表单,创建后台登录文件adminlogin.php,实现载入HTML模板显示登录页面,当接收到提交的登录表单时处理表单。,任务二:管理员登录,实现管理员登录,接收登录表单,载入后台初始化文件init.php和表单模板文件l
18、ogin.html通过if与$_POST处理提交后的表单内容在处理表单时,先通过I()函数接收用户名和密码,到数据库中查询信息,然后取出密码后进行验证。如果验证通过,则将用户登录信息保存到Session中,然后利用自定义redirect()函数跳转到后台首页index.php如果验证失败,则调用E()函数停止程序继续执行。,任务二:管理员登录,实现管理员登录,接收登录表单,接下来在commonfunction.php中编写用于实现页面跳转的redirect()函数。,function redirect($url)header(Location:$url);/重定向到目标URL地址 exit;,
19、任务二:管理员登录,页面信息提示,当PHP处理用户提交表单时,如果在处理过程中发生了成功或失败的信息,应该以友好的提示信息在页面中显示。为了利于程序的维护,可以将载入HTML页面的代码放到一个函数中,通过调用函数的方式来决定程序在什么情况下显示页面。,任务二:管理员登录,页面信息提示,编写显示页面的函数,接下来在adminlogin.php中编写display()函数,将载入HTML模板的代码放到函数中。,function display($msg=null)require./view/login.html;exit;,任务二:管理员登录,页面信息提示,在页面中输出提示信息,编辑后台登录页面a
20、dminviewlogin.html,在页面中添加元素用于显示信息提示。,任务二:管理员登录,页面信息提示,在页面中输出提示信息,在commonfunction.php中编写该函数tips()输出提示信息。,function tips($msg=null)if(!$msg)return;/没有提示信息时直接返回空字符串 return$msg0?$msg1:$msg1;,tips()函数的参数$msg用于传入一个数组,数组的第1个元素表示成功或失败第2个元素是表示提示信息当省略参数$msg,或$msg为空时,直接返回空字符串,表示没有提示信息,任务二:管理员登录,页面信息提示,显示页面并提示信息
21、,在完成信息提示功能后,修改adminlogin.php中登录失败的提示代码,/修改前的代码:/E(登录失败:用户名或密码错误。);,/修改后的代码:display(false,登录失败:用户名或密码错误。);,任务二:管理员登录,页面信息提示,没有表单提交时显示页面,在完成创建display()函数后,当没有表单提交时,应显示登录页面,if($_POST)/有表单提交时,处理表单else/没有表单提交时,显示登录页面 display();,任务二:管理员登录,页面信息提示,效果展示,任务二:管理员登录,判断登录状态,在实现了用户登录功能后,还需要判断用户是否登录,如果没有登录则提示用户进行登
22、录,并阻止用户访问本来的功能。,任务二:管理员登录,判断登录状态,在后台中,Session操作是项目中的公共功能,为了更好地维护项目中的Session,可以在初始化文件中统一开启Session,并为项目中的Session创建前缀。修改文件admininit.php,具体如下:,开启Session,/启动sessionsession_start();/为项目创建Session,统一保存到cms中if(!isset($_SESSIONcms)$_SESSION=cms=;,任务二:管理员登录,判断登录状态,接下来在admininit.php中继续编写代码,实现检查用户登录。,检查用户登录,判断是否
23、已经定义了NO_CHECK_LOGIN常量如果没有定义则检查用户是否登录,如果已经定义了则不检查用户是否登录当用户登录时,取出用户信息保存到变量$user中如果没有登录则跳转到登录页面login.php并停止脚本继续执行当其他脚本载入这个文件时,就会自动判断用户是否登录,而如果不需要判断登录,则在载入admininit.php之前,先定义NO_CHECK_LOGIN常量。,任务二:管理员登录,判断登录状态,在adminlogin.php文件中,当用户登录成功时,将用户信息(ID和用户名)保存到了Session中。在admininit.php中判断用户是否登录,如果已经登录,则从Session中
24、取出用户信息,保存到$user中。当用户登录成功后进入后台首页时,可通过输出$user将用户名显示在页面中。,显示当前登录的用户名,任务二:管理员登录,判断登录状态,效果展示,任务二:管理员登录,登录验证码,在开发管理员登录功能时,还要考虑一个问题,就是除了浏览器,其他软件也可以向服务器提交数据。从系统安全的角度看,如果使用软件自动大批量向服务器提交表单,那么管理员的用户名、密码将会被穷举出来,导致管理员账号被盗取。为此,验证码就是一种防御的手段。,任务二:管理员登录,登录验证码,通常情况下,验证码是一张带有文字的图片,要求用户输入图中的文字。对于图片中的文字,人类识别非常容易,而软件识别非常
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中级 项目 内容管理 系统
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5171954.html