使用PHP将最近3条浏览车辆记录存储到数据库的实现方法
PHP实现用户车辆浏览记录仅保留最新3条方案
前置说明
原表默认缺少用户唯一标识字段(如user_id),无法区分不同用户的浏览记录,建议先新增该字段,以下方案默认按多用户场景实现,单用户场景直接去掉user_id相关判断即可。本方案完全采用if-else分支逻辑实现,不会产生冗余写入,无需新增后删除旧数据。
核心实现步骤
1. 基础参数准备
// 实际业务中替换为当前登录用户的唯一ID $userId = 10086; // 接收当前用户浏览的车辆ID,按实际业务传参方式调整 $vehicleId = $_REQUEST['vehicle_id']; // 生成符合格式的当前时间,与示例时间格式对齐 $currentTimestamp = date('y-m-d H:i');
2. 预查询用户现有浏览记录数据
采用PDO做数据库操作示例,MySQLi逻辑一致可自行调整语法:
// 第一步:判断当前用户是否已经浏览过该车辆,避免重复存储 $existCheckStmt = $pdo->prepare("SELECT id FROM 你的表名 WHERE user_id = ? AND VehicleId = ? LIMIT 1"); $existCheckStmt->execute([$userId, $vehicleId]); if ($existCheckStmt->rowCount() > 0) { // 已存在该车辆的浏览记录,直接更新时间为最新即可,无需修改其他记录 $updateTimeStmt = $pdo->prepare("UPDATE 你的表名 SET timestamp = ? WHERE user_id = ? AND VehicleId = ?"); $updateTimeStmt->execute([$currentTimestamp, $userId, $vehicleId]); return; // 直接结束后续逻辑 } // 第二步:查询当前用户总浏览记录数,以及最早的那条记录ID $countStmt = $pdo->prepare("SELECT COUNT(*) as total FROM 你的表名 WHERE user_id = ?"); $countStmt->execute([$userId]); $recordTotal = $countStmt->fetch(PDO::FETCH_ASSOC)['total']; $oldestStmt = $pdo->prepare("SELECT id FROM 你的表名 WHERE user_id = ? ORDER BY timestamp ASC LIMIT 1"); $oldestStmt->execute([$userId]); $oldestRecordId = $oldestStmt->fetch(PDO::FETCH_ASSOC)['id'];
3. if-else分支执行写入/覆盖操作
if ($recordTotal < 3) { // 分支1:当前记录数不足3条,直接插入新记录 $insertStmt = $pdo->prepare("INSERT INTO 你的表名 (user_id, timestamp, VehicleId) VALUES (?, ?, ?)"); $insertStmt->execute([$userId, $currentTimestamp, $vehicleId]); } else { // 分支2:当前记录数已满3条,覆盖最早的那条记录 $coverStmt = $pdo->prepare("UPDATE 你的表名 SET timestamp = ?, VehicleId = ? WHERE id = ?"); $coverStmt->execute([$currentTimestamp, $vehicleId, $oldestRecordId]); }
注意事项
- 示例中给出的时间如
23-09-21 24:32属于非法时间,实际用PHP内置时间函数生成不会出现该问题 - 可在
user_id、VehicleId字段上加联合索引,提升查询性能 - 若业务允许重复存储同车辆的浏览记录,可删除重复浏览判断的逻辑,直接走后面的数量判断分支即可
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

