You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中以其他用户登录时获取选中用户ID及信息的技术问题

解决MySQL获取目标用户ID并传入消息插入操作的问题

你现在的核心问题是没有根据选中的接收者邮箱精准获取对应的用户ID,反而通过查询所有消息和用户的内连接结果,最后循环得到的$receiverID只会是结果集中最后一个用户的ID,这完全不符合你的需求。下面一步步帮你修正:

问题分析

你的代码里这段查询完全没必要:

$query = "SELECT * FROM tblmessage INNER JOIN tblusers ON tblmessage.userid=tblusers.userid";
$res = mysqli_query($con,$query);
while ($row = mysqli_fetch_assoc($res)) {
    $receiverID = $row['userid'];
}

它会把所有关联的消息和用户数据查出来,循环结束后$receiverID是最后一条数据的用户ID,和你选中的接收者($_POST['email'])毫无关系。

正确的解决步骤

  1. 根据接收者邮箱查询对应的用户ID:直接从tblusers表中,用提交的邮箱作为条件查询唯一的userid。
  2. 处理查询结果:确保查询到有效用户ID后再执行插入操作,避免空值或错误。
  3. 修复SQL注入风险:你当前的字符串拼接SQL语句存在严重的注入漏洞,必须改用预处理语句。

修正后的完整代码

if(isset($_POST['send'])) {
    // 1. 根据接收者邮箱获取对应的userid
    $receiver_email = $_POST['email'];
    $get_user_id_query = "SELECT userid FROM tblusers WHERE Email = ?";
    $stmt = mysqli_prepare($con, $get_user_id_query);
    mysqli_stmt_bind_param($stmt, "s", $receiver_email);
    mysqli_stmt_execute($stmt);
    $result = mysqli_stmt_get_result($stmt);
    
    if($row = mysqli_fetch_assoc($result)) {
        $receiverID = $row['userid'];
        
        // 2. 准备插入消息的预处理语句
        $sender = $_SESSION['Email'];
        $message = $_POST['textmessages'];
        $date = date("Y-m-d h:i:sa");
        // 假设$user_id是当前登录用户的ID,确保这个变量已正确赋值
        $insert_query = "INSERT INTO `tblmessage`(`sender_name`,`receiver_name`,`receiver_id`,`message_text`,`date_time`,`userid`) 
                         VALUES(?, ?, ?, ?, ?, ?)";
        $insert_stmt = mysqli_prepare($con, $insert_query);
        // 绑定参数:s=字符串,i=整数,根据你的字段类型调整
        mysqli_stmt_bind_param($insert_stmt, "ssisss", $sender, $receiver_email, $receiverID, $message, $date, $user_id);
        
        if(mysqli_stmt_execute($insert_stmt)) {
            echo "<script>alert('Message Sent')</script> 
                  <script>window.location.href='messages.php?id=$receiverID';</script>";
        } else {
            echo "插入失败:" . mysqli_error($con);
        }
        mysqli_stmt_close($insert_stmt);
    } else {
        echo "<script>alert('找不到该接收者用户')</script>";
    }
    mysqli_stmt_close($stmt);
}

额外注意事项

  • 确保$_SESSION['Email']和$user_id已经正确初始化,也就是当前登录用户的信息已经存入Session。
  • 预处理语句的参数绑定类型要和你的数据库字段类型匹配:比如userid如果是整数,就用i而不是s。
  • 永远不要用字符串拼接的方式构建SQL语句,这会导致SQL注入攻击,预处理语句是最基础的防护手段。

内容的提问来源于stack exchange,提问作者Ralph Arca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:40:21