PHP与SQL技术问题:如何将用户ID转为变量存入工单表?
解决PHP工单订购时自动存入用户ID的问题
看起来你需要实现用户订购工单时,自动将当前登录用户的ID写入tickets表,而不需要用户手动输入。结合你给出的代码片段,我整理了以下解决方案:
核心思路:安全获取当前用户ID
首先,不要通过表单提交用户ID(比如代码里的$_POST['usid']),这种方式容易被恶意篡改,而且既然用户ID已经在页面显示,说明用户已经登录,应该从会话($_SESSION)中获取用户ID——这是更安全可靠的方式。
步骤1:确保用户登录时已存入会话
在用户登录成功的代码中,需要将用户ID存入$_SESSION,比如:
// 登录验证通过后 $_SESSION['user_id'] = $logged_in_user['id']; // $logged_in_user是从数据库取出的用户数据 $_SESSION['user_logged_in'] = true; // 标记用户已登录状态
步骤2:修改你的best()函数
更新函数,从会话中获取用户ID,完善表单验证和数据插入逻辑:
function best(){ global $db, $errors; // 接收表单输入值 $ticket = e($_POST['tickety']); $aantall = e($_POST['aantal']); // 1. 验证用户是否已登录 if(!isset($_SESSION['user_id']) || !$_SESSION['user_logged_in']){ $errors['login_required'] = '请先登录才能提交工单'; return; } $usidd = $_SESSION['user_id']; // 从会话安全获取用户ID // 2. 完善表单验证 if(empty($ticket)){ $errors['ticket_empty'] = '请选择工单类型'; } if(empty($aantall) || !is_numeric($aantall) || $aantall < 1){ $errors['aantal_invalid'] = '请填写有效的数量(至少1)'; } // 3. 无错误时插入数据库 if(empty($errors)){ // 使用预处理语句防止SQL注入(非常重要!) $query = "INSERT INTO tickets (ticket_type, quantity, user_id) VALUES (?, ?, ?)"; $stmt = mysqli_prepare($db, $query); mysqli_stmt_bind_param($stmt, "sii", $ticket, $aantall, $usidd); $result = mysqli_stmt_execute($stmt); if($result){ // 插入成功的逻辑,比如跳转至成功页面 header('Location: order_success.php'); exit(); } else { $errors['db_error'] = '提交失败,请稍后重试'; } } }
步骤3:前端表单优化
既然用户ID是自动获取的,前端表单里不需要再显示或提交usid字段,直接去掉对应的表单元素即可——避免不必要的数据暴露。
额外安全建议
- 减少全局变量依赖:全局的
$db和$errors可以改成函数参数传递,让代码更易维护、更安全。 - 坚持使用预处理语句:上面的代码用了
mysqli_prepare和bind_param,能有效防止SQL注入,绝对不要直接拼接SQL语句。 - 严格验证输入:对
$aantall进行数字合法性校验,确保存入数据库的是有效正整数。
内容的提问来源于stack exchange,提问作者Jop Rill
相关产品推荐
相关产品推荐

