php+mysql 图书管理系统

article/2025/10/9 8:59:47

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,最后终于弄出来了这个数据库的期中实验项目,真的困难。
另外代码这个学期不会放出(毕竟要交作业,查重恐怖😱)

学期结束,代码:https://download.csdn.net/download/baidu_40614951/12549363


http://chatgpt.dhexx.cn/article/YxyhAqtQ.shtml

相关文章

PHP图书管理平台课程报告

图书管理平台 1 项目概述 进入21世纪以来&#xff0c;信息技术从根本上推动了图书馆的飞速发展&#xff0c;计算机和计算机管理系统已成为图书馆进行图书管理的主要设备和系统。虽然目前很多大型的图书馆已经有一整套比较完善的管理系统&#xff0c;但是在一些中小型的图书馆…

jquery的$.ajax()利用FormData数据类型与php后台交互

可能孤陋寡闻&#xff0c;现在才知道MDN的存在&#xff1a;https://developer.mozilla.org/zh-CN/ 的MDN全名容易理解他是什么意思&#xff1a;MDN Web Docs 好了&#xff0c;自行学习&#xff0c;上一篇讲了jquery的$.ajax()利用json数据类型与php后台交互 那么从MDN上了解到…

微信公众号发送模板消息 -- PHP后台

微信公众号发送模板消息 – PHP后台 注意&#xff1a;这里的用户openid必须是和你的appid&#xff0c;appsecret是一整套的&#xff0c;所谓一整套的意思就是&#xff0c;openid是通过你当前的这个appid获取到的&#xff0c;如果是通过其他appid获取到的用户openid&#xff0c…

微信小程序获取openid(php后台)

微信小程序已经开放了越来越多的功能&#xff0c;所能实现的用户需求也越多了&#xff0c;但是微信提供的wx.getUserInfo()只能获取用户的表面信息&#xff0c;想要是先发送模板消息或者支付功能&#xff0c;就需要获取用户的openid&#xff08;微信提供给每个微信用户独一无二…

搭建一个PHP后台的开发环境你所需要配置东西都有哪些?XAMPP问题

安装的工具&#xff1a; 1. Mysql workbench / Navicat 2. Postman 3. Visual Studio Code / Sublime Text 4. PHP开发环境 5. Nodejs开发环境 6. xampp 注意&#xff08;mysql版本 5.7以上 php版本&#xff1a;7.0以上&#xff09;/wampserver 工具下载地址&#xff…

PHP后台管理登录界面代码

1&#xff0c;自学PHP&#xff0c;编写一个简单的后台登录管理系统&#xff1b; 2&#xff0c;代码中少部分借用网上开源代码&#xff0c;如有不规范的地方请指正&#xff0c;如有更好的方法&#xff0c;多谢分享&#xff1b; 3&#xff0c;享受编程的乐趣并得到知识的提高&a…

php后台登录,实现后台管理员登录功能

上一章节我们选择了后台登录页面,并且将验证码成功的加入到了登录页 login.html 文件中。并且创建了数据库表admin,加入一条用户名和密码的测试数据。这一节我们就来实现登录功能。 先看一个简单功能实现流程图: 有了流程图就有了思路,顺着思路就知道自己一步一步需要做什么…

微信小程序之from表单提交数据到PHP后台

主要内容&#xff1a;实现微信小程序与PHP后台之间的数据传递 本文通过from表单提交到后台存入数据库来展现 需要注意的有&#xff1a; 勾选 代码如下&#xff1a; demo1.wxml <!--pages/demo1/demo1.wxml--> <form bindsubmitformSubmit bindresetformReset>…

PHP后台发送微信小程序订阅信息(较详细)

最近微信小程序甲方需新增下单提醒功能&#xff0c;于是我去微信文章看接入模板信息&#xff0c;但是看到最新公告&#xff08;模板消息接口将下线&#xff0c;推荐使用订阅信息&#xff09;官方通知&#xff1a; 1. 小程序订阅信息分为一次性订阅信息和长期性订阅信息&#x…

php后台框架整理

