如何将signup表的主键作为外键插入feedback表以关联用户反馈
实现反馈提交时关联当前用户的signup_id
核心思路
要把当前用户的signup_id作为外键插入feedback表,关键是在用户注册成功后把signup_id存入会话(Session),提交反馈时从会话中取出这个ID,再和反馈数据一起插入数据库。
具体步骤
1. 注册成功后存储用户的signup_id到Session
注册完成插入用户数据到signup表后,先获取刚插入的signup_id,然后存入Session:
// 注册插入成功后(假设用mysqli操作数据库) $signup_id = mysqli_insert_id($conn); // 获取刚插入的主键ID session_start(); $_SESSION['signup_id'] = $signup_id; // 把用户ID存入会话 // 跳转至feedback页面 header("Location: feedback.php"); exit;
注意:
session_start()必须放在所有HTML输出之前,否则会触发报错。
2. 反馈页面验证用户会话
在feedback.php的顶部,先启动会话并检查用户是否已登录(即Session中是否存在signup_id):
session_start(); if (!isset($_SESSION['signup_id'])) { // 未登录用户直接跳转到注册页 header("Location: signup.php"); exit; }
3. 处理反馈提交的PHP代码
在接收反馈表单提交的处理脚本中(比如submit_feedback.php),从Session取出signup_id,和表单数据一起插入feedback表:
session_start(); if (!isset($_SESSION['signup_id'])) { die("请先完成注册"); } // 获取并过滤表单数据,避免SQL注入 $category = mysqli_real_escape_string($conn, $_POST['category']); $feedback_text = mysqli_real_escape_string($conn, $_POST['feedback_text']); $rating = (int)$_POST['rating']; $signup_id = $_SESSION['signup_id']; // 构造插入SQL $sql = "INSERT INTO feedback (signup_id, category, `feedback text`, rating) VALUES ('$signup_id', '$category', '$feedback_text', '$rating')"; // 执行插入操作 if (mysqli_query($conn, $sql)) { echo "反馈提交成功"; } else { echo "提交失败: " . mysqli_error($conn); }
更安全的做法是使用预处理语句彻底防范SQL注入,示例如下:
// 预处理语句写法 $stmt = $conn->prepare("INSERT INTO feedback (signup_id, category, `feedback text`, rating) VALUES (?, ?, ?, ?)"); // 绑定参数,类型对应:i=整数, s=字符串 $stmt->bind_param("issi", $signup_id, $category, $feedback_text, $rating); $stmt->execute(); if ($stmt->affected_rows > 0) { echo "反馈提交成功"; } else { echo "提交失败: " . $stmt->error; } $stmt->close();
4. 确认数据库外键约束正确
确保feedback表的signup_id外键已正确关联signup表的signup_id,创建表的SQL示例:
CREATE TABLE feedback ( feedback_id INT AUTO_INCREMENT PRIMARY KEY, signup_id INT NOT NULL, category VARCHAR(50) NOT NULL, `feedback text` TEXT NOT NULL, rating INT NOT NULL, FOREIGN KEY (signup_id) REFERENCES signup(signup_id) ON DELETE CASCADE );
ON DELETE CASCADE表示如果用户被删除,其对应的反馈也会被自动删除,可根据业务需求调整这个规则。
内容的提问来源于stack exchange,提问作者RhinoCoder
相关产品推荐
相关产品推荐

