php实现搜索实例
PHP实现搜索功能的方法
数据库搜索实现
使用SQL的LIKE语句实现基础搜索功能。假设有一个名为products的表,包含name和description字段。
$searchTerm = $_GET['search'] ?? '';
$searchTerm = '%' . $searchTerm . '%';
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE :search OR description LIKE :search");
$stmt->bindParam(':search', $searchTerm);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
全文索引搜索
对于更高效的搜索,可以在MySQL表上创建全文索引:
ALTER TABLE products ADD FULLTEXT(name, description);
PHP中使用MATCH AGAINST语法:

$searchTerm = $_GET['search'] ?? '';
$stmt = $pdo->prepare("SELECT * FROM products WHERE MATCH(name, description) AGAINST(:search IN NATURAL LANGUAGE MODE)");
$stmt->bindParam(':search', $searchTerm);
$stmt->execute();
分页实现
搜索结果通常需要分页显示:
$page = $_GET['page'] ?? 1;
$perPage = 10;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM products WHERE name LIKE :search LIMIT :offset, :perPage");
$stmt->bindValue(':search', '%'.$searchTerm.'%');
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->bindValue(':perPage', $perPage, PDO::PARAM_INT);
$stmt->execute();
$totalResults = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();
$totalPages = ceil($totalResults / $perPage);
高级搜索功能
实现多条件筛选搜索:

$filters = [
'category' => $_GET['category'] ?? null,
'price_min' => $_GET['price_min'] ?? null,
'price_max' => $_GET['price_max'] ?? null
];
$where = [];
$params = [];
if (!empty($searchTerm)) {
$where[] = "name LIKE :search";
$params[':search'] = '%'.$searchTerm.'%';
}
if (!empty($filters['category'])) {
$where[] = "category_id = :category";
$params[':category'] = $filters['category'];
}
// 构建查询
$sql = "SELECT * FROM products";
if (!empty($where)) {
$sql .= " WHERE " . implode(' AND ', $where);
}
使用搜索引擎
对于大型应用,可以考虑集成Elasticsearch或Algolia等专业搜索引擎:
// Elasticsearch示例
$client = Elastic\Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'products',
'body' => [
'query' => [
'multi_match' => [
'query' => $searchTerm,
'fields' => ['name^3', 'description']
]
]
]
];
$response = $client->search($params);
$results = $response['hits']['hits'];
前端搜索建议
实现搜索框自动补全功能:
// 使用jQuery实现
$('#search-input').on('input', function() {
$.get('/search/suggest', {query: $(this).val()}, function(data) {
// 显示建议结果
});
});
后端PHP处理建议请求:
$query = $_GET['query'] ?? '';
$stmt = $pdo->prepare("SELECT name FROM products WHERE name LIKE :query LIMIT 5");
$stmt->bindValue(':query', '%'.$query.'%');
$stmt->execute();
$suggestions = $stmt->fetchAll(PDO::FETCH_COLUMN);
header('Content-Type: application/json');
echo json_encode($suggestions);






