php搜索功能的实现
数据库查询实现搜索
在PHP中实现搜索功能,最基本的方式是通过SQL的LIKE语句查询数据库。创建一个搜索表单,用户输入关键词后,使用预处理语句防止SQL注入。
$searchTerm = $_GET['search'] ?? '';
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE :search");
$stmt->execute([':search' => "%$searchTerm%"]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
全文索引优化
对于大量数据,LIKE查询效率低下。在MySQL中创建FULLTEXT索引能显著提升搜索性能:
ALTER TABLE products ADD FULLTEXT(name, description);
使用MATCH...AGAINST语法进行全文搜索:
$stmt = $pdo->prepare("SELECT * FROM products
WHERE MATCH(name, description) AGAINST(:search IN NATURAL LANGUAGE MODE)");
使用Elasticsearch
对于复杂搜索需求,集成Elasticsearch提供更强大的功能。安装官方PHP客户端后:
$client = Elastic\Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'products',
'body' => [
'query' => [
'multi_match' => [
'query' => $searchTerm,
'fields' => ['name^3', 'description']
]
]
]
];
$response = $client->search($params);
前端自动补全
结合jQuery UI的autocomplete实现搜索建议:
$("#search").autocomplete({
source: "search_suggest.php",
minLength: 2
});
对应的PHP处理脚本:
$term = $_GET['term'];
$stmt = $pdo->prepare("SELECT name FROM products WHERE name LIKE :term LIMIT 10");
$stmt->execute([':term' => "%$term%"]);
echo json_encode($stmt->fetchAll(PDO::FETCH_COLUMN));
搜索结果高亮显示
在显示结果时突出显示匹配关键词:
function highlight($text, $words) {
$words = preg_replace('/\s+/', '|', preg_quote($words));
return preg_replace("/($words)/i", '<mark>$1</mark>', $text);
}
分页处理
对于大量搜索结果实现分页:
$perPage = 10;
$page = $_GET['page'] ?? 1;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM products
WHERE name LIKE :search LIMIT $offset, $perPage");
$total = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();






