1、实验目的

设计并实现一个精简的图书管理系统,要求具有图书入库、查询、借书、还书、借书证管理等功能。

2、实验平台

  • WAMP
  • win 10
  • mysqli

3、系统需求分析

基本数据对象

  • 书(书号、类别、书名、出版社、年份、作者、价格、总藏书量、库存)
  • 借书证(卡号、姓名、单位、类别(学生/教师))
  • 管理员(管理员ID,密码,姓名,联系方式)
  • 结束记录(书号、借书证号、借期、还期、经手(管理员id))

基本功能模块

管理员登录

输入管理员ID, 密码; 登入系统 或 返回ID/密码 错误.

图书入库

  1. 单本入库
  2. 批量入库 (方便最后测试)
    图书信息存放在文件中, 每条图书信息为一行. 一行中的内容如下
    ( 书号, 类别, 书名, 出版社, 年份, 作者, 价格, 数量 )
    Note: 其中 年份、数量是整数类型; 价格是两位小数类型; 其余为字符串类型
    Sample:
    ( book_no_1, Computer Science, Computer Architecture, xxx, 2004, xxx, 90.00, 2 )

图书查询

要求可以对书的 类别, 书名, 出版社, 年份(年份区间), 作者, 价格(区间) 进行查询. 每条图书信息包括以下内容:
( 书号, 类别, 书名, 出版社, 年份, 作者, 价格, 总藏书量, 库存 )

可选要求: 可以按用户指定属性对图书信息进行排序. (默认是书名)

借书

  1. 输入借书证卡号
    显示该借书证所有已借书籍 (返回, 格式同查询模块)
  2. 输入书号
    如果该书还有库存,则借书成功,同时库存数减一。
    否则输出该书无库存,且输出最近归还的时间。

还书

1.输入借书证卡号
显示该借书证所有已借书籍 (返回, 格式同查询模块)
2.输入书号
如果该书在已借书籍列表内, 则还书成功, 同时库存加一.
否则输出出错信息.

借书证管理

增加或删除一个借书证.

4、系统设计

4.1 总体设计

采用简单粗暴的MV(视图-模型)这一系统模型,在视图端(浏览器)发送请求,服务器处理这一请求并返回数据,视图接受数据并显示到视图中。

4.2 数据库表结构设计

表定义

create table book
(bno char(8),category char(10),title varchar(40),press varchar(30),year int,author varchar(20),price decimal(7,2),total int,stock int,primary key(bno)
);create table card
(cno char(7),name varchar(10),department varchar(40),type char(1),primary key(cno),check (type in ('T','S'))
);create table admin
(admin_id char(20),password char(20),name char(20),email char(30),primary key(admin_id)
);create table borrow
(cno char(7),bno char(8),borrow_date date,return_date date,done_by char(20),foreign key (bno) references book(bno) on delete cascade,foreign key (cno) references card(cno) on update cascade
);

但是,mysql的check是无用的,使用触发器来实现check功能:

DELIMITER $$
create trigger type_check_triger before insert on card
for each row
beginif(new.type not in ('T','S'))then signal sqlstate '04922'set message_text = "ERROR: card type not in ('T','S')";end if;
end $$
DELIMITER ;

4.3 管理员登录模块

首先进入主页,选择(管理员/查询)这两个功能之一。由于普通用户只能进行查询功能,就不需要它们登录了。

这里使用的是html的radio表单:

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"><input type="radio" name="q" value="admin">ADMIN<input type="radio" name="q" value="user">USER<input type="submit" value=" OK "><span class="error" style="color:brown"> <?php echo $choseerror;?></span>
</form>

php脚本根据表单提交选择用户查询界面或者登录界面:

<?php $choseerror="";$chose="";if($_SERVER["REQUEST_METHOD"] == "POST"){if(empty($_POST['q'])){$choseerror = "必须选择访问身份";} else {$chose=$_POST['q'];if($chose=="admin"){header("location:login.php");}else{header("location:query.php");}}}
?>

登录界面如下图:

选择admin身份,进入登录界面,输入账号和密码:

这个初始的账号是我在创建数据库的时候创建的:

