当前位置:首页 > PHP

php实现搜索分页

2026-02-16 18:31:21PHP

PHP实现搜索分页的方法

在PHP中实现搜索分页功能需要结合数据库查询和分页逻辑处理。以下是具体实现步骤:

获取搜索参数并构建查询

从GET或POST请求中获取搜索关键词和其他参数,构建SQL查询条件。使用预处理语句防止SQL注入。

$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10; // 每页显示数量

// 构建查询条件
$where = '';
if (!empty($keyword)) {
    $where = "WHERE title LIKE :keyword OR content LIKE :keyword";
}

计算总记录数和总页数

执行查询获取匹配搜索条件的总记录数,计算总页数。

// 查询总记录数
$countSql = "SELECT COUNT(*) FROM articles $where";
$stmt = $pdo->prepare($countSql);
if (!empty($keyword)) {
    $stmt->bindValue(':keyword', "%$keyword%");
}
$stmt->execute();
$total = $stmt->fetchColumn();

// 计算总页数
$totalPages = ceil($total / $perPage);

获取当前页数据

构建分页查询,使用LIMIT子句限制返回的记录范围。

$offset = ($page - 1) * $perPage;
$sql = "SELECT * FROM articles $where ORDER BY id DESC LIMIT $offset, $perPage";
$stmt = $pdo->prepare($sql);
if (!empty($keyword)) {
    $stmt->bindValue(':keyword', "%$keyword%");
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

生成分页链接

创建分页导航链接,保持搜索参数在分页时的传递。

$pagination = '';
for ($i = 1; $i <= $totalPages; $i++) {
    $active = ($i == $page) ? 'active' : '';
    $pagination .= "<li class='$active'><a href='search.php?keyword=$keyword&page=$i'>$i</a></li>";
}

前端展示

在HTML中展示搜索结果和分页导航。

<!-- 搜索结果 -->
<?php foreach ($results as $row): ?>
    <div class="result-item">
        <h3><?= htmlspecialchars($row['title']) ?></h3>
        <p><?= htmlspecialchars($row['content']) ?></p>
    </div>
<?php endforeach; ?>

<!-- 分页导航 -->
<ul class="pagination">
    <?= $pagination ?>
</ul>

完整示例代码

将上述各部分组合成完整的搜索分页功能实现。

php实现搜索分页

<?php
// 数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

// 获取参数
$keyword = isset($_GET['keyword']) ? trim($_GET['keyword']) : '';
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$perPage = 10;

// 构建查询条件
$where = '';
if (!empty($keyword)) {
    $where = "WHERE title LIKE :keyword OR content LIKE :keyword";
}

// 获取总记录数
$countSql = "SELECT COUNT(*) FROM articles $where";
$stmt = $pdo->prepare($countSql);
if (!empty($keyword)) {
    $stmt->bindValue(':keyword', "%$keyword%");
}
$stmt->execute();
$total = $stmt->fetchColumn();
$totalPages = ceil($total / $perPage);

// 获取当前页数据
$offset = ($page - 1) * $perPage;
$sql = "SELECT * FROM articles $where ORDER BY id DESC LIMIT $offset, $perPage";
$stmt = $pdo->prepare($sql);
if (!empty($keyword)) {
    $stmt->bindValue(':keyword', "%$keyword%");
}
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

<!-- 搜索表单 -->
<form method="get" action="search.php">
    <input type="text" name="keyword" value="<?= htmlspecialchars($keyword) ?>">
    <button type="submit">搜索</button>
</form>

<!-- 搜索结果 -->
<?php foreach ($results as $row): ?>
    <div class="result-item">
        <h3><?= htmlspecialchars($row['title']) ?></h3>
        <p><?= htmlspecialchars($row['content']) ?></p>
    </div>
<?php endforeach; ?>

<!-- 分页导航 -->
<ul class="pagination">
    <?php for ($i = 1; $i <= $totalPages; $i++): ?>
        <li <?= ($i == $page) ? 'class="active"' : '' ?>>
            <a href="search.php?keyword=<?= urlencode($keyword) ?>&page=<?= $i ?>"><?= $i ?></a>
        </li>
    <?php endfor; ?>
</ul>

注意事项

  • 使用预处理语句防止SQL注入攻击
  • 对输出内容进行HTML转义(htmlspecialchars)
  • 对URL参数进行编码(urlencode)
  • 处理页码超出范围的情况
  • 考虑添加"上一页"和"下一页"按钮
  • 可以添加跳转到指定页码的输入框
  • 对于大数据量考虑使用缓存优化性能

标签: 分页php
分享给朋友:

相关文章

vue  实现分页

vue 实现分页

实现分页功能 在Vue中实现分页功能通常需要结合后端API或前端数据处理。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,所有数据一次性加载到前端后进行分页处理: <…

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

js实现分页功能代码

js实现分页功能代码

分页功能实现方法 客户端分页(前端处理数据) 适用于数据量较小且已全部加载到前端的情况。 // 示例数据 const data = Array.from({length: 100}, (_, i)…