php搜索功能实现
PHP 搜索功能实现
数据库准备
确保数据库中有需要搜索的表和数据。例如,一个包含 title 和 content 字段的文章表。
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT
);
基本搜索实现
使用 SQL 的 LIKE 语句实现简单搜索。通过 $_GET 或 $_POST 获取用户输入的关键词。
$searchTerm = $_GET['search'] ?? '';
if (!empty($searchTerm)) {
$stmt = $pdo->prepare("SELECT * FROM articles WHERE title LIKE :search OR content LIKE :search");
$stmt->execute(['search' => "%$searchTerm%"]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
表单设计
创建一个简单的 HTML 表单,用于用户输入搜索关键词。
<form action="search.php" method="get">
<input type="text" name="search" placeholder="输入关键词">
<button type="submit">搜索</button>
</form>
结果显示
遍历搜索结果并显示在页面上。
if (!empty($results)) {
foreach ($results as $article) {
echo "<h3>{$article['title']}</h3>";
echo "<p>{$article['content']}</p>";
}
} else {
echo "没有找到相关结果。";
}
改进搜索功能
使用全文索引提高搜索效率。在 MySQL 中创建全文索引。

ALTER TABLE articles ADD FULLTEXT(title, content);
使用 MATCH AGAINST 进行全文搜索。
$stmt = $pdo->prepare("SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:search IN NATURAL LANGUAGE MODE)");
$stmt->execute(['search' => $searchTerm]);
分页处理
对于大量搜索结果,实现分页功能。
$perPage = 10;
$page = $_GET['page'] ?? 1;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:search) LIMIT :offset, :perPage");
$stmt->bindParam(':search', $searchTerm);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$stmt->bindParam(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();
高亮显示关键词
在搜索结果中高亮显示匹配的关键词。

function highlightKeyword($text, $keyword) {
return preg_replace("/($keyword)/i", "<span style='background-color: yellow;'>$1</span>", $text);
}
echo highlightKeyword($article['title'], $searchTerm);
使用第三方搜索引擎
对于更复杂的搜索需求,可以考虑集成 Elasticsearch 或 Algolia。
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'articles',
'body' => [
'query' => [
'match' => [
'title' => $searchTerm
]
]
]
];
$results = $client->search($params);
安全性考虑
防止 SQL 注入,始终使用预处理语句。对用户输入进行过滤和转义。
$searchTerm = htmlspecialchars(trim($_GET['search']));
性能优化
为搜索字段添加索引,避免全表扫描。缓存热门搜索结果,减少数据库压力。
CREATE INDEX idx_title ON articles(title);






