PHP获取已登录用户ID并插入至另一数据表的实现方法
如何在PHP中获取已登录用户ID并插入到另一张数据表?
看你提供的代码片段,存在几个需要修正的细节,比如Session启动位置不对、SQL注入风险,还有代码完整性问题。下面一步步帮你解决:
1. 先把Session初始化做对
session_start() 必须放在所有输出(包括HTML、echo、include文件的输出)之前,否则会触发Session报错。你原来把它放在if(isset($_POST['apply']))里面,会导致未提交表单时Session没启动,根本拿不到$_SESSION['user_index']。正确的写法是把它放在文件最顶部:
<?php session_start(); // 放在最开头,确保整个页面都能访问Session include 'check_login.php'; // 假设这个文件已经完成了登录验证,并且把用户ID存入了Session
2. 安全获取登录用户ID
只要check_login.php在用户登录成功时,已经把用户ID存入$_SESSION['user_index'](比如$_SESSION['user_index'] = $user_id;),你就可以直接从Session里取,但最好加个校验,防止未登录的用户访问:
// 校验用户是否已登录 if(!isset($_SESSION['user_index'])){ header("Location: login.php"); // 未登录就跳转到登录页 exit; } $uid = $_SESSION['user_index'];
3. 用预处理语句插入数据(杜绝SQL注入)
你原来直接把变量拼进SQL语句的做法,存在严重的SQL注入风险。一定要用mysqli或PDO的预处理语句,这里用和你代码适配的mysqli为例:
完整可运行的代码示例
<?php session_start(); include 'check_login.php'; include '../db_config/connection.php'; $error = ""; $success = ""; if(isset($_POST['apply'])){ // 从Session和表单获取数据 $uid = $_SESSION['user_index']; $leavetype = $_POST['leavetype']; $fromdate = $_POST['fromdate']; $todate = $_POST['todate']; $description = $_POST['description']; $status = 0; $isread = 0; // 日期合法性验证 if(strtotime($fromdate) > strtotime($todate)){ $error = "结束日期必须晚于开始日期"; } else { // 准备插入SQL(假设目标表名为leave_applications,字段名根据你的实际表调整) $sql = "INSERT INTO leave_applications (user_index, leave_type, from_date, to_date, description, status, is_read) VALUES (?, ?, ?, ?, ?, ?, ?)"; // 初始化预处理语句 $stmt = $conn->prepare($sql); if($stmt){ // 绑定参数(i=整数,s=字符串,根据你的字段类型调整参数类型) $stmt->bind_param("issssii", $uid, $leavetype, $fromdate, $todate, $description, $status, $isread); // 执行插入 if($stmt->execute()){ $success = "请假申请提交成功"; } else { $error = "提交失败:" . $stmt->error; } $stmt->close(); } else { $error = "预处理语句创建失败:" . $conn->error; } } } $conn->close(); ?> <!-- 前端可以显示提示信息 --> <?php if(!empty($error)) echo "<p style='color:red;'>$error</p>"; ?> <?php if(!empty($success)) echo "<p style='color:green;'>$success</p>"; ?>
几个关键提醒
- Session校验:确保
check_login.php里已经完成了登录状态验证,并且确实把用户ID存入了$_SESSION['user_index'],否则会拿不到值。 - SQL注入防护:永远不要直接把用户输入(哪怕是Session里的内容)拼进SQL语句,预处理语句是最可靠的防护方式。
- 日期验证:用
strtotime()把日期字符串转成时间戳再比较,避免因日期格式不一致导致的验证错误。 - 错误处理:添加错误提示,方便你调试,也能给用户明确的反馈。
内容的提问来源于stack exchange,提问作者jackflick
相关产品推荐
相关产品推荐

