php借书功能实现
数据库设计
创建借书功能需要设计数据库表结构,以下为关键表示例:
books表(书籍信息)
CREATE TABLE books (
book_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
author VARCHAR(50) NOT NULL,
isbn VARCHAR(20) UNIQUE,
total_copies INT DEFAULT 1,
available_copies INT DEFAULT 1,
status ENUM('available', 'unavailable') DEFAULT 'available'
);
users表(用户信息)
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(50) UNIQUE,
max_borrow_limit INT DEFAULT 3
);
borrow_records表(借阅记录)
CREATE TABLE borrow_records (
record_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
book_id INT,
borrow_date DATETIME DEFAULT CURRENT_TIMESTAMP,
return_date DATETIME,
due_date DATETIME,
status ENUM('borrowed', 'returned') DEFAULT 'borrowed',
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (book_id) REFERENCES books(book_id)
);
核心功能实现
1. 借书逻辑处理
通过PHP脚本检查用户可借阅数量及书籍库存,更新借阅记录:
<?php
function borrowBook($userId, $bookId) {
$pdo = new PDO("mysql:host=localhost;dbname=library", "username", "password");
// 检查用户是否达到借阅上限
$stmt = $pdo->prepare("SELECT COUNT(*) FROM borrow_records WHERE user_id = ? AND status = 'borrowed'");
$stmt->execute([$userId]);
$borrowedCount = $stmt->fetchColumn();
$stmt = $pdo->prepare("SELECT max_borrow_limit FROM users WHERE user_id = ?");
$stmt->execute([$userId]);
$maxLimit = $stmt->fetchColumn();
if ($borrowedCount >= $maxLimit) {
return "借阅数量已达上限";
}
// 检查书籍是否可借
$stmt = $pdo->prepare("SELECT available_copies FROM books WHERE book_id = ?");
$stmt->execute([$bookId]);
$available = $stmt->fetchColumn();
if ($available <= 0) {
return "书籍库存不足";
}
// 更新书籍库存
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare("UPDATE books SET available_copies = available_copies - 1 WHERE book_id = ?");
$stmt->execute([$bookId]);
// 添加借阅记录
$dueDate = date('Y-m-d H:i:s', strtotime('+30 days'));
$stmt = $pdo->prepare("INSERT INTO borrow_records (user_id, book_id, due_date) VALUES (?, ?, ?)");
$stmt->execute([$userId, $bookId, $dueDate]);
$pdo->commit();
return "借阅成功";
} catch (Exception $e) {
$pdo->rollBack();
return "系统错误:" . $e->getMessage();
}
}
?>
2. 还书逻辑处理
更新书籍库存与借阅记录状态:
<?php
function returnBook($recordId) {
$pdo = new PDO("mysql:host=localhost;dbname=library", "username", "password");
$pdo->beginTransaction();
try {
// 获取借阅记录中的书籍ID
$stmt = $pdo->prepare("SELECT book_id FROM borrow_records WHERE record_id = ?");
$stmt->execute([$recordId]);
$bookId = $stmt->fetchColumn();
// 更新书籍库存
$stmt = $pdo->prepare("UPDATE books SET available_copies = available_copies + 1 WHERE book_id = ?");
$stmt->execute([$bookId]);
// 更新借阅记录状态
$stmt = $pdo->prepare("UPDATE borrow_records SET status = 'returned', return_date = NOW() WHERE record_id = ?");
$stmt->execute([$recordId]);
$pdo->commit();
return "还书成功";
} catch (Exception $e) {
$pdo->rollBack();
return "系统错误:" . $e->getMessage();
}
}
?>
前端交互示例
HTML表单(借书操作)
<form action="borrow.php" method="post">
<label>用户ID: <input type="number" name="user_id" required></label>
<label>书籍ID: <input type="number" name="book_id" required></label>
<button type="submit">提交借阅</button>
</form>
PHP处理脚本(borrow.php)

<?php
include 'functions.php'; // 包含上述borrowBook函数
$userId = $_POST['user_id'];
$bookId = $_POST['book_id'];
echo borrowBook($userId, $bookId);
?>
扩展功能建议
- 逾期检查:通过定时任务检查
due_date,自动发送提醒邮件。 - 预约功能:当书籍不可用时,允许用户预约并通知到货。
- 数据统计:分析用户借阅偏好与热门书籍排行。
通过以上步骤可实现完整的借书系统,需根据实际需求调整事务处理与异常逻辑。






