雇员管理系统-解析

这两天,照着韩顺平老师的PHP教程,把雇员管理系统代码敲了一遍,在这个过程中,把自己不懂的知识点融入到项目中去学习,我觉得通过这种方式的确有助于帮助自己进步,通过stackOverflow也解决了运行调试过程中出现的一些问题,不过有一些还没有找到解决方案。而我今天呢,希望将这个项目框架以及其中比较重要的一些功能单独拿出来再分析一番,加强自己的印象。

首先,我先放一张该项目的整体框架图:

从图中各个类间的关系也可以大致看出,它采用了分层模式,将页面业务逻辑分离。

该项目实现的大致功能包括:

  • 管理员登录系统
  • 验证用户是否正确
  • 后台主界面(包括管理、添加、修改、退出系统)
  • 管理用户界面(实现数据分页功能)

其中,比较重要的业务逻辑处理是在登录验证功能和数据分页处理功能,我结合其具体流程大致分析一番。

登录验证

大致流程如下:

接收用户输入的数据

1
2
$id=$_POST['id'];
$password=$_POST['password'];

从admin表获取对应密码

这个过程中会涉及到数据库的连接、查询、释放资源、关闭连接等等。因为该项目讲解视频是几年前的,他在其中采用的是mysql库,不过现在mysql库在PHP7中已经被弃用了,所以我将其修改为了mysqli库
另外呢,我之前对于php操作mysql库并不是很了解,而通过网上的资料可知,利用mysqli库连接数据库时,有面向对象面向过程两种方式,而从我的代码特点来看,应该是面向过程连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class SqlHelper  {
public $dbname="empmanage"; //数据库名称
public $username="root"; //用户名
public $password="XXX" //密码
public $host="localhost" //主机

//数据库连接
$conn=mysqli_connect(host,username,password,dbname);
if (!$conn) {
die ("connect error".mysqli_connect_error());
}

//数据库查询
//根据用户输入的id号从admin表中获取对应的password
$sql="select password form admin where id='$id'";
$res=mysqli_query($conn,$sql) or die (mysqli_error());

//密码比对
if ($row=mysqli_fetch_row($res)) {
//表明从admin表中查询到password
if ($password==$row['password']) {
return true;
}
}
return false;

//释放资源并关闭连接
mysqli_free_result($res);
mysqli_close($conn);

}

数据分页处理

大致流程如下:

计算数据总页数

在实现这一功能时,需要考虑到以下几个变量:

1
2
3
4
$pageSize         //每页显示几条记录(由程序员来定义)
$pageNow //显示第几页(用户输入)
$pageCount //一共多少页(需要设计算法实现)
$rowCount //共有多少行记录(需要从emp表中获取)

计算总页数,也就是计算$pageCount的值,从逻辑上来讲,页数=进一法取整(总记录数/每页显示记录数),用代码实现即是如下操作。

关于数据库连接、释放资源与关闭连接功能这里不再赘述、与上面讲到的一致,这里只提及功能实现部分。

1
2
3
4
5
6
7
8
9

//从emp表中获取总行数
$sql="select count(id) from emp";
$res1=mysqli_query($conn,$sql) or die(mysqli_error());

//计算总页数
if ($row=mysqli_fetch_row($res)) {
$pageCount=ceil($row[0]/$pageSize); //ceil是"进一取整"函数,正好符合题意
}

确定每页应当显示数据

之所以定义\$pageSize,就是为了限制每页应当显示的记录数,可以实现将记录分页的效果。另外一个需要考虑的问题是当前页应当从哪一个记录开始显示?
我们假设当前页\$pageNow=3,每页显示记录数$pageSize=6。我们执行下面的指令,
select * from emp limit "12,6"

  • limit取记录时从0开始计数,其中的12表示从第13条记录开始取
  • 其中的6表示向后取出几条记录

参数1的计算与当前页和每页显示记录数均有关,
12=(3-1)6=(\$pageNow-1)\$pageSize.
所以通过select * from emp limit ".($pageNow-1)*$pageSize.",$pageSize就可以正确限制每页显示的数据。

1
2
3
//从emp表中获取所有记录,并通过限制手段来实现正确的数据显示
$sql="select * from emp limit ".($pageNow-1)*$pageSize.",$pageSize";
$res2=mysqli_query($conn,$sql) or die (mysqli_error());

当页数和每页应当显示的数据都获取到之后,便可以返回到管理界面empList.php,打印出页面。

打印管理用户界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//打印出表头
echo "<table width='700px' border='1px'>";
echo "<tr><th>id</th><th>name</th><th>grade</th><th>email</th><th>salary</th><th>删除用户</th><th>修改用户</th></tr>"

//传入数据
for ($i=0;$i<count($res2);$i++) {
$row=$res2[$i];
echo "<tr><td>{$row['id']}</td><td>{$row['name']}</td><td>{$row['grade']}</td><td>{$row['email']}</td><td>{$row['salary']}</td><td><a href='#'>删除用户</a></td><td><a>修改用户</a></td></tr>"
}
//表尾
echo "</table>";

//上一页
if ($pageNow>1) {
$perPage=$pageNow-1;
echo "<a href='empList.php?pageNow=$prePage'>上一页</a>";
}
//下一页
if ($pageNow<$pageCount) {
$nextPage=$pageNow+1;
echo "<a href='empList.php?pageNow=$nextPage'>下一页</a>";
}

empList.php界面最终效果图

在这里,我只对其中的部分关键功能进行了分析,完整代码可以参阅雇员管理系统

-------------The End-------------