PHP小说搜索代码

admin 105 0
PHP小说搜索代码主要用于实现小说资源的快速检索功能,核心包括数据库设计(如存储小说信息、章节内容的表结构)、搜索逻辑(关键词模糊匹配、全文本索引)及前端交互(搜索框、结果展示),通过MySQL的LIKE语句或全文索引实现高效查询,结合AJAX异步加载提升用户体验,并支持按书名、作者、分类等条件筛选,代码需注重SQL注入防护(如使用预处理语句),同时优化查询性能(如添加索引、缓存机制),最终以列表形式呈现搜索结果,包含书名、作者、简介及链接等关键信息,方便用户快速定位目标小说。

PHP实现小说搜索功能:代码示例与优化技巧

在当今数字阅读时代,网络小说平台如雨后春笋般涌现,为读者提供海量阅读资源,如何在浩如烟海的书籍中快速找到心仪的作品,成为提升用户体验的关键环节,本文将详细介绍如何使用PHP构建高效、稳定的小说搜索系统,包含完整代码实现、分页处理、关键词高亮显示以及性能优化技巧,帮助开发者打造流畅的搜索体验。

需求分析与功能设计

在着手开发之前,我们需要明确小说搜索系统的核心需求:

  1. 多维度搜索:支持按书名、作者、简介等多个字段进行模糊搜索,满足不同用户的查找习惯
  2. 结果展示优化:实现分页显示搜索结果,并对匹配的关键词进行高亮处理,提升可读性
  3. 性能保障:确保在数据量庞大的情况下仍能保持查询效率,避免用户等待
  4. 安全防护:有效防范SQL注入等常见安全威胁,保障系统稳定运行

基于上述需求,我们设计了"前端表单提交→PHP后端处理→数据库查询→结果返回"的完整流程,确保系统功能完整且用户体验良好。

数据库设计

合理的数据库结构是高效搜索的基础,以下是novels表的详细设计(MySQL示例):

CREATE TABLE `novels` (
  `id` int(11) NOT NULL AUTO_INCREMENT, varchar(255) NOT NULL COMMENT '书名',
  `author` varchar(100) NOT NULL COMMENT '作者',
  `description` text COMMENT '简介',
  `category_id` int(11) DEFAULT NULL COMMENT '分类ID',
  `status` tinyint(1) DEFAULT 1 COMMENT '状态:1-连载中,2-已完结',
  `created_at` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_title` (`title`),       -- 书名索引(优化查询)
  KEY `idx_author` (`author`),     -- 作者索引(优化查询)
  KEY `idx_category` (`category_id`) -- 分类索引(优化分类查询)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小说信息表';

设计说明:和author字段添加索引,可显著提升模糊查询性能

  • 增加status字段区分小说连载状态,便于用户筛选
  • 添加updated_at字段记录更新时间,方便按最新作品排序
  • 若需支持简介内容的全文搜索,可考虑添加FULLTEXT索引(详见优化技巧部分)

前端搜索表单设计

创建一个简洁直观的搜索界面(search.html):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">小说搜索</title>
    <style>
        .search-container {
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
            border-radius: 8px;
        }
        .search-form {
            display: flex;
            gap: 10px;
        }
        .search-input {
            flex: 1;
            padding: 12px;
            border: 1px solid #ddd;
            border-radius: 4px;
            font-size: 16px;
        }
        .search-button {
            padding: 12px 24px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
            transition: background-color 0.3s;
        }
        .search-button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <div class="search-container">
        <h1>小说搜索</h1>
        <form action="search.php" method="get" class="search-form">
            <input 
                type="text" 
                name="keyword" 
                class="search-input"
                placeholder="输入书名/作者/简介关键词..." 
                required
                autocomplete="off"
            >
            <button type="submit" class="search-button">搜索</button>
        </form>
    </div>
</body>
</html>

设计要点

  • 使用method="get"便于用户通过URL分享搜索结果
  • 添加基本的CSS样式提升用户体验
  • 设置autocomplete="off"避免浏览器自动填充干扰搜索
  • 搜索框占位符提示用户可搜索的内容范围

后端PHP处理逻辑

后端代码需要完成接收关键词、安全过滤、构建查询、返回结果等任务,以下是完整的search.php实现:

<?php
// 配置数据库连接
$dbConfig = [
    'host' => 'localhost',
    'username' => 'root',
    'password' => 'password',
    'database' => 'novel_db',
    'charset' => 'utf8mb4'
];
// 创建数据库连接
try {
    $conn = new PDO(
        "mysql:host={$dbConfig['host']};dbname={$dbConfig['database']};charset={$dbConfig['charset']}",
        $dbConfig['username'],
        $dbConfig['password']
    );
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}
// 获取并过滤搜索关键词
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
if (empty($keyword)) {
    header('Location: search.html');
    exit;
}
// 防止XSS攻击
$keyword = htmlspecialchars($keyword, ENT_QUOTES, 'UTF-8');
// 分页参数处理
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
$perPage = 10; // 每页显示10条结果
$offset = ($page - 1) * $perPage;
// 构建查询条件
$searchConditions = [];
$params = [];
// 书名搜索(精确匹配或模糊匹配)
if (!empty($keyword)) {
    $searchConditions[] = "(title LIKE :title OR author LIKE :author OR description LIKE :desc)";
    $params[':title'] = "%{$keyword}%";
    $params[':author'] = "%{$keyword}%";
    $params[':desc'] = "%{$keyword}%";
}
// 构建基础查询
$sql = "SELECT id, title, author, description, category_id FROM novels";
if (!empty($searchConditions)) {
    $sql .= " WHERE " . implode(" AND ", $searchConditions);
}
// 添加排序条件(按相关度和更新时间排序)
$sql .= " ORDER BY 
    CASE 
        WHEN title LIKE :title THEN 1
        WHEN author LIKE :author THEN 2
        ELSE 3
    END ASC,
    updated_at DESC";
// 获取总记录数(用于分页)
$countSql = "SELECT COUNT(*) FROM novels";
if (!empty($searchConditions)) {
    $countSql .= " WHERE " . implode(" AND ", $searchConditions);
}
try {
    // 执行查询
    $stmt = $conn->prepare($sql);
    foreach ($params as $key => $value) {
        $stmt->bindValue($key, $

标签: #PHP小说码 #小说搜索码