PHP实现搜索记录
实现搜索记录功能
在PHP中实现搜索记录功能可以通过多种方式完成,包括使用数据库存储、Session或Cookie保存临时记录。以下是几种常见方法:
使用数据库存储搜索记录
创建数据库表存储用户的搜索记录,适合需要长期保存的场景:
CREATE TABLE search_history (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
keyword VARCHAR(255),
search_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
PHP代码示例:
// 连接数据库
$pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password');
// 获取搜索关键词
$keyword = $_GET['keyword'] ?? '';
if (!empty($keyword)) {
$stmt = $pdo->prepare("INSERT INTO search_history (user_id, keyword) VALUES (:user_id, :keyword)");
$stmt->bindParam(':user_id', $_SESSION['user_id']);
$stmt->bindParam(':keyword', $keyword);
$stmt->execute();
}
使用Session存储临时搜索记录
适合不需要持久化存储的场景:
session_start();
if (!empty($_GET['keyword'])) {
if (!isset($_SESSION['search_history'])) {
$_SESSION['search_history'] = [];
}
// 限制记录数量
if (count($_SESSION['search_history']) >= 10) {
array_shift($_SESSION['search_history']);
}
$_SESSION['search_history'][] = [
'keyword' => $_GET['keyword'],
'time' => time()
];
}
使用Cookie存储客户端搜索记录
适合简单的客户端存储:
if (!empty($_GET['keyword'])) {
$history = isset($_COOKIE['search_history']) ? json_decode($_COOKIE['search_history'], true) : [];
// 去重
if (!in_array($_GET['keyword'], $history)) {
$history[] = $_GET['keyword'];
// 限制记录数量
if (count($history) > 5) {
array_shift($history);
}
setcookie('search_history', json_encode($history), time() + 86400 * 30, '/');
}
}
显示搜索记录
从数据库获取并显示:
$stmt = $pdo->prepare("SELECT keyword FROM search_history WHERE user_id = :user_id ORDER BY search_time DESC LIMIT 10");
$stmt->bindParam(':user_id', $_SESSION['user_id']);
$stmt->execute();
$history = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($history as $item) {
echo htmlspecialchars($item['keyword']) . "<br>";
}
高级功能实现
实现热门搜索和搜索建议:
// 获取热门搜索
$stmt = $pdo->query("SELECT keyword, COUNT(*) as count FROM search_history GROUP BY keyword ORDER BY count DESC LIMIT 5");
$popular = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 搜索建议
$stmt = $pdo->prepare("SELECT DISTINCT keyword FROM search_history WHERE keyword LIKE :query LIMIT 5");
$stmt->bindValue(':query', $_GET['q'] . '%');
$stmt->execute();
$suggestions = $stmt->fetchAll(PDO::FETCH_COLUMN);
安全注意事项
-
对用户输入进行过滤和转义:
$keyword = filter_input(INPUT_GET, 'keyword', FILTER_SANITIZE_STRING); -
防止SQL注入:
$stmt = $pdo->prepare("INSERT ..."); $stmt->bindParam(':keyword', $keyword); -
限制搜索频率:
if (isset($_SESSION['last_search']) && time() - $_SESSION['last_search'] < 2) { die('搜索太频繁,请稍后再试'); } $_SESSION['last_search'] = time();
通过以上方法可以灵活实现PHP搜索记录功能,根据实际需求选择适合的存储方式。







