网站php实现检索
PHP实现网站检索功能
数据库准备
创建包含搜索内容的数据库表,例如文章表:
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
基础搜索实现
使用MySQL的LIKE语句实现基础搜索:
$searchTerm = $_GET['q'] ?? '';
$results = [];
if (!empty($searchTerm)) {
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM articles
WHERE title LIKE :term OR content LIKE :term");
$stmt->execute([':term' => "%$searchTerm%"]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
全文索引优化
对于大量数据,使用MySQL全文索引提高效率:

ALTER TABLE articles ADD FULLTEXT(title, content);
$stmt = $pdo->prepare("SELECT * FROM articles
WHERE MATCH(title, content) AGAINST(:term IN NATURAL LANGUAGE MODE)");
$stmt->execute([':term' => $searchTerm]);
分页处理
添加分页功能避免结果过多:
$perPage = 10;
$page = $_GET['page'] ?? 1;
$offset = ($page - 1) * $perPage;
$stmt = $pdo->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM articles
WHERE MATCH(title, content) AGAINST(:term)
LIMIT $offset, $perPage");
$stmt->execute([':term' => $searchTerm]);
$totalResults = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();
$totalPages = ceil($totalResults / $perPage);
结果高亮显示
在搜索结果中高亮显示匹配关键词:

function highlight($text, $words) {
$words = preg_replace('/\s+/', '|', preg_quote($words));
return preg_replace("/($words)/i", '<span class="highlight">$1</span>', $text);
}
高级搜索选项
添加搜索过滤条件:
$category = $_GET['category'] ?? '';
$dateFrom = $_GET['date_from'] ?? '';
$dateTo = $_GET['date_to'] ?? '';
$query = "SELECT * FROM articles WHERE MATCH(title, content) AGAINST(:term)";
$params = [':term' => $searchTerm];
if (!empty($category)) {
$query .= " AND category_id = :category";
$params[':category'] = $category;
}
if (!empty($dateFrom) && !empty($dateTo)) {
$query .= " AND created_at BETWEEN :date_from AND :date_to";
$params[':date_from'] = $dateFrom;
$params[':date_to'] = $dateTo;
}
使用搜索引擎扩展
对于大型网站,考虑使用Elasticsearch或Algolia等专业搜索服务:
// Elasticsearch示例
$client = Elastic\Elasticsearch\ClientBuilder::create()
->setHosts(['localhost:9200'])
->build();
$params = [
'index' => 'articles',
'body' => [
'query' => [
'multi_match' => [
'query' => $searchTerm,
'fields' => ['title^3', 'content']
]
]
]
];
$response = $client->search($params);
$results = $response['hits']['hits'];
安全注意事项
防止SQL注入和其他安全风险:
$searchTerm = trim(strip_tags($_GET['q'] ?? ''));
$searchTerm = substr($searchTerm, 0, 100); // 限制输入长度
性能优化建议
- 为搜索字段创建适当索引
- 考虑实现搜索缓存
- 对搜索结果使用延迟加载
- 实现自动完成/搜索建议功能






