php实现搜索功能
PHP实现搜索功能的方法
数据库搜索实现
使用SQL的LIKE语句实现基础搜索功能。假设有一个包含文章标题和内容的表articles,可以通过以下代码实现搜索:
$searchTerm = $_GET['q'] ?? '';
if (!empty($searchTerm)) {
$db = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $db->prepare("SELECT * FROM articles WHERE title LIKE :search OR content LIKE :search");
$stmt->execute([':search' => "%$searchTerm%"]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
全文索引优化
对于大型数据库,建议使用全文索引提高搜索效率。MySQL的FULLTEXT索引可以显著提升搜索性能:
ALTER TABLE articles ADD FULLTEXT(title, content);
然后使用MATCH AGAINST语法进行搜索:

$stmt = $db->prepare("SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:search IN NATURAL LANGUAGE MODE)");
前端搜索表单
创建一个简单的HTML搜索表单:
<form action="search.php" method="get">
<input type="text" name="q" placeholder="输入搜索内容">
<button type="submit">搜索</button>
</form>
搜索结果分页
实现搜索结果分页功能:

$page = $_GET['page'] ?? 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$stmt = $db->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM articles WHERE MATCH(title, content) AGAINST(:search) LIMIT :offset, :perPage");
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute([':search' => $searchTerm]);
$totalResults = $db->query("SELECT FOUND_ROWS()")->fetchColumn();
$totalPages = ceil($totalResults / $perPage);
高级搜索功能
实现多条件组合搜索:
$filters = [
'category' => $_GET['category'] ?? null,
'date_from' => $_GET['date_from'] ?? null,
'date_to' => $_GET['date_to'] ?? null
];
$where = [];
$params = [':search' => "%$searchTerm%"];
if ($filters['category']) {
$where[] = "category_id = :category";
$params[':category'] = $filters['category'];
}
if ($filters['date_from'] && $filters['date_to']) {
$where[] = "publish_date BETWEEN :date_from AND :date_to";
$params[':date_from'] = $filters['date_from'];
$params[':date_to'] = $filters['date_to'];
}
$sql = "SELECT * FROM articles WHERE (title LIKE :search OR content LIKE :search)";
if (!empty($where)) {
$sql .= " AND " . implode(" AND ", $where);
}
使用搜索引擎扩展
对于更复杂的搜索需求,可以考虑集成Elasticsearch或Algolia等专业搜索引擎。以下是使用Elasticsearch的简单示例:
require 'vendor/autoload.php';
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'articles',
'body' => [
'query' => [
'multi_match' => [
'query' => $searchTerm,
'fields' => ['title^3', 'content']
]
]
]
];
$response = $client->search($params);
$results = $response['hits']['hits'];
搜索结果高亮显示
在显示搜索结果时,可以高亮匹配的关键词:
function highlightKeywords($text, $keywords) {
return preg_replace("/(" . preg_quote($keywords, '/') . ")/i", "<span class='highlight'>$1</span>", $text);
}
foreach ($results as $result) {
echo highlightKeywords($result['title'], $searchTerm);
echo highlightKeywords(substr($result['content'], 0, 200), $searchTerm);
}
这些方法涵盖了从基础到高级的PHP搜索功能实现,可以根据项目需求选择合适的方案。对于小型网站,简单的数据库搜索可能足够;对于大型内容网站,建议考虑专业的搜索引擎解决方案。