1、 fastadmin FastAdmin是一款基于ThinkPHPBootstrap开发的快速后台开发框架。FastAdmin基于Apache2.0开源协议发布&#xff0c;免费且不限制商业使用&#xff0c;目前被广泛应用于各大行业应用后台管理。 官网地址&#xff1a;FastAdmin – 基于ThinkPHP和Bootstrap的极速后…

【OpenCV】在Python环境下安装OpenCV并检测是否安装成功

一、OpenCV概述 OpenCV是一个开源的计算机视觉库&#xff0c;可以在Windows、Linux、MacOS等操作系统上运行。它起源于英特尔性能实验室的实验研究&#xff0c;由俄罗斯的专家负责实现和优化&#xff0c;并以为计算机视觉提供通用性接口为目标。 1.1、计算机视觉 计算机视觉…

安装CV2,安装opencv

几经尝试&#xff0c;发现并没有所谓的"cv2"包&#xff0c; 需要安装的是opencv这个包&#xff0c;安装后就可以import cv2了。方法如下&#xff1a; 方法一&#xff1a; 直接用pip安装&#xff0c;按windows r 输入cmd&#xff0c;在cmd环境下输入&#xff1a; …

opencv的安装及使用

文章目录 一、opencv的安装二、图片示例三.视频示例四、录制视频五、总结六、参考资料 一、opencv的安装 参考该链接https://blog.csdn.net/ssj925319/article/details/109231145完成OpenCV3.4.11 的安装。 二、图片示例 创建code目录&#xff0c;并进入 在该目录下创建te…

Ubuntu下Opencv安装与使用

Opencv 前言一、Opencv的功能二、安装Opencv1.下载 OpenCV 3.4.11 数据包2.解压安装包3.安装cmake和依赖库 三、配置编译环境1.创建编译文件夹2.使用make创建编译3.配置编译环境 四、Opencv使用例程1.图片处理2.视频处理1.虚拟机获取摄像头权限2.播放视频3.录制视频 总结 前言 …

OpenCV库安装

OpenCV库安装 OpenCV库的调用名是cv2 所以会看到这样的import语句 import cv2这句话就是对openCV库的调用 openCV库的下载安装 First 好像不需要像网上的教程那样, 首先去官网下载exe执行文件, 然后在VS中进行配置 直接在teminal中, 进入要指定的conda环境, 然后输入pip…

如何安装OpenCV?OpenCV下载安装流程

安装OpenCV需要以下步骤&#xff1a; 下载OpenCV&#xff1a;首先需要从OpenCV官网&#xff08;https://opencv.org/releases/&#xff09;上下载适合自己操作系统版本的OpenCV。 安装依赖项&#xff1a;在安装OpenCV之前&#xff0c;需要先安装一些必要的依赖项&#xff0c;例…

opencv的安装

记得之前看博客的时候看过很多大佬写过opencv的各种安装方法&#xff0c;有使用网站先下载对应文件进行安装的&#xff0c;不过这个还像还得配置一些环境&#xff0c;也有一些大佬使用prompt命令进行安装的&#xff0c;在本人想要安装opencv时大体看了看大佬们的安装教程&#…

OpenCV安装教程:Windows 安装 Visual Studio + OpenCV + OpenCV contrib

目录 0.写作背景 1.安装visual studio 2.下载OpenCV相关的源码 下载OpenCV原始的源码 下载OpenCV contrib的源码 下载安装cmake 3.cmake编译OpenCV 初始编译 CmakeDownload的bug修复 OpenCV-crontrib编译&#xff1a; Generate生成代码 VS生成代码&#xff1a; 报…

openCV-python安装

同样在anaconda下创建一个opencv-python环境 首先&#xff0c;打开anaconda navigator,然后创建一个环境来放opencv-python。 先点击下面的create&#xff0c;然后创建一个新环境。 选择你的python版本&#xff0c;这里我选择的是Python3.6。你也可以根据你的需要和习惯来选择…

opencv安装教程(通用过程说明)

文章目录 环境说明安装方式说明预编译版本从OpenCV团队获取从第三方开发者获取 从源码编译步骤0&#xff1a;安装准备步骤1&#xff1a;获取源代码步骤2&#xff1a;配置构建环境步骤3&#xff1a;构建步骤4&#xff1a;安装&#xff08;可选&#xff09;步骤5&#xff1a;构建…