多用户场景下数据插入失败:用户需关联ID查看自身数据
问题分析与解决
问题根源
你的SQL插入语句里的(SELECT id FROM users)子查询在多用户场景下会返回所有用户的ID,而INSERT的VALUES列表中users_id字段只能接受单个值,这就导致数据库抛出错误,无法完成插入。单用户时因为只有一条用户数据,这个子查询刚好返回唯一ID,才侥幸运行正常。
修复步骤
1. 直接使用当前登录用户的ID
登录成功后,系统肯定会把当前用户的ID存储在会话(比如PHP的$_SESSION['user_id'])里,插入数据时直接调用这个值即可,不需要用子查询:
// 假设当前登录用户ID存在于$_SESSION['user_id']中 $user_id = $_SESSION['user_id']; $sql = "INSERT INTO images (users_id, picture, Carehome, dateworked, hours) VALUES ('$user_id', '$target_file', '$Carehome', '$dateworked', '$hours')";
2. 解决SQL注入风险
上面的写法仍存在SQL注入隐患,强烈建议使用预处理语句(PDO或mysqli)来避免:
PDO示例:
$user_id = $_SESSION['user_id']; $stmt = $pdo->prepare("INSERT INTO images (users_id, picture, Carehome, dateworked, hours) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$user_id, $target_file, $Carehome, $dateworked, $hours]);
mysqli示例:
$user_id = $_SESSION['user_id']; $stmt = $mysqli->prepare("INSERT INTO images (users_id, picture, Carehome, dateworked, hours) VALUES (?, ?, ?, ?, ?)"); $stmt->bind_param("issss", $user_id, $target_file, $Carehome, $dateworked, $hours); $stmt->execute();
3. 限制数据查询范围
用户登录后查询数据时,要加上users_id的过滤条件,确保只能看到自己添加的数据:
SELECT * FROM images WHERE users_id = 当前登录用户ID;
内容的提问来源于stack exchange,提问作者lee
相关产品推荐
相关产品推荐