在登录界面的login.php中,首先和数据库建立连接,这里我使用了mysqli这个mysql拓展来连接。在连接的过程中有一点要注意的是,由于wamp默认了mariadb,所以你在连接的时候要指定mysql服务器的端口号。我就是在连接时找不到我创建的book数据库,然后在这了卡了很久。

<?php$server_name="localhost";$username="root";$password="qazwsx";$dbname="book";$conn = new mysqli($server_name,$username,$password,$dbname,'3308');if ($conn->connect_error) {die("连接失败: " . $conn->connect_error);}
?>

之后再从book数据库中,select看看是否有表单输入的账户id和pwd,按情况分别处理:

        include 'connect.php';$id=$_POST['account'];$pwd=$_POST['password'];$sql_query="select * from admin where admin_id='".$id."' and password = '".$pwd."'";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);if($info==false){$loginerror = "ID或PWD错误!";}else{$_SESSION['admin_id']=$id;$_SESSION['pwd']=$pwd;header("location:index.php");}

账号密码错误提示:ID或PWD错误

登录成功后跳转到index.php界面。

index界面选择所需要执行的功能。

4.4 图书入库模块

4.4.1单本入库

使用一个表单,submit后做出判断,如果是需要的格式就插入到数据库。
所谓对格式做出判断,一是要求非空,二是要求year,num是整形,price是两位小数:

//出版年份if (empty($_POST["year"])){$yearErr = "必需";$tbool=false;}else    {$year = test_input($_POST["year"]);if (!preg_match("/^[0-9]*$/",$year)){$yearErr = "只允整数";$tbool=false; }}//价格if (empty($_POST["price"])){$priceErr = "必需";$tbool=false;}else    {$price = test_input($_POST["price"]);if (!preg_match("/^([0-9]*)+(.[0-9]{1,2})?$/",$price)){$priceErr = "decimal(7.2)"; $tbool=false;}}

