四、项目实现
代码结构
1.封装数据库函数库,方便调用,减少代码书写量
该文件放在/lib 下,文件名为db_function.php
<?php
//默认关闭调试模式
if (!defined('DB_DEBUG')) {
defined('DB_DEBUG',false);
}
/**
* 初始化数据库连接
* @param array $config 数据库连接信息
*/
function db_init($config=array()){
//数据库默认连接信息
$def_config = array(
'host' => '127.0.0.1',
'user' => 'root',
'password' => '',
'charset' => 'utf8',
'dbname' => 'stumanager',
'port' => 3306
);
//如果传参,则覆盖默认设置
$config = array_merge($def_config,$config);
//连接数据库
$link = mysqli_connect($config['host'],$config['user'],$config['password'],$config['dbname']);
//判断数据库连接是否成功,如果不成功则显示错误信息并终止脚本继续执行
if(!$link){
if(DB_DEBUG){
die('连接数据库失败!'.mysqli_connect_error());
}else{
die('连接数据库失败!');
}
}
//设置字符集
mysqli_query($link,'set names '.$config['charset']);
return $link;
}
/**
* 执行SQL的方法
* @param string $sql 待执行的SQL
* @return mixed 失败返回false,成功,如果是查询语句返回结果集,如果非查询类返回true
*/
function db_query($link,$sql) {
//执行SQL语句
if($result = mysqli_query($link,$sql)) {
return $result;
}else if(DB_DEBUG){
echo 'SQL执行失败:<br>';
echo '错误的SQL为:', $sql, '<br>';
echo '错误的代码为:', mysqli_error($link), '<br>';
echo '错误的信息为:', mysqli_error($link), '<br>';
die;
}else{
die('SQL语句执行失败。');
}
}
/**
* 处理结果集中有多行数据的方法
* @param string $sql 待执行的SQL
* @return array 返回遍历结果集后的二维数组
*/
function db_fetch_all($link,$sql) {
//执行query()函数
if ($result = db_query($link,$sql)) {
//执行成功
//遍历结果集
$rows = array();
while( $row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$rows[] = $row;
}
//释放结果集资源
mysqli_free_result($result);
return $rows;
} else {
//执行失败
return false;
}
}
/**
* 处理结果集中只有一行数据的方法
* @param string $sql 待执行的SQL语句
* @return array 返回结果集处理后的一维数组
*/
function db_fetch_row($link,$sql) {
//执行query()函数
if ($result = db_query($link,$sql)) {
//从结果集取得一次数据即可
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
return $row;
} else {
return false;
}
}
/**
* 处理结果集只有一个数据的方法
*/
function db_fetch_column($link,$sql){
if($result = db_query($link,$sql)){
$row = mysqli_fetch_row($result);
return $row[0];
}else{
return false;
}
}
/**
* 对数据进行SQL转义
* @param string $data 待转义字符串
* @return string 转义后的字符串
*/
function db_escape($link,$data){
//转义字符串中的特殊字符
return mysqli_real_escape_string($link,$data);
}
2. 创建项目初始化文件
项目初始化文件是项目中每个实现功能的PHP脚本都引入的公共文件,该初始化文件的主要作用是引入函数库、设置字符集、连接数据库等。
该文件放在/,文件名为init.php
<?php
//设定字符集
header('Content-Type:text/html;charset=utf-8');
//开启调试模式
define('DB_DEBUG',true);
//加载数据库操作函数库
require './lib/db_function.php';
//初始化数据库
$link = db_init(array(
'host' => '127.0.0.1', //主机名
'user' => 'root', //用户名
'password' => '',//密码
'dbname' => 'stumanager', //数据库
'charset' => 'utf8' //字符集
));
//接收GET变量
function input_get($name){
return isset($_GET[$name]) ? $_GET[$name] : '';
}
//接收POST变量
function input_post($name){
return isset($_POST[$name]) ? $_POST[$name] : '';
}
/**
* 对字符串数据进行过滤
* @param string $data 待转义字符串
* @return string 转义后的字符串
*/
function filter($data,$func=array('trim','htmlspecialchars')){
foreach($func as $v){
//调用可变函数过滤数据
$data = $v((string)$data);
}
return $data;
}
/**
* JavaScript弹窗并返回
*/
function alert_back($msg){
echo "<script>alert('$msg');history.back();</script>";
exit;
}
3、学生信息展示页面
展示学生列表的功能开发十分简单,将学生信息数据从数据库中查询后展示即可。
该文件放在/ ,文件名为index.php
<?php
//学生列表功能
header("content-type:text/html;charset=utf-8");
require './init.php'; //项目初始化文件
require './lib/page_function.php'; //引入分页函数库
//函数:生成排序SQL
function make_sort_sql($order,$sort){
//允许排序的字段
$fields = array('id','dept_id','name','birth','entry');
//判断$order是否存在于合法字段列表中
if(in_array($order,$fields)){
//判断$sort是否为合法值
if(in_array($sort,array('asc','desc'))){
return "order by `stu_$order` $sort";
}
}
return '';
}
//函数:生成搜索SQL
function make_search_sql($link,$keyword){
$keyword = db_escape($link,filter($keyword));
return "and stu_name like '%$keyword%'";
}
//函数:生成LIMIT SQL
function make_limit_sql($page,$page_size){
return 'limit '.(($page-1)*$page_size).','.$page_size;
}
//排序功能
$order = input_get('order');
$order_sort = input_get('sort');
$order_sql = make_sort_sql($order,$order_sort); //生成排序SQL
//搜索功能
$search = input_get('search');
$where_sql = $search ? make_search_sql($link,$search) : '';
//分页功能
$page_size = 5; //每页显示5条信息
$page_count = db_fetch_column($link,'select count(*) from stu_info'); //查询所有记录条数
$page_max = ceil($page_count/$page_size); //计算最大页码值
$page = (int)input_get('page'); //获取当前访问的页码
$page = max($page,1); //页码值最小为1
$page = min($page,$page_max); //页码值最大为$max_page
$page_html = makePageHtml($page,$page_max); //调用函数生成分页链接
$limit_sql = make_limit_sql($page,$page_size); //拼接SQL
//准备SQL语句
$sql = "select * from stu_info left join stu_dept on dept_id=stu_dept_id where 1=1 $where_sql $order_sql $limit_sql";
//获取员工信息数据
$emp_info = db_fetch_all($link,$sql);
//加载视图页面,显示数据
require './view/list.html';