
本文详解如何通过数据库状态校验与 PHP 逻辑控制,确保每本图书(以 jalad 标识)必须完整录入 5 页(sanad)后才允许插入新书,防止数据不完整导致的业务逻辑断裂。
本文详解如何通过数据库状态校验与 php 逻辑控制,确保每本图书(以 `jalad` 标识)必须完整录入 5 页(`sanad`)后才允许插入新书,防止数据不完整导致的业务逻辑断裂。
在图书管理系统中,若每本书严格对应且仅限 5 个页面(如古籍影印中的“页码”或档案卷宗中的“条目”),则数据库设计需配合强业务约束:不允许存在页数 。原始代码存在多个关键缺陷:未区分不同书籍(仅用 x 字段计数,但未关联 jalad)、SQL 注入风险、逻辑分支错位( 以下是经过重构的健壮实现方案: 通过以上设计,系统将严格遵循“5页封顶、填满才准入新书”的业务规则,既保障数据完整性,又具备良好的可维护性与安全性。✅ 核心逻辑三步走
✅ 安全、可运行的 PHP 示例(SQL Server + PDO/SQLSRV)
<?php
$serverName = "your_server";
$database = "your_db";
$connectionInfo = ["Database" => $database];
$conn = sqlsrv_connect($serverName, $connectionInfo);
if (!$conn) {
die("Connection failed: " . print_r(sqlsrv_errors(), true));
}
// ✅ 使用明确字段:jalad(书名)和 sanad(页内容)
$bookName = trim($_POST['jalad'] ?? '');
$pageContent = $_POST['sanad'] ?? '';
if (empty($bookName)) {
die("Error: Book name (jalad) is required.");
}
// ✅ 参数化查询防注入
$sqlCount = "SELECT COUNT(*) AS page_count FROM books WHERE jalad = ?";
$params = [$bookName];
$stmt = sqlsrv_query($conn, $sqlCount, $params);
if (!$stmt) {
die("Count query failed: " . print_r(sqlsrv_errors(), true));
}
$row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC);
$currentPageCount = (int)$row['page_count'];
// ✅ 状态判断与插入
if ($currentPageCount >= 5) {
echo "This book '{$bookName}' already has 5 pages. Please start a new book.";
} elseif ($currentPageCount < 5) {
$insertSql = "INSERT INTO books (jalad, sanad) VALUES (?, ?)";
$insertParams = [$bookName, $pageContent];
if (sqlsrv_query($conn, $insertSql, $insertParams)) {
$newCount = $currentPageCount + 1;
echo "Page {$newCount}/5 saved for '{$bookName}'.";
} else {
echo "Insert failed: " . print_r(sqlsrv_errors(), true);
}
} else {
// 理论上不会进入此分支(count 不可能为负)
echo "Unexpected database state.";
}
?>⚠️ 关键注意事项











