如何通过PHP和HTML点击链接向MySQL插入用户房产浏览记录
实现点击房源链接时插入用户选择记录的方案
针对你的需求,这里提供两种简单易实现的方法,同时兼顾安全性和用户体验:
方案一:在详情页直接处理插入逻辑(最简单)
这种方法无需额外页面,用户点击链接跳转到房源详情页时,先执行插入操作,再展示房源信息。
- 修改房源链接,传递房源ID参数
把原表格中的房源ID链接修改为带参数的形式:
<td><a href="about_house.php?house_id=<?= $row['Id_house']; ?>"><?= $row['Id_house']; ?></a></td>
- 在
about_house.php开头添加插入逻辑
确保页面开头先初始化数据库连接和Session,然后执行插入:
<?php include "db.php"; session_start(); // 验证用户登录状态和房源ID参数 if (isset($_SESSION['Id_user']) && isset($_GET['house_id'])) { $user_id = $_SESSION['Id_user']; $house_id = $_GET['house_id']; // 用预处理语句防止SQL注入 $stmt = $mysqli->prepare("INSERT INTO user_choice (user_id, house_id) VALUES (?, ?)"); // 假设user_id和house_id都是整数类型,用"ii"绑定;如果是字符串则用"ss" $stmt->bind_param("ii", $user_id, $house_id); $stmt->execute(); $stmt->close(); } // 后续的房源详情展示逻辑... ?>
如果要避免同一用户重复插入同一房源的记录,可以先检查是否已存在:
// 先查询是否已有该记录 $check_stmt = $mysqli->prepare("SELECT id FROM user_choice WHERE user_id = ? AND house_id = ?"); $check_stmt->bind_param("ii", $user_id, $house_id); $check_stmt->execute(); $check_stmt->store_result(); // 只有不存在时才插入 if ($check_stmt->num_rows === 0) { $insert_stmt = $mysqli->prepare("INSERT INTO user_choice (user_id, house_id) VALUES (?, ?)"); $insert_stmt->bind_param("ii", $user_id, $house_id); $insert_stmt->execute(); $insert_stmt->close(); } $check_stmt->close();
方案二:AJAX异步插入(无跳转等待,体验更好)
这种方法通过JavaScript发送异步请求插入记录,完成后再跳转到详情页,页面不会出现加载等待。
- 修改房源链接,添加自定义属性
<td><a href="about_house.php?house_id=<?= $row['Id_house']; ?>" class="house-link" data-house-id="<?= $row['Id_house']; ?>"><?= $row['Id_house']; ?></a></td>
- 添加JavaScript处理点击事件
利用页面已引入的jQuery,在页面底部添加:
$(document).ready(function() { $('.house-link').click(function(e) { e.preventDefault(); // 阻止默认跳转 const houseId = $(this).data('house-id'); const userId = <?php echo $_SESSION['Id_user']; ?>; const targetUrl = $(this).attr('href'); // 发送异步请求插入记录 $.post('insert_choice.php', { user_id: userId, house_id: houseId }, function() { // 请求完成后跳转到详情页 window.location.href = targetUrl; }); }); });
- 创建
insert_choice.php处理插入请求
<?php include "db.php"; session_start(); if (isset($_POST['user_id']) && isset($_POST['house_id'])) { $user_id = $_POST['user_id']; $house_id = $_POST['house_id']; // 预处理语句防注入,可选添加重复检查 $stmt = $mysqli->prepare("INSERT INTO user_choice (user_id, house_id) VALUES (?, ?)"); $stmt->bind_param("ii", $user_id, $house_id); $stmt->execute(); $stmt->close(); } ?>
关键注意事项
- SQL注入防护:必须使用预处理语句,绝对不能直接把用户输入的参数拼接到SQL语句中。
- 重复记录控制:可以给
user_choice表添加user_id和house_id的联合唯一索引,或者通过前置查询避免重复插入。 - 登录状态验证:所有插入操作都要检查用户是否已登录,防止未登录用户的无效请求。
内容的提问来源于stack exchange,提问作者Oleksandr Mazur
相关产品推荐
相关产品推荐

