悠悠楠杉
PHP如何实现站内搜索功能
sql
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
keywords TEXT,
description TEXT,
content LONGTEXT,
created_at DATETIME
);
当用户在前端输入搜索词后,比如“PHP教程”,我们需要将这个关键词拆解并分别在上述字段中查找包含该词的内容。最直接的方式是使用 SQL 的 LIKE 操作符配合通配符 % 实现模糊匹配。但需要注意的是,单纯使用 LIKE '%关键词%' 在大数据量下性能较差,因此我们应尽量避免全表扫描,并为常用搜索字段建立索引。
在PHP代码中,我们可以先接收用户提交的搜索关键词。假设前端通过GET方式提交参数 q,那么后端可以这样处理:
php
<?php
$keyword = trim($_GET['q'] ?? '');
if (empty($keyword)) {
die('请输入搜索关键词');
}
// 连接数据库(建议使用PDO或mysqli)
$pdo = new PDO("mysql:host=localhost;dbname=yourdb", $username, $password);
$pdo->setAttribute(PDO::ATTRERRMODE, PDO::ERRMODE_EXCEPTION);
// 构建SQL查询,对多个字段进行模糊匹配
$sql = "SELECT id, title, description, content
FROM articles
WHERE title LIKE ?
OR keywords LIKE ?
OR description LIKE ?
OR content LIKE ?
ORDER BY created_at DESC
LIMIT 50";
$stmt = $pdo->prepare($sql);
$searchTerm = '%' . $keyword . '%';
$stmt->execute([$searchTerm, $searchTerm, $searchTerm, $searchTerm]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
执行完查询后,$results 中就包含了所有匹配的结果。接下来可以在前端循环输出这些数据,展示给用户。为了提升用户体验,还可以对搜索词进行高亮显示。例如,定义一个简单的高亮函数:
php
function highlightKeyword($text, $keyword) {
return str_ireplace($keyword, "<mark>{$keyword}</mark>", $text);
}
然后在HTML中输出时调用:
html
<?php foreach ($results as $row): ?>
<article>
<h3><?= htmlspecialchars(highlightKeyword($row['title'], $keyword)) ?></h3>
<p><?= htmlspecialchars(highlightKeyword($row['description'], $keyword)) ?></p>
<div><?= nl2br(substr(highlightKeyword(strip_tags($row['content']), $keyword), 0, 300)) ?>...</div>
</article>
<?php endforeach; ?>
这里使用了 htmlspecialchars 防止XSS攻击,strip_tags 去除正文中的HTML标签避免干扰,substr 截取部分内容作为摘要。
虽然这种基于 LIKE 的搜索实现简单,但在内容较多时效率会明显下降。如果未来网站数据量增大,可以考虑引入全文索引。MySQL的MyISAM或InnoDB引擎都支持 FULLTEXT 索引。只需在建表时添加:
sql
ALTER TABLE articles ADD FULLTEXT(title, keywords, description, content);
然后将查询语句改为:
sql
SELECT *, MATCH(title, keywords, description, content) AGAINST(? IN NATURAL LANGUAGE MODE) AS score
FROM articles
WHERE MATCH(title, keywords, description, content) AGAINST(? IN NATURAL LANGUAGE MODE)
ORDER BY score DESC;
这种方式不仅速度更快,还能根据相关性得分排序,使结果更精准。
此外,还可以加入一些优化细节:比如对搜索词进行分词处理(可借助中文分词库如SCWS),过滤停用词,记录热门搜索词以便做推荐等。
