php搜索功能的实现
PHP 搜索功能的实现
基础搜索实现
使用 SQL 的 LIKE 语句实现基础搜索功能,适用于小型网站或简单需求。核心代码示例:
$searchTerm = $_GET['search'];
$query = "SELECT * FROM products WHERE name LIKE '%$searchTerm%'";
$result = mysqli_query($connection, $query);
全文索引搜索
对于更高效的搜索,可在 MySQL 中使用全文索引:
ALTER TABLE products ADD FULLTEXT(name, description);
$query = "SELECT * FROM products
WHERE MATCH(name, description) AGAINST('$searchTerm')";
分页处理
实现搜索结果分页功能:
$perPage = 10;
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$offset = ($page - 1) * $perPage;
$query = "SELECT * FROM products
WHERE name LIKE '%$searchTerm%'
LIMIT $offset, $perPage";
安全防护
防止 SQL 注入攻击:
$searchTerm = mysqli_real_escape_string($connection, $_GET['search']);
// 或使用预处理语句
$stmt = $connection->prepare("SELECT * FROM products WHERE name LIKE ?");
$searchParam = "%$searchTerm%";
$stmt->bind_param("s", $searchParam);
$stmt->execute();
高级搜索功能
实现多条件组合搜索:
$filters = [];
if(!empty($_GET['category'])) {
$filters[] = "category_id = ".(int)$_GET['category'];
}
if(!empty($_GET['price_min'])) {
$filters[] = "price >= ".(float)$_GET['price_min'];
}
$where = !empty($filters) ? 'WHERE '.implode(' AND ', $filters) : '';
$query = "SELECT * FROM products $where";
搜索结果高亮
在显示结果时高亮搜索关键词:
function highlight($text, $word) {
return preg_replace("/($word)/i", '<span class="highlight">$1</span>', $text);
}
echo highlight($row['name'], $searchTerm);
使用搜索引擎扩展
对于大型网站,可集成 Elasticsearch 或 Algolia 等专业搜索服务:
// Elasticsearch 示例
$client = Elasticsearch\ClientBuilder::create()->build();
$params = [
'index' => 'products',
'body' => [
'query' => [
'match' => [
'name' => $searchTerm
]
]
]
];
$response = $client->search($params);
搜索建议功能
实现自动完成搜索建议:
$query = "SELECT name FROM products
WHERE name LIKE '$searchTerm%'
LIMIT 5";
$result = mysqli_query($connection, $query);
$suggestions = [];
while($row = mysqli_fetch_assoc($result)) {
$suggestions[] = $row['name'];
}
echo json_encode($suggestions);
搜索日志记录
记录用户搜索行为用于分析:
if(!empty($searchTerm)) {
$ip = $_SERVER['REMOTE_ADDR'];
$logQuery = "INSERT INTO search_logs (term, ip, created_at)
VALUES ('$searchTerm', '$ip', NOW())";
mysqli_query($connection, $logQuery);
}