另外要考虑到:如果管理员入库一本馆藏中有的书,那么就不是insert而需要update。于是先做出判断:

        $sql_query="select * from book where bno='".$bno."'";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);if($info==false){//并不存在这一本书...}else{//这本书已经在馆藏中了...}

单本插入(无该书馆藏):

插入结果,在命令行中查看:

已经有馆藏了,继续插入:

命令行select显示新的4本也被入库:

4.4.2 批量入库

图书信息存在一个文件种,提交文件名:

批量插入后表如下:

同样,在有藏书的情况下再次入库:

批量导入和单本导入的差别并不大,主要涉及到对文件及字符串的处理:

<?php...省略$filename=$_POST['filename'];$file=fopen($filename,"r") or exit("无法打开文件".$filename);while(!feof($file)){$line = fgets($file);$line = test_input($line);if($line=="") continue;$line = mb_substr($line,1,mb_strlen($line)-2);$array = explode(",",$line);$bno=$array[0];...省略其它赋值include 'connect.php';//首先看看是否已经存在了这一本书,如果存在,则update,否则就是insert$sql_query="select * from book where bno=".$bno."";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);if($info==false){//并不存在这一本书...}else{//这本书已经在馆藏中了...}...省略
?>

4.4 图书查询模块

设置一个表单、收集需要的复合查询项。在php中将表单post的值进行处理,此处以price为例。当左/右区间为空时、设置为默认[0,9999.99]。检测值是否符合正则表达式、组装sql语句:

        if (!empty($_POST["pricel"])){$pricel = test_input($_POST["pricel"]);if (!preg_match("/^([0-9]*)+(.[0-9]{1,2})?$/",$pricel)){$queryErr = $queryErr."价格左区间应当是decimal(7.2)形式!"; $tbool=false;}}if(!empty($_POST["pricer"])){$pricer = test_input($_POST["pricer"]);if (!preg_match("/^([0-9]*)+(.[0-9]{1,2})?$/",$pricer)){$queryErr = $queryErr."价格右区间应当是decimal(7.2)形式!"; $tbool=false;}}if($pricel > $pricer){$queryErr = $queryErr."价格左区间应当小于右区间!";$tbool=false;}else{$sql_query=$sql_query." and price between ".$pricel." and ".$pricer." ";}

查询输入出错:
应当左区间小于右区间且符合格式:

复合查询:
类别为小说、出版年份大于2000,价格小于40,按照出版年份排序:

4.5 借书模块

对于借书,首先判断借书证号是否存在,不存在则输出错误信息:

//测试是否有该借书证$sql_query="select * from card where cno = '".$cno."'";//echo $sql_query;$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);if($info==false){//并不存在这一借书证号$borrowErr.="借书证".$cno."不存在!";}else{...}


然后判断所借的书是否非空,非空则判断是否已经借了这本书,
若没有借这本书,是否还有库存,如果没有库存,最近一次归还日期(实验要求的,我也不知道这个有啥用)

                if(!empty($_POST["bno"])){$bno=$_POST["bno"];$sql_query="select * from borrow natural join book where cno = '".$cno."' and bno = '".$bno."' and return_date is null";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);//echo $sql_query;//print_r($info);if($info==false){//没有借这本书$sql_query="select * from book where bno = '".$bno."'";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);if($info==false){$borrowErr.="该书不存在";}else{$tmpstock=$info[8];if($tmpstock=="0"){$sql_query="select return_date from borrow where bno = '".$bno."' order by return_date desc";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);$last_re_date = $info[0];$borrowErr.= "该书库存为0!最近一次归还日期为:<br>".$last_re_date;}else{//从book的stock中减少一本$sql_query="update book set stock = ".$tmpstock." -1 where bno = '".$bno."'";//echo $sql_query;$sql=$conn->query($sql_query);//向borrow记录插入一本书$sql_query="insert into borrow values('".$cno."','".$bno."','".date("Y-m-d")."',null,'".$id."')";//echo $sql_query;$sql=$conn->query($sql_query);}}}else{//echo "hello";$borrowErr.="已经有一本了,给别人留点吧!";}}

书不存在

已经有了一本

没库存了:

4.6 还书模块

还书模块的要求与借书模块基本相近。
显示已经借的书籍:

还书(bno=1)之后:

还一本没有借的书:

4.7 借书证管理

我们用一个表单来收集一个card tuple所需要的属性,一个单选radio来选择功能(添加/删除)。
对于插入,判断是否已经存在了一个相同的卡号,如果已存在,则输出错误信息。否则insert插入:

                if($fun=="add"){if($info==false){//插入$sql_query="insert into card values('".$cno."','".$name."','".$department."','".$type."')";$conn->query($sql_query);}else{//已经存在卡号$cardErr.="卡号已存在,无法添加!";}}

账号已存在:

插入成功:

输入信息不足:

对于删除,也是先查看卡号是否存在。如果存在且该卡号还有未归还的书籍,那么输出错误信息,否则删除。

                    if($info==false){//不存在$cardErr.="没有符合条件的卡号";}else{//已经存在卡号,是否有没有还的书$sql_query="select * from borrow natural join book where cno = '".$cno."' and return_date is null";$sql=$conn->query($sql_query);$info=mysqli_fetch_array($sql);if($info==false){//没有没还的书,可以删除$sql_query="delete from card where cno = '".$cno."'";$sql=$conn->query($sql_query);}else{//还不能删除$cardErr.="还有未归还的书!";}}

查看卡号是否存在:

删除成功:

无法删除一个有借书信息的卡号:

4.8 账户登出

清空session,跳转到首页。

<?phpsession_start();$_SESSION = array();if (isset($_COOKIE[session_name()])) {setcookie(session_name(),'',time()-42000,'');}session_destroy();header("location:home.php");
?>

5、总结

总共花了3天,摸索着学html、css、php,最后终于弄出来了这个数据库的期中实验项目,真的困难。
另外代码这个学期不会放出(毕竟要交作业,查重恐怖

php+mysql 图书管理系统相关推荐

  1. ​php mysql 图书管理系统网页毕业设计成品

    php mysql图书管理系统毕业设计网站,用dreamweaver php mysql集成软件phpstudy制作,div css插入部分 table元素布局,19个网页(包括功能页面):有前台和后 ...

  2. 基于java+mysql的Swing+MySQL图书管理系统(java+swing+gui+mysql)

    基于java+mysql的Swing+MySQL图书管理系统(java+swing+gui+mysql) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/myeclip ...

  3. 基于Java+Swing+mysql图书管理系统

    基于Java+Swing+mysql图书管理系统 一.系统介绍 二.功能展示 1.用户登陆 2.图书管理 3.图书添加 4.图书类别管理 5.图书类别添加 三.数据库 四.其它 1.其他系统实现 五. ...

  4. java+Mysql 图书管理系统(idea)

    目录 前言 部分界面截图 登录界面 注册界面 图书管理界面 关于我们界面 部分代码 登录界面 数据库工具类 前言 jdk 版本:openjdk version "11.0.12" ...

  5. 基于Eclipse+Java Swing + Mysql图书管理系统

    一.项目概要: 基于Java Swing+Mysql(8.0)数据库的图书管理系统,具备登录.图书类别管理.图书管理功能. 二.获取方式: 有需要可以加QQ:571328502 点击下载 三.界面展示 ...

  6. python实现gui+mysql图书管理系统_用Python Django框架写一个图书管理系统LMS

    今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始 Django文件配置 Django模版 ...

  7. java+ssm+mysql图书管理系统

    项目介绍: 一个图书管理系统,界面很精美. 包含普通用户和管理员用户, 普通用户可以注册.登录系统,修改密码,查看图书,借阅和退还,修改个人信息.借阅记录等等. 管理员用户主要包括用户管理.图书管理. ...

  8. JavaSwing+MySQL图书管理系统,功能全部实现界面可改

    Java+Swing+mysql5实现图书管理系统 系统说明:本系统采用eclipse开发,IDEA,eclipse,myeclipse均可运行 界面采用swing实现 数据库:mysql,附sql代 ...

  9. 基于PHP+MySQL图书管理系统的设计与实现——计算机毕业设计

    开发本图书管理系统目的是为了实现对图书馆的图书,借阅等进行科学化的管理,便于图书信息以及借阅信息的查询和安全控制,提高设备使用效率,减少维护成本. 图书管理系统实现对图书的管理和借阅管理,利用PHP及 ...

  10. redis和mysql图书管理系统_基于SpringSecurity+SSM+SpringBoot+RabbitMQ+Redis+ShardingJdbc--在线图书管理系统...

    后续会不断加入技术 系统功能说明: ​ 用户模块: 用户登录认证 用户授权 用户新增 用户修改 上传头像,验证表单, ​ 用户删除, 批量删除, 高级查询 ,表格分页 数据导出 等 ​ 菜单模块: 一 ...

最新文章

  1. 戈峻:英特尔推动嵌入式教育 意在双赢
  2. CBM--组件化业务模型简介
  3. UVA 11645 Bits(组合数学)
  4. SAP Spartacus里解析route参数的逻辑
  5. 广州大学计算机网络期末考试2013,广州大学计算机网络技术试卷(A卷)
  6. python中列表的值与内存地址_python---列表、元组
  7. java clone原理_cloneAble接口实现clone()原理
  8. 当技术遇上管理,Linaro 与 CSDN 掌舵人对话开源现状及下一代技术趋势
  9. jQuery1.9.1源码分析--Deferred对象和Promise对象
  10. 问题三十六:ray tracing中的Inverse Mapping(5)——圆锥面Inverse Mapping
  11. red5流媒体服务器网站,[RED5]red5流媒体服务器(开源免费)的安装方法
  12. 小语种翻译软件,谷歌api接口批量翻译软件
  13. HTML网页图片滚动代码
  14. Chrome浏览器快捷键
  15. 国产图形化的msf——Viper初体验
  16. BOOST元状态机用户手册之三教程(Meta State Machine (MSM))(1)——基本前端及例程
  17. 2020010909
  18. c 语言写数独游戏,经典数独游戏+数独求解器—纯C语言实现
  19. 衬线字体和无衬线字体区别_字体,字体和字体系列有什么区别?
  20. SumatraPDF反向搜索命令行设置

热门文章

  1. 约瑟夫环c语言代码加注释,约瑟夫环c语言代码原创.doc
  2. sql 怎么获取系统时间
  3. office 打开wps乱_word打开wps是乱码怎么办
  4. Listary -- 高效率办公软件
  5. 懒人分析jQuery源码
  6. 数学建模之相关分析分类与总结
  7. 世界黑客编程大赛第一名的作品(97年Mekka ’97 4K Intro比赛)
  8. 计算机主板常见故障检修,电脑主板常见故障以及维修知识
  9. SQL Prompt
  10. Java高级工程师面试题总结及参考答案