员工管理系统(mysql数据库用户列表的分页显示、修改、删除),编程思路总结
例程远行截图
一、 架构说明
程序包含以下页面、模块
1、 index.php员工列表;
2、 edit.php 编辑修改页面;
3、 handle.php 逻辑处理模块;
4、 sql.php 数据库连接模块;
二、 sql.php 数据库连接模块说明
1、模块总体说明:sql.php数据库连接模块,负责从数据库取出指定的员工数据,赋值给变量$staffs后,再给到index.php员工列表使用;
2、Sql模块有三个初始变量:
$num : 每页显示规定显示的用户数据条目数量,示例中规定为每页10条;
$page : 当是是显示第几页的数据,启动时默认为1,后面由用户点击分页按钮决定,由$_GET['p']方法获取;
$offset : 偏移量,指定要显示的起启行,到线束行数据,给到select语句用select * from `staffs` limit {$offset}, {$num};
3、Sql模块,输出了两个变量,除了员工数据变量$staffs;
还有一个$num变量,用来记录分页的数量,由"select ceil(count(*)/{$num}) total from `staffs`;"获得;
4、sql模块通过require语句,导入config文件夹中的connect.php文件,获得$pdo对象;
5、connect.php通过require语句,导入config文件夹中的config.php文件获得数据库配置参数;
数据库配置参数是一个关联数组,通过extract($config)语句,将其解析成独立变量后使用;
sql.php 数据库连接模块(代码)
<?php
require __DIR__ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'connect.php';
//每页条目数
$num = 10;
// 当前的页码通常是能过GET请求过来的
$page = $_GET['p'] ?? 1;
// 计算当前页的起始偏移量
$offset = ($page - 1) * $num;
//获取分页后总条目数, 使用别名total后,变量$pageNum的结果: Array( [ceil(count(*)/10)] => 8 )
$sql = "select ceil(count(*)/{$num}) total from `staffs`;";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$pageNum = $stmt->fetch()['total'];
//echo $pageNum;
// 2. 每页要显示的数据?
$sql = "select * from `staffs` limit {$offset}, {$num};";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$staffs = $stmt->fetchAll();
三、 index.php主页面说明
1、index.php页面通过require语句,导入sql.php文件获得存放员工数据的变量$staffs;
2、Index.php页面,采用foreach ($staffs as $staff)语句循环变量$staffs,并用<?= $staff['sid'] ?>取出数据;
注:这里采和短标签语法<?= ?>,代替<?php echo ?>;
3、最后的“操作” 栏中:
编辑按钮:行内绑定onclick点击事件,跳转至handle.php模块,并传入用户sid,使用语句如下:
<button onclick="location.href='edit.php?action=edit&sid=<?=$staff['sid']?>'">编辑</button>
删除按钮:行内绑定onclick点击事件,跳转至页面内建del()函数,语句如下:
<button onclick="del(<?=$staff['sid']?>)">删除</button>
del()函数:使用confirm()函数,加上三元选择,跳转转handle.php模块,进行删除操作,同时提示是否进行删除操作,语句如下:
let url = 'handle.php?action=del&sid=' + sid;
return confirm('是否删除编号为: '+sid+' 的员工数据?') ? location.href=url : false;
index.php主页面(代码)
<?php require 'sql.php' ?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>员工管理系统</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<table>
<caption><h2>员工管理系统</h2></caption>
<thead>
<tr>
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>工资</td>
<td>邮箱</td>
<td>生日</td>
<td>入职时间</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<?php foreach ($staffs as $staff) : ?>
<tr>
<td><?= $staff['sid'] ?></td>
<td><?= $staff['name'] ?></td>
<td><?= $staff['age'] ?></td>
<td><?= $staff['gender']=='male' ? '男':'女' ?></td>
<td><?= $staff['salary'] ?></td>
<td><?= $staff['email'] ?></td>
<td><?= $staff['birthday'] ?></td>
<td><?= $staff['create_at'] ?></td>
<td>
<button onclick="location.href='edit.php?action=edit&sid=<?=$staff['sid']?>'">编辑</button>
<button onclick="del(<?=$staff['sid']?>)">删除</button>
</td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<p>
<!-- 实现上一页和首页 -->
<!-- 处理上一页和首页的变量和逻辑-->
<?php $prev = $page==1? 1:$page-1; ?>
<!-- 显示实现上一页和首页,按钮 -->
<?php if($page !=1): ?>
<a href="<?=$_SERVER['PHP_SELF'].'?p=1' ?>">首页</a>
<a href="<?=$_SERVER['PHP_SELF'].'?p='. $prev ?>">上一页</a>
<?php endif ?>
<!-- 显示每一页按钮 -->
<?php for ($i=1; $i<=$pageNum; $i++) : ?>
<?php
$jump = sprintf('%s?p=%d', $_SERVER['PHP_SELF'], $i);
$active = ($i == $page) ? 'active':'';
?>
<a href="<?=$jump ?>" class="<?=$active ?>"><?= $i ?></a>
<?php endfor ?>
<!-- 实现下一页和尾页 -->
<!-- 处理下一页和尾页的变量和逻辑-->
<?php $prev = $page==$pageNum? $pageNum:$page+1; ?>
<!-- 显示实现上一页和首页,按钮 -->
<?php if($page !=$pageNum): ?>
<a href="<?=$_SERVER['PHP_SELF'].'?p='. $prev ?>">下一页</a>
<a href="<?=$_SERVER['PHP_SELF'].'?p='. $pageNum?>">尾页</a>
<?php endif ?>
</p>
</body>
<script>
function del(sid) {
let url = 'handle.php?action=del&sid=' + sid;
return confirm('是否删除编号为: '+sid+' 的员工数据?') ? location.href=url : false;
}
</script>
</html>
四、 handle.php模块说明
1、首先handle模块通过require语句,导入config文件夹中的connect.php文件,获得$pdo对象;
2、handle模块模块有两个初始变量,$action、$sid,均由$_GET['']函数,从地址栏获取;
$action:用来判断用户想执行的操作;
$sid: 将要执行操作数据的ID;
3、通过switch ($action) {}语句进行判断,来选择执行的动作:
case 'edit': ,跳转至edit.php用户信息修改页面,由修改好数据后,再回来处理;
header('location:edit.php?sid='.$sid);
case 'update': ,这里接收到edit.php页面修改的更新数据(由$_POST函数获取),来更新用户数据,
更新完成后,提示用户更新成功,并跳转index页面,语句如下:
echo '<script>alert("更新成功");location.href="list.php";</script>';
注:这里的sqly语句,可以使用:name字符占位符,它可以直接使用$_POST函数生成的,关联数组,比使用? 号占位符更方便;
如果使用了?号占位符,那就要使用array_values($_POST)函数,将关联数组变成索引数组;
我的示例程序中,使用的是?号占位符,所以我使用了array_values($_POST)函数;
case 'del': ,删除操作,删除完成后提示“删除成功”,语句如下:
echo '<script>alert("删除成功");location.href="list.php";</script>';
handle.php模块(代码)
<?php
//连接数据库, 拿到PDO对象
require __DIR__ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'connect.php';
//获取操作参数
$action = $_GET['action'];
$sid = $_GET['sid'];
//print_r(array_values($_POST));
//die();
//执行操作,数据库的,查找、修改、删除
switch ($action) {
case 'edit':
header('location:edit.php?sid='.$sid);
break;
case 'update':
$sql = <<< sql
update staffs set
name=?,age=?,gender=?,salary=?,email=?,birthday=?
where sid={$sid};
sql;
//// 教程中的代码
// $stmt = $pdo->prepare($sql);
// $stmt->execute(array_values($_POST));
// 简写代码, 直接返回执行结果, 受影响的条目数量
$res = $pdo->prepare($sql)->execute(array_values($_POST));
// sql语句测试打印代码
// echo $stmt->debugDumpParams();
if ($res) {
echo '<script>alert("更新成功");location.href="index.php";</script>';
}
break;
case 'del':
$sql = 'delete from `staffs` where `sid` = ?;';
$stmt = $pdo->prepare($sql);
$stmt->execute([$sid]);
if ($stmt->rowCount() == 1) {
echo '<script>alert("删除成功");location.href="index.php";</script>';
}
break;
default:
return ('非法操作...');
}
五、 Edit.php修改员工数据页面说明
1、首先Edit.页面通过require语句,导入config文件夹中的connect.php文件,获得$pdo对象;
2、通过$_GET['sid']函数获取sid,在数据库获得员工信息,并展示在input输入框中;
这个功能应该要集成到handle模块中,现在为了方便,先放在这里……
3、Input输入框中的name属性名,须要和数据表中的字段字一致;
4、Form表单点提交按钮,采用post方式,将数据提交给handle.php模块的update部分处理,语句如下:
<form action="handle.php?action=update&sid=<?=$sid?>" method="post">
Edit.php修改员工数据页面(代码)
<?php
//连接数据库, 拿到PDO对象
require __DIR__ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'connect.php';
$sid = $_GET['sid'];
$sql = 'select * from `staffs` where sid= ?';
$stmt = $pdo->prepare($sql);
$stmt->execute([$sid]);
$staff = $stmt->fetch();
//print_r($staff);
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>修改员工信息</title>
</head>
<body>
<form action="handle.php?action=update&sid=<?=$sid?>" method="post">
<div class="box" >
<div>修改员工信息</div>
<div>
<span>编号:</span>
<input type="text" value="<?=$staff['sid'] ?>" disabled>
</div>
<div>
<span>姓名:</span>
<input type="text" name="name" value="<?=$staff['name'] ?>">
</div>
<div>
<span>年龄:</span>
<input type="text" name="age" value="<?=$staff['age'] ?>">
</div>
<div>
<span>性别:</span>
<input type="text" name="gender" value="<?=$staff['gender'] ?>">
</div>
<div>
<span>工资:</span>
<input type="text" name="salary" value="<?=$staff['salary'] ?>">
</div>
<div>
<span>邮箱:</span>
<input type="text" name="email" value="<?=$staff['email'] ?>">
</div>
<div>
<span>生日:</span>
<input type="text" name="birthday" value="<?=$staff['birthday'] ?>">
</div>
<div>
<span>入职时间:</span>
<input type="text" value="<?=$staff['create_at'] ?>" disabled>
</div>
<div>
<button type="submit">保存</button>
</div>
</div>
</form>
</body>
</html>
六、AJAX无刷新分页, 还没研究出来应该怎么做,后面研究好了再补做…