要入门web安全,首先就要实战一下,所以就跟着51CTO的孙胜利老师学习PHP好长时间了,终于将这一项目(小项目)给完成了,虽然遇到了很多error,但最后还是做出来了,就记录一下开发过程,顺便再理一遍思路。
开发好后的小型论坛
看起来还挺清新的,那么接下来就开始整理我的开发之路了。
创建后台-父板块
首先,我们需要创建一个数据库来保存我们的所添加的父板块
数据库就取名为bbs
,创建父板块father_module
表,设置三个字段,id
,module_name
,sort
。
数据库创建完成,就开始编写PHP代码,在此之前,我们需要HTML代码用来展示。
大致就是这样,写父板块功能的时候,中间那一部分可以不要,我们只要HTML代码的头部,左边和尾部。为了不让HTML代码重复出现,我们可以将相同的HTML代码防在一个文件中,利用PHP调用即可。
在admin目录下创建一个inc文件夹,里面放入后台经常要调用的文件,可以节省代码量。
这里把头部的HTML代码放入header.inc.php
,左边的HTML代码放入left.inc.php
,尾部的HTML代码放入 footer.inc.php
。
现在页面搞好了,但我们还需要编写一些数据库相关的函数,比如连接数据库等,如果没有这些函数,创建的数据库也毫无意义。
因为前台和后台都要用到,所以在根目录下再建立一个inc
文件夹。
下面就开始编写PHP代码,我们首先得连接数据库。
连接数据库就取名为config.in.php
date_default_timezone_set('Asia/Shanghai');//设置时区
session_start();//开启SESSION,验证后台登陆
header('Content-type:text/html;charset=utf-8');//设置编码
define('DB_HOST','localhost');//定义为常量
define('DB_USER','用户名');
define('DB_PASSWORD','密码');
define('DB_DATABASE','数据库名');
define('SA_PATH',dirname(dirname(__FILE__)));
define('SUB_URL',str_replace($_SERVER['DOCUMENT_ROOT'],'',str_replace('\\','/',SA_PATH)).'/');
?>
写好之后,我们还需要编写一些MYSQL常用的函数,方便后面开发使用。
//连接数据库
function connect($host=DB_HOST,$user=DB_USER,$password=DB_PASSWORD,$database=DB_DATABASE){
$link=@mysqli_connect($host, $user, $password, $database);
if(mysqli_connect_errno()){
exit(mysqli_connect_error());
}
mysqli_set_charset($link,'utf8');
return $link;
}
//执行一条SQL语句,返回结果
function execute($link,$query){
$result=mysqli_query($link,$query);
if(mysqli_errno($link)){
exit(mysqli_error($link));
}
return $result;
}
//获取记录数
function num($link,$sql_count){
$result=execute($link,$sql_count);
$count=mysqli_fetch_row($result);
return $count[0];
}
//数据入库之前进行转义
function escape($link,$data){
if(is_string($data)){
return mysqli_real_escape_string($link,$data);
}
if(is_array($data)){
foreach ($data as $key=>$val){
$data[$key]=escape($link,$val);
}
}
return $data;
}
//一次性执行多条SQL语句
/*
一次性执行多条SQL语句
$link:连接
$arr_sqls:数组形式的多条sql语句
$error:传入一个变量,里面会存储语句执行的错误信息
*/
function execute_multi($link,$arr_sqls,&$error){
$sqls=implode(';',$arr_sqls).';';
if(mysqli_multi_query($link,$sqls)){
$data=array();
$i=0;//计数
do {
if($result=mysqli_store_result($link)){
$data[$i]=mysqli_fetch_all($result);
mysqli_free_result($result);
}else{
$data[$i]=null;
}
$i++;
if(!mysqli_more_results($link)) break;
}while (mysqli_next_result($link));
if($i==count($arr_sqls)){
return $data;
}else{
$error="sql语句执行失败:
数组下标为{$i}的语句:{$arr_sqls[$i]}执行错误
错误原因:".mysqli_error($link);
return false;
}
}else{
$error='执行失败!请检查首条语句是否正确!
可能的错误原因:'.mysqli_error($link);
return false;
}
}
//关闭连接
function close($link){
mysqli_close($link);
}
?>
这些函数都编号后,就开始我们第一个板块-父板块。
我们首先要引用这两个文件,才能调用他们。
接下来就开始编写father_module.php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
$link=connect();//连接数据库
?>
include 'inc/header.inc.php'?>//引入头部
include 'inc/left.inc.php'?>//引入左边
include 'inc/footer.inc.php'?>//引入右边
这样大致框架就做好了,要求的父板块页面至少包括编辑、排序、删除、这些功能,页面是这样的(有点丑)。
那么接下来就开始在HTML代码中嵌入PHP代码,实现相应的功能。
father_module.php
完整代码如下:
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
//判断用户是否点击排序按钮
if(isset($_POST['submit'])){
foreach($_POST['sort'] as $key=>$val){
//is_numeric() 函数用于检测变量是否为数字或数字字符串
if(!is_numeric($val) || !is_numeric($key)){
skip('father_module.php','error','排序错误!');
}
//更新sort中的默认值
$query[]="update father_module set sort={$val} where id={$key}";
}
//mysqli_multi_query() 函数可用来执行多条SQL语句
if(execute_multi($link,$query,$error)){
skip('father_module.php','ok','排序修改成功');
}else{
skip('father_module.php','error',$error);
}
}
$template['title']='父板块列表页';
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">父板块列表</h2>
<div class="explain">
<ul>
<li>添加你所喜欢的φ(* ̄0 ̄)</li>
<li>(o゜▽゜)o☆"( ̄y▽, ̄)╭ "</li>
</ul>
</div>
<form method="POST">
<table class="list">
<tr>
<th>排序</th>
<th>版块名称</th>
<th>版主</th>
<th>操作</th>
</tr>
//查询
$query="select * from father_module";
//执行
$result=execute($link,$query);
while ($data=mysqli_fetch_assoc($result)){
//将字符串以URL编码,用于编码处理
$url=urlencode("father_module_delete.php?id={$data['id']}");
$return_url=urlencode($_SERVER['REQUEST_URI']);
$message="要删除父版块 {$data['module_name']} 吗?";
//跳转确认页面,给用户更好的用户体验
$delete_url="confirm.php?url={$url}&return_url={$return_url}&message={$message}";
$html=<<<A
{$data['id']}]" value="{$data['sort']}" />
{$data['module_name']}[id:{$data['id']}]
且听风吟
[访问] {$data['id']}">[编辑] $delete_url">[删除]
A;
echo $html;
}
?>
</table>
<input style="margin-top:20px;cursor:pointer;" class="btn" type="submit" name="submit" value="排序" />
</form>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
我们还需要做confirm.php
删除确认页面、father_module_update.php
编辑功能、father_module_delete.php
删除功能
先来做一下删除确认页面
confirm.php
代码
include_once '../inc/config.inc.php';
//先判断是否传过来有参数
if(!isset($_GET['message']) || !isset($_GET['url']) || !isset($_GET['return_url'])){
exit();
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>确认界面</title>
<style>
@charset "UTF-8";
@use postcss-cssnext;
:root {
--windmill-dark: #14222D;
--windmill-medium-dark: #508BB3;
--windmill-medium: #6096C4;
--windmill-medium-light: #649ECD;
--windmill-light: #B6E2FF;
}
.windmill {
position: relative;
width: 800px;
height: 500px;
margin: auto;
overflow: hidden;
background: var(--windmill-medium-light);
}
....//css代码太多了,这里就不展示了,只把重要的代码展示出来
<link rel="stylesheet" type="text/css" href="style/remind.css" />
<div class="notice"><span class="pic ask"></span> echo $_GET['message']?> <a style="color:red;" href="$_GET['url']?>">确定</a> | <a style="color:#666;" href="$_GET['return_url']?>">取消</a></div>
</body>
</html>
实现效果:
但现在没有删除功能,所以再做删除功能。
father_module_delete.php
代码
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
if(!isset($_GET['id'])||!is_numeric($_GET['id'])){
skip('father_module.php','error','id参数错误!');
}
//从子版块中查询是否有相同的id,如果有的话就不能直接删除
$query="select * from son_module where father_module_id={$_GET['id']}";
$result=execute($link,$query);
if(mysqli_num_rows($result)){
skip('father_module_add.php','error','板块下有子板块,无法直接删除');
}
//查询数据库中的id是否和传过来的相同
$query="delete from father_module where id={$_GET['id']}";
execute($link,$query);
//mysqli_affected_rows() 函数返回前一次 MySQL 操作(SELECT、INSERT、UPDATE、REPLACE、DELETE)所影响的记录行数
if(mysqli_affected_rows($link)==1){
skip('father_module.php','ok','删除成功');
}else{
skip('father_module.php','error','对不起删除失败,请重试!');
}
?>
下面就是编辑页面了
father_module_update.php
编辑页面
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
$template['title']='管理员编辑页';
//验证
if(!isset($_GET['id'])||!is_numeric($_GET['id'])){
skip('father_module.php','error','id参数错误!');
}
$query="select * from father_module where id={$_GET['id']}";
$result=execute($link,$query);
if(!mysqli_num_rows($result)){
skip('father_module.php','error','这条版块信息不存在!');
}
if(isset($_POST['submit'])){
//因为涉及修改,所以我们需要验证,在创建inc中check_father_module.inc.php文件来验证。
$check_flag='update';
include 'inc/check_father_module.inc.php';
//更新数据
$query="update father_module set module_name='{$_POST['module_name']}',sort={$_POST['sort']} where id={$_GET['id']}";
execute($link,$query);
if(mysqli_affected_rows($link)==1){
skip('father_module.php','ok','恭喜你,修改成功!');
}else{
skip('father_module.php','error','对不起,修改失败,请重试!');
}
}
$data=mysqli_fetch_assoc($result);
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">修改父板块- echo $data['module_name']?></h2>
<div class="title">功能说明</div>
<div class="explain">
<ul>
<li>"*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。"(^U^)ノ~YO</li>
</ul>
</div>
<div id="main">
<form method="post">
<table class="au">
<tr>
<td>版块名称</td>
<td><input name="module_name" value="$data['module_name']?>" type="text" /></td>
<td>
版块名称不得为空,最大不得超过66个字符
</td>
</tr>
<tr>
<td>排序</td>
<td><input name="sort" value="$data['sort']?>" type="text" /></td>
<td>
填写一个数字即可
</td>
</tr>
</table>
<input style="margin-top:20px;cursor:pointer;" class="btn" type="submit" name="submit" value="修改" />
</form>
</div>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
</div>
<!--end content-->
</div><!--end main-->
include 'inc/left.inc.php'?>
include 'inc/footer.inc.php'?>
再编辑一下check_father_module.inc.php
验证文件
//名字不能为空
if(empty($_POST['module_name'])){
skip('father_module_add.php','error','不能为空');
}
if(mb_strlen($_POST['module_name'])>66){
skip('father_module_add.php','error','版块名称不得多余66个字符!');
}
if(!is_numeric($_POST['sort'])){
skip('father_module_add.php','error','排序只能是数字!');
}
//进行转义
$_POST=escape($link,$_POST);
//采用switch 更加方便添加,更新等
switch ($check_flag) {
case 'add':
$query="select * from father_module where module_name='{$_POST['module_name']}'";
break;
case 'update':
$query="select * from father_module where module_name='{$_POST['module_name']}' and id!={$_GET['id']}";
break;
default:
skip('father_module_add.php','error','$check_flag参数错误!');
}
$result=execute($link,$query);
if(mysqli_num_rows($result)){
skip('father_module_add.php','error','这个版块已经有了!');
}
?>
实现效果:
这样我们就把第一个任务做好了,我们的父板块展示页以及做好了,接下来开始做子版块。
创建后台-子版块
首先我们需要先创建子版块表来存放我们的数据。
起名为son_module
创建字段
接下来,开始写子版块页面。
son_module
代码
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
$template['title']='子版块列表';
if(isset($_POST['submit'])){
//循环语句
//$key代表id,$val代表sort
//用var_dump()输出一下就了解了
foreach($_POST['sort'] as $key=>$val){
if(!is_numeric($val) || !is_numeric($key)){
skip('son_module.php','error','排序错误!');
}
$query[]="update son_module set sort={$val} where id={$key}";
}
if(execute_multi($link,$query,$error)){
skip('son_module.php','ok','排序修改成功');
}else{
skip('son_module.php','error',$error);
}
}
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">子板块列表</h2>
<form method="POST">
<table class="list">
<tr>
<th>排序</th>
<th>版块名称</th>
<th>所属父板块</th>
<th>版主</th>
<th>操作</th>
</tr>
//起一个别名,ssm代表son_module
//sfm代表father_module,有的起名相同会造成错误
$query="select ssm.id,ssm.sort,ssm.module_name,sfm.module_name father_module_name,ssm.member_id from son_module ssm,father_module sfm where ssm.father_module_id=sfm.id order by sfm.id";
$result=execute($link,$query);
while ($data=mysqli_fetch_assoc($result)){
$url=urlencode("son_module_delete.php?id={$data['id']}");
$return_url=urlencode($_SERVER['REQUEST_URI']);
$message="要删除子版块 {$data['module_name']} 吗?";
$delete_url="confirm.php?url={$url}&return_url={$return_url}&message={$message}";
$html=<<<A
{$data['id']}]" value="{$data['sort']}" />
{$data['module_name']}[id:{$data['id']}]
{$data['father_module_name']}
{$data['member_id']}
[访问] {$data['id']}">[编辑] $delete_url">[删除]
A;
echo $html;
}
?>
</table>
<input style="margin-top:20px;cursor:pointer;" class="btn" type="submit" name="submit" value="排序" />
</form>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
</div>
<!--end content-->
</div><!--end main-->
include 'inc/left.inc.php'?>
include 'inc/footer.inc.php'?>
这里的代码和父板块的查不多,但是有区别的,我们创建的子版块必须是属于其中一个父板块下面的,所以我们在子版块创建的father_module_id
就是用来区分该子版块是属于那个父板块的。
实现效果:
和父板块一样,这里我们也需要son_module_add.php
子版块添加、son_module_delete.php
子版块删除、son_module_update.php
子板块编辑
先来做son_module_add.php
子版块添加
//子板块添加页面
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
include_once 'inc/is_manage_login.inc.php';
$template['title']='子板块添加页面';
if(isset($_POST['submit'])){
//验证填写的信息
$check_flag='add';
include 'inc/check_son_module.inc.php';
// 插入数据
$query="insert into son_module(father_module_id,module_name,info,member_id,sort) values({$_POST['father_module_id']},'{$_POST['module_name']}','{$_POST['info']}',{$_POST['member_id']},{$_POST['sort']})";
execute($link,$query);
if(mysqli_affected_rows($link)==1){
skip('son_module.php','ok','恭喜你,添加成功!');
}else{
skip('son_module_add.php','error','对不起,添加失败,请重试!');
}
}
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">添加子板块</h2>
<div class="explain">
<ul>
<li>添加你所喜欢的(*^-^*)</li>
<li>"*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。"</li>
</ul>
</div>
<div id="main">
<form method="post">
<table class="au">
<tr>
<td>所属父板块</td>
<td>
<select name="father_module_id">
<option value="0">---选择一个父板块---</option>
$query="select * from father_module";
$result_father=execute($link,$query);
while($data_father=mysqli_fetch_assoc($result_father)){
echo "'>{$data_father['module_name']}";
}
?>
</select>
</td>
<td>
请选择一个父板块
</td>
</tr>
<tr>
<td>版块名称</td>
<td><input name="module_name" type="text" /></td>
<td>
版块名称不得为空,最大不得超过66个字符
</td>
</tr>
<tr>
<td>板块简介</td>
<td>
<textarea name="info"></textarea>
</td>
<td>
不得多于255个字符
</td>
</tr>
<tr>
<td>版主</td>
<td>
<select name="member_id">
<option value="0">---选择一个版主---</option>
</select>
</td>
<td>
请选择一个会员作为版主
</td>
</tr>
<tr>
<td>排序</td>
<td><input name="sort" value="0" type="text" /></td>
<td>
填写一个数字即可
</td>
</tr>
</table>
<input style="margin-top:20px;cursor:pointer;" class="btn" type="submit" name="submit" value="添加" />
</form>
</div>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
</div>
<!--end content-->
</div><!--end main-->
include 'inc/left.inc.php'?>
include 'inc/footer.inc.php'?>
我们还需验证,所以在inc文件中创建check_son_module.inc.php
文件
if(!is_numeric($_POST['father_module_id'])){
skip('son_module_add.php','error',' 所属父板块不能为空');
}
$query="select * from father_module where id={$_POST['father_module_id']}";
$result=execute($link,$query);
if(mysqli_num_rows($result)==0){
skip('son_module_add.php','error',' 所属父板块不存在');
}
if(empty($_POST['module_name'])){
skip('son_module_add.php','error','子版块名称不得为空!');
}
if(mb_strlen($_POST['module_name'])>66){
skip('son_module_add.php','error','子版块名称不得多余66个字符!');
}
$_POST=escape($link,$_POST);
switch ($check_flag){
case 'add':
$query="select * from son_module where module_name='{$_POST['module_name']}'";
break;
case 'update':
$query="select * from son_module where module_name='{$_POST['module_name']}' and id!={$_GET['id']}";
break;
default:
skip('son_module.php','error','$check_flag参数错误!');
}
$result=execute($link,$query);
if(mysqli_num_rows($result)){
skip('son_module_add.php','error','这个子板块已经有了');
}
if(mb_strlen($_POST['info'])>255){
skip('son_module_add.php','error','子版块简介不得多于255个字符!');
}
if(!is_numeric($_POST['sort'])){
skip('son_module_add.php','error','排序只能是数字!');
}
?>
实现效果:
son_module_delete.php
子版块删除
//子版块删除页面
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
$template['title']='子板块删除页';
if(!isset($_GET['id'])||!is_numeric($_GET['id'])){
skip('son_module.php','error','id参数错误!');
}
$template['title']='子版块删除页面';
$query="delete from son_module where id={$_GET['id']}";
execute($link,$query);
//mysqli_affected_rows() 函数返回前一次 MySQL 操作(SELECT、INSERT、UPDATE、REPLACE、DELETE)所影响的记录行数
if(mysqli_affected_rows($link)==1){
skip('son_module.php','ok','删除成功');
}else{
skip('son_module.php','error','对不起删除失败,请重试!');
}
?>
son_module_update.php
子板块编辑
//子板块编辑页面
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
include_once 'inc/is_manage_login.inc.php';
$template['title']='子版块编辑页面';
if(!isset($_GET['id'])||!is_numeric($_GET['id'])){
skip('father_module.php','error','id参数错误!');
}
$query="select * from son_module where id={$_GET['id']}";
$result=execute($link,$query);
if(!mysqli_num_rows($result)){
skip('son_module.php','error','这条板块信息不存在');
}
//修改加验证
//字符串类型的用在外面加上'',例如:module_name='{$_POST['module_name']}'
if(isset($_POST['submit'])){
$check_flag='update';
include 'inc/check_son_module.inc.php';
$query="update son_module set father_module_id={$_POST['father_module_id']},module_name='{$_POST['module_name']}',info='{$_POST['info']}',member_id={$_POST['member_id']},sort={$_POST['sort']} where id={$_GET['id']}";
execute($link,$query);
if(mysqli_affected_rows($link)==1){
skip('son_module.php','ok','恭喜你,修改成功!');
}else{
skip('son_module.php','error','对不起,修改失败,请重试!');
}
}
$data=mysqli_fetch_assoc($result);
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">修改子板块—— echo $data['module_name']?></h2>
<div class="explain">
<ul>
<li>(*^-^*)</li>
<li>"*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。"</li>
</ul>
</div>
<div id="main">
<form method="post">
<table class="au">
<tr>
<td>父板块</td>
<td>
<select name="father_module_id">
<option value="0">---选择一个父板块---</option>
$query="select * from father_module";
$result_father=execute($link,$query);
while($data_father=mysqli_fetch_assoc($result_father)){
if($data['father_module_id']==$data_father['id']){
echo "'>{$data_father['module_name']}";
}else{
echo "'>{$data_father['module_name']}";
}
}
?>
</select>
</td>
<td>
选择要修改的父板块
</td>
</tr>
<tr>
<td>版块名称</td>
<td><input name="module_name" value="$data['module_name']?>" type="text" /></td>
<td>
修改板块名称,最大不得超过66个字符
</td>
</tr>
<tr>
<td>板块简介</td>
<td>
<textarea name="info"> echo $data['info']?></textarea>
</td>
<td>
修改简介,不得多于255个字符
</td>
</tr>
<tr>
<td>版主</td>
<td>
<select name="member_id">
<option value="0">---选择一个版主---</option>
</select>
</td>
<td>
修改版主
</td>
</tr>
<tr>
<td>排序</td>
<td><input name="sort" value="$data['sort']?>" type="text" /></td>
<td>
修改排序
</td>
</tr>
</table>
<input style="margin-top:20px;cursor:pointer;" class="btn" type="submit" name="submit" value="修改" />
</form>
</div>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
</div>
<!--end content-->
</div><!--end main-->
include 'inc/left.inc.php'?>
include 'inc/footer.inc.php'?>
后台开发-管理员
我们需要创建管理员添加功能和管理员列表,在此之前先建manage
表
添加字段
manage.php
管理员列表
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$template['title']='管理员列表页';
$link=connect();
include_once 'inc/is_manage_login.inc.php';
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">管理员列表页</h2>
<div class="explain">
</div>
<table class="list">
<tr>
<th>管理员名称</th>
<th>管理等级</th>
<th>创建日期</th>
<th>操作</th>
</tr>
$query="select * from manage";
$result=execute($link,$query);
while ($data=mysqli_fetch_assoc($result)){
if($data['level']==0){
$data['level']='超级管理员';
}else{
$data['level']='普通管理员';
}
$url=urlencode("manage_delete.php?id={$data['id']}");
$return_url=urlencode($_SERVER['REQUEST_URI']);
$message="要删除管理员 {$data['name']} 吗?";
$delete_url="confirm.php?url={$url}&return_url={$return_url}&message={$message}";
$html=<<<A
{$data['name']}[id:{$data['id']}]
{$data['level']}
{$data['create_time']}
{$delete_url}">[删除]
A;
echo $html;
}
?>
</table>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
</div>
<!--end content-->
</div><!--end main-->
include 'inc/left.inc.php'?>
include 'inc/footer.inc.php'?>
实现效果:
manage_delete.php
管理员删除功能
代码如下:
//子版块删除页面
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
include_once 'inc/is_manage_login.inc.php';
if(!isset($_GET['id'])||!is_numeric($_GET['id'])){
skip('manage.php','error','id参数错误!');
}
$link=connect();
$template['title']='管理员删除页面';
$query="delete from manage where id={$_GET['id']}";
execute($link,$query);
//mysqli_affected_rows() 函数返回前一次 MySQL 操作(SELECT、INSERT、UPDATE、REPLACE、DELETE)所影响的记录行数
if(mysqli_affected_rows($link)==1){
skip('manage.php','ok','删除成功');
}else{
skip('manage.php','error','对不起删除失败,请重试!');
}
?>
manage_add.php
管理员添加功能
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$template['title']='管理员添加页';
$link=connect();
include_once 'inc/is_manage_login.inc.php';
if(isset($_POST['submit'])){
$check_flag='add';
include 'inc/check_manage.inc.php';
$query="insert into manage(name,pw,create_time,level) values('{$_POST['name']}',md5({$_POST['pw']}),now(),{$_POST['level']})";
execute($link,$query);
if(mysqli_affected_rows($link)==1){
skip('manage.php','ok','恭喜你,添加成功!');
}else{
skip('manage.php','error','对不起,添加失败,请重试!');
}
}
?>
include 'inc/header.inc.php'?>
<div id="bg_wrapper">
<div id="main">
<div id="content">
<div class="jquery_tab">
<div class="content_block">
<h2 class="jquery_tab_title">添加管理员</h2>
<div class="explain">
<ul>
<li>(*^-^*)</li>
<li>(o゜▽゜)o☆</li>
<li>(●'◡'●)</li>
</ul>
</div>
<div id="main">
<form method="post">
<table class="au">
<tr>
<td>管理员名称</td>
<td><input name="name" type="text" /></td>
<td>
名称不得为空
</td>
</tr>
<tr>
<td>密码</td>
<td><input name="pw" type="text" /></td>
<td>
密码不得低于六位
</td>
</tr>
<tr>
<td>等级</td>
<td>
<select name="level">
<option value="1">普通管理员</option>
<option value="0">超级管理员</option>
</select>
</td>
<td>
请选择一个等级
</td>
</tr>
</table>
<input style="margin-top:20px;cursor:pointer;" class="btn" type="submit" name="submit" value="添加" />
</form>
</div>
</div><!--end content_block-->
</div><!-- end jquery_tab -->
</div>
<!--end content-->
</div><!--end main-->
include 'inc/left.inc.php'?>
include 'inc/footer.inc.php'?>
有往数据库中添加的,我们必须验证,所以再创建一个验证的文件
check_manage.inc.php
验证添加管理员
if(empty($_POST['name'])){
skip('manage_add.php','error','管理名称不得为空');
}
if(mb_strlen($_POST['name'])>32){
skip('manage_add.php','error','管理员名称不得多于32个字符');
}
if(mb_strlen($_POST['name'])<6){
skip('manage_add.php','error','密码不得少于6位');
}
$_POST=escape($link,$_POST);
$query="select * from manage where name='{$_POST['name']}'";
$result=execute($link,$query);
if(mysqli_num_rows($result)){
skip('manage_add.php','error','该管理员名称以及存在');
}
//默认传过来的是字符串
if(!isset($_POST['level'])){
$_POST['level']=1;
}
else if($_POST['level']=='0'){
$_POST['level']==0;
}
else if($_POST['level']=='1'){
$_POST['level']==1;
}else{
$_POST['level']==1;
}
?>
实现效果:
我们这里0代表超级管理员,1代表普通管理员,唯一的区别就是普通管理员没有权限去添加管理员,而超级管理员有这个功能。这个功能稍后开发,接下来我们开发登陆页面和后台首页。
后台首页index.php
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
include_once 'inc/is_manage_login.inc.php';
$query="select * from manage where id={$_SESSION['manage']['id']}";
$result_manage=execute($link, $query);
$data_manage=mysqli_fetch_assoc($result_manage);
if($data_manage['level']=='0'){
$data_manage['level']='超级管理员';
}else{
$data_manage['level']='普通管理员';
}
$query="select count(*) from father_module";
$count_father_module=num($link,$query);
$query="select count(*) from son_module";
$count_son_module=num($link,$query);
$query="select count(*) from content";
$count_content=num($link,$query);
$query="select count(*) from reply";
$count_reply=num($link,$query);
$query="select count(*) from member";
$count_member=num($link,$query);
$query="select count(*) from manage";
$count_manage=num($link,$query);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="description" content="Reflect Template" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>后台首页</title>
<link rel="stylesheet" href="css/style_all.css" type="text/css" media="screen" />
<!-- to choose another color scheme uncomment one of the foloowing stylesheets and wrap styl1.css into a comment -->
<link rel="stylesheet" href="css/style8.css" type="text/css" media="screen" />
<link rel="stylesheet" href="css/jquery-ui.css" type="text/css" media="screen" />
<link rel="stylesheet" href="ueditor1_2_2_0-utf8-php/themes/default/ueditor.css" type="text/css" media="screen" />
<!--Internet Explorer Trancparency fix-->
<!--[if IE 6]>
<script src="js/ie6pngfix.js"></script>
<script>
DD_belatedPNG.fix('#head, a, a span, img, .message p, .click_to_close, .ie6fix');
</script>
<![endif]-->
<script type='text/javascript' src='js/all-ck.js'></script>
<script type='text/javascript' src='ueditor1_2_2_0-utf8-php/editor_config.js'></script>
<script type='text/javascript' src='js/custom.js'></script>
</head>
<body>
<div id="top">
<div id="head">
<h1 class="logo">
<a href="index.php"></a>
</h1>
<div class="head_memberinfo">
<div class="head_memberinfo_logo">
<span>1</span>
<img src="images/unreadmail.png" alt=""/>
</div>
<span class='memberinfo_span'>
欢迎 <a href="index.php">且听风吟</a>
</span>
<span>
<a href="logout.php">登出</a>
</span>
<span class='memberinfo_span2'>
<a href="index.php">1 条私信</a>
</span>
</div>
<!--end head_memberinfo-->
</div>
<!--end head-->
<div id="bg_wrapper">
<div id="main">
<div id="content">
<h2 class="jquery_tab_title">快速入口</h2>
<a class="dashboard_button button1" href="index.php">
<span class="dashboard_button_heading">系统信息</span>
<span>查看系统信息</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button2" href="manage.php">
<span class="dashboard_button_heading">管理员</span>
<span>查看当前管理员</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button3" href="manage_add.php">
<span class="dashboard_button_heading">添加管理员</span>
<span>添加一个新的用户</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button4" href="father_module_add.php">
<span class="dashboard_button_heading">添加父板块</span>
<span>添加父板块</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button5" href="father_module.php">
<span class="dashboard_button_heading">父板块列表</span>
<span>搜索已经存在的父板块列表</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button7" href="son_module.php">
<span class="dashboard_button_heading two_lines">子版块列表</span>
<span>查看子版块列表</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button8" href="son_module_add.php">
<span class="dashboard_button_heading">添加子版块</span>
<span>添加子版块</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button9" href="../index.php">
<span class="dashboard_button_heading two_lines">帖子管理</span>
<span>对帖子进行管理</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button10" href="member.php">
<span class="dashboard_button_heading two_lines">用户列表</span>
<span>查看用户</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button11" href="#">
<span class="dashboard_button_heading">画廊</span>
<span>管理您的图片库</span>
</a><!--end dashboard_button-->
<a class="dashboard_button button12" href="#">
<span class="dashboard_button_heading">帮助</span>
<span>如有问题,请点击</span>
</a><!--end dashboard_button-->
<h2>当前管理员</h2>
<div>
<p>
你好 管理员: echo $_SESSION['manage']['name']?>
</p>
<p>
你的管理等级为: echo $data_manage['level']?>
</p>
<p>
创建时间为: echo $data_manage['create_time']?>
</p>
</div>
<h2>统计信息</h2>
<div>
<table>
<tr>
<th class="specalt">父版块 </th>
<td> echo $count_father_module?></td>
<th class="specalt">子版块</th>
<td> echo $count_son_module?></td>
<th class="specalt">帖子</th>
<td> echo $count_content?></td>
<th class="specalt">回复</th>
<td> echo $count_reply?></td>
<th class="specalt">会员</th>
<td> echo $count_member?></td>
<th class="specalt">管理员</th>
<td> echo $count_manage?></td>
</tr>
</table>
</div>
<h2>系统信息</h2>
<div>
<table>
<tr>
<th class="specalt">服务器操作系统: </th>
<td> echo PHP_OS?></td>
<th class="specalt">服务器软件:</th>
<td> echo $_SERVER['SERVER_SOFTWARE']?></td>
<th class="specalt">MySQL 版本: </th>
<td> echo mysqli_get_server_info($link)?></</td>
<th class="specalt">最大上传文件:</th>
<td> echo ini_get('upload_max_filesize')?></td>
<th class="specalt">内存限制:</th>
<td> echo ini_get('memory_limit')?></td>
</tr>
</table>
</div>
<h2>程序信息</h2>
<div>
<table>
<tr>
<th class="specalt">程序安装位置(绝对路径)</th>
<td> echo SA_PATH?></td>
<th class="specalt">程序在web根目录下的位置(首页的url地址):</th>
<td> echo SUB_URL?></td>
</tr>
<tr>
<th class="specalt">程序作者:且听风吟</th>
<td>作者喜欢旅游,是个吃货</td>
</tr>
</table>
</div>
<h2>安全信息</h2>
<div>
<table>
<tr>
<th class="specalt">SQL注入</th>
<td>无</td>
<th class="specalt">XSS攻击</th>
<td>无</td>
</tr>
<tr>
<th class="specalt">最近检查日期:</th>
<td>2019-05-06</td>
</tr>
</table>
</div>
</div>
<!--end content-->
</div><!--end main-->
<div id="sidebar">
<ul class="nav">
<li><a class="headitem item1" href="#">系统</a>
<ul><!-- ul items without this class get hiddden by jquery-->
<li><a href="index.php">系统信息</a></li>
<li><a href="manage.php">管理员</a></li>
<li><a href="manage_add.php">添加管理员</a></li>
<li><a href="web_set.php">站点设置</a></li>
</ul>
</li>
<li><a class="headitem item4" href="#">内容管理</a>
<ul>
<li><a href="father_module.php">父板块列表</a></li>
<li><a href="father_module_add.php">添加父板块</a></li>
<li><a href="son_module.php">子版块列表</a></li>
<li><a href="son_module_add.php">添加子版块</a></li>
<li><a href="../index.php">帖子管理</a></li>
</ul>
</li>
<li><a class="headitem item5" href="#">用户搜索</a>
<ul>
<li><a href="member.php">用户列表</a></li>
</ul>
</li>
<!--end subnav-->
<div class="flexy_datepicker"></div>
<ul>
<li><a class="headitem item7" href="#">博客浏览</a>
<ul>
<li><a href="https://bealright.github.io/">博客</a></li>
</ul>
</li>
</ul>
</div>
<!--end sidebar-->
</div><!--end bg_wrapper-->
<div id="footer" style="color: #fff;text-align: center">
TRY YOUR BEST!!!<a href="https://bealright.github.io/" target="_blank" title="且听风吟">且听风吟</a>
</div><!--end footer-->
</div><!-- end top -->
</body>
</html>
这里的一些php代码包含了系统信息这个功能
实现效果:
接下来是login.php
登陆页面,但在此之前我们需要做一个验证登陆的文件
tool.inc.php
跳转+验证登陆功能
function skip($url,$pic,$message){
$html=<<<A
{$url}" />
正在跳转中
A;
echo $html;
exit();
}
//验证前台用户是否登陆
function is_login($link){
if(isset($_COOKIE['bbs']['name']) && isset($_COOKIE['bbs']['pw'])){
$query="select * from member where name='{$_COOKIE['bbs']['name']}' and sha1(pw)='{$_COOKIE['bbs']['pw']}'";
$result=execute($link,$query);
if(mysqli_num_rows($result)==1){
$data=mysqli_fetch_assoc($result);
return $data['id'];
}else{
return false;
}
}else{
return false;
}
}
function check_user($member_id,$content_member_id,$is_manage_login){
if($member_id==$content_member_id || $is_manage_login){
return true;
}else{
return false;
}
}
//验证后台用户是否登陆
function is_manage_login($link){
if(isset($_SESSION['manage']['name']) && isset($_SESSION['manage']['pw'])){
$query="select * from manage where name='{$_SESSION['manage']['name']}' and sha1(pw)='{$_SESSION['manage']['pw']}'";
$result=execute($link,$query);
if(mysqli_num_rows($result)==1){
$data=mysqli_fetch_assoc($result);
return true;
}else{
return false;
}
}else{
return false;
}
}
?>
login.php
登陆页面
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';
include_once '../inc/tool.inc.php';
$link=connect();
if(is_manage_login($link)){
skip('index.php','ok','请不用重复登陆');
}
if(isset($_POST['submit'])){
include_once 'inc/check_login.inc.php';
$query="select * from manage where name='{$_POST['name']}' and pw=md5('{$_POST['pw']}')";
$result=execute($link,$query);
if(mysqli_num_rows($result)==1){
$data=mysqli_fetch_assoc($result);
$_SESSION['manage']['name']=$data['name'];
$_SESSION['manage']['pw']=sha1($data['pw']);
$_SESSION['manage']['id']=$data['id'];
$_SESSION['manage']['level']=$data['level'];
skip('index.php','ok','登陆成功');
}else{
skip('login.php','error','用户名或密码错误');
}
}
?>
<html>
<!DOCTYPE html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<title>后台登录</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<!-- CSS -->
<link rel="stylesheet" href="assets/css/reset.css">
<link rel="stylesheet" href="assets/css/supersized.css">
<link rel="stylesheet" href="assets/css/style.css">
<!-- HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="assets/js/html5.js"></script>
<![endif]-->
</head>
<body>
<div class="page-container">
<h1>登录(Login)</h1>
<form action="" method="post">
<input type="text" name="name" class="text" placeholder="请输入您的用户名!">
<input type="password" name="pw" class="text" placeholder="请输入您的用户密码!">
<button type="submit" class="submit" name="submit">登录</button>
<div class="error"><span>+</span></div>
</form>
<div class="connect">
<p>快捷</p>
<p>
<a class="facebook" href=""></a>
<a class="twitter" href=""></a>
</p>
</div>
</div>
<!-- Javascript -->
<script src="assets/js/jquery-1.8.2.min.js" ></script>
<script src="assets/js/supersized.3.2.7.min.js" ></script>
<script src="assets/js/supersized-init.js" ></script>
<script src="assets/js/scripts.js" ></script>
</body>
</html>
实现效果:
OK,这样登陆页面就完成了,有登陆就要有注销,下面做注销页面。
logout.php
注销页面
include_once 'inc/config.inc.php';
include_once 'inc/mysql.inc.php';
include_once 'inc/tool.inc.php';
$link=connect();
setcookie('bbs[name]','',time()-3600);
setcookie('bbs[pw]','',time()-3600);
skip('index.php','ok','退出成功!');
?>
这样后台大部分功能已经完善好了,有的功能需要和前台交互,所以我们在开发前台的过程再将其完善。
感悟:敲的时候经常敲错、搞混、遇到报错,有时一修改就是修改几个小时,但这也许就是敲代码的乐趣所在吧,过程很难受,但找到error并改好也会有一种成就感,下一篇将继续开发前台功能,未完待续。。。。。。