You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无登录旅游网站PHP实现:能否用Session/Cookie存储用户搜索记录做推荐?

无登录场景下用PHP Session/Cookie实现搜索历史推荐

完全可以通过PHP的Session或Cookie实现无登录用户的搜索记录存储,进而生成个性化推荐。以下是具体实现方案:

一、使用Session存储搜索历史(服务器端存储)

Session存储在服务器端,相对安全,适合临时保存用户当前会话内的搜索记录(默认浏览器关闭后失效)。

1. 存储搜索分类到Session

当用户提交搜索请求后,将搜索分类存入Session数组并做去重处理:

session_start(); // 必须在输出任何内容前调用

// 假设从搜索表单获取分类(示例:$_POST['category'])
$currentCategory = trim($_POST['category']);

// 初始化搜索历史数组
if (!isset($_SESSION['search_categories'])) {
    $_SESSION['search_categories'] = [];
}

// 避免重复添加同一分类
if (!in_array($currentCategory, $_SESSION['search_categories'])) {
    $_SESSION['search_categories'][] = $currentCategory;
}

2. 基于Session生成推荐内容

从Session读取分类,查询数据库获取相关推荐(注意防SQL注入):

session_start();
$recommendedItems = [];

if (isset($_SESSION['search_categories']) && !empty($_SESSION['search_categories'])) {
    // 用PDO连接数据库(需提前配置)
    $pdo = new PDO('mysql:host=localhost;dbname=your_travel_db;charset=utf8', 'username', 'password');
    
    // 转义分类名称,防止SQL注入
    $escapedCategories = array_map(function($cat) use ($pdo) {
        return $pdo->quote($cat);
    }, $_SESSION['search_categories']);
    
    $categoryList = implode(',', $escapedCategories);
    // 查询对应分类的景点/酒店
    $stmt = $pdo->query("SELECT id, name, category, description FROM travel_items WHERE category IN ($categoryList) LIMIT 8");
    $recommendedItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
}

// 将$recommendedItems渲染到页面推荐区域即可

二、使用Cookie存储搜索历史(客户端存储)

Cookie存储在用户浏览器中,可设置较长有效期(比如7天),适合长期保存用户的搜索偏好,但需注意大小限制(单Cookie不超过4KB)。

1. 存储搜索分类到Cookie

$currentCategory = trim($_POST['category']);
$searchHistory = [];

// 读取现有Cookie中的搜索历史(用JSON格式存储数组)
if (isset($_COOKIE['search_history'])) {
    $searchHistory = json_decode($_COOKIE['search_history'], true) ?? [];
}

// 去重添加新分类
if (!in_array($currentCategory, $searchHistory)) {
    $searchHistory[] = $currentCategory;
}

// 设置Cookie,有效期7天,路径覆盖全站
setcookie(
    'search_history',
    json_encode($searchHistory),
    time() + 7 * 24 * 3600, // 7天后过期
    '/', // 网站根目录
    '',
    false,
    true // 仅通过HTTPS传输(如果网站用HTTPS的话)
);

2. 基于Cookie生成推荐内容

$recommendedItems = [];

if (isset($_COOKIE['search_history'])) {
    $searchHistory = json_decode($_COOKIE['search_history'], true) ?? [];
    
    if (!empty($searchHistory)) {
        $pdo = new PDO('mysql:host=localhost;dbname=your_travel_db;charset=utf8', 'username', 'password');
        $escapedCategories = array_map(function($cat) use ($pdo) {
            return $pdo->quote($cat);
        }, $searchHistory);
        
        $categoryList = implode(',', $escapedCategories);
        $stmt = $pdo->query("SELECT id, name, category, description FROM travel_items WHERE category IN ($categoryList) LIMIT 8");
        $recommendedItems = $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

关键注意事项

  • SQL注入防护:必须使用PDO的预处理语句或quote()方法转义用户输入,绝对不能直接将用户输入拼接到SQL语句中。
  • Session有效期调整:若需要延长Session有效期,可修改php.ini中的session.gc_maxlifetime参数,或手动设置Session的过期时间。
  • Cookie大小限制:单Cookie最大4KB,建议控制存储的分类数量在10个以内,避免数据截断。
  • 隐私合规:若存储用户搜索记录,需在网站隐私政策中明确说明,符合相关合规要求。
  • 去重处理:无论用Session还是Cookie,都要对搜索分类做去重,避免重复存储和重复推荐。

内容的提问来源于stack exchange,提问作者Jericho Granados

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:10:35