Flutter传逗号分隔ID字符串至PHP API,转整数列表用于MySQL IN查询
解决Flutter传ID列表到PHP API实现MySQL IN查询的问题
你的核心问题是把逗号分隔的ID字符串直接拼进SQL后,MySQL会将整个字符串视为单个值,而非多个独立的整数,同时这种写法还存在严重的SQL注入风险。下面给出两种安全可行的解决方案:
方案1:使用PDO预处理语句(推荐)
PDO的预处理机制能自动处理参数绑定,既避免语法错误,又能防止SQL注入:
// 假设已初始化PDO连接$pdo $idStr = $_POST['user_ids']; // 将字符串分割为数组 $ids = explode(',', $idStr); // 把数组元素转为整数,过滤无效值 $ids = array_map('intval', $ids); $ids = array_filter($ids); // 处理空ID列表的情况 if (empty($ids)) { echo json_encode([]); exit; } // 生成与ID数量匹配的占位符(?) $placeholders = implode(',', array_fill(0, count($ids), '?')); $sql = "SELECT * FROM users WHERE user_id IN ($placeholders)"; // 预处理并执行查询 $stmt = $pdo->prepare($sql); $stmt->execute($ids); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); echo json_encode($result);
方案2:使用MySQLi预处理语句
如果项目用的是MySQLi,同样可以用预处理实现:
// 假设已初始化MySQLi连接$mysqli $idStr = $_POST['user_ids']; $ids = explode(',', $idStr); $ids = array_map('intval', $ids); $ids = array_filter($ids); if (empty($ids)) { echo json_encode([]); exit; } $placeholders = implode(',', array_fill(0, count($ids), '?')); $sql = "SELECT * FROM users WHERE user_id IN ($placeholders)"; $stmt = $mysqli->prepare($sql); // 绑定参数:str_repeat('i', count($ids))表示所有参数都是整数类型 $stmt->bind_param(str_repeat('i', count($ids)), ...$ids); $stmt->execute(); // 获取查询结果 $result = $stmt->get_result()->fetch_all(MYSQLI_ASSOC); echo json_encode($result);
重要提醒
绝对不要直接将用户传入的字符串拼接进SQL语句(比如WHERE user_id IN ('$idStr')),这种写法不仅会导致语法错误,还会被恶意利用进行SQL注入攻击,比如攻击者传入1'); DROP TABLE users; --就可能删除你的数据表。
Flutter端的传递方式无需修改,继续将ID列表转为逗号分隔字符串提交即可:
List<int> userIds = [1, 2, 3, 4]; String idsStr = userIds.join(','); // 提交参数示例 var response = await http.post( Uri.parse('你的API地址'), body: {'user_ids': idsStr}, );
内容的提问来源于stack exchange,提问作者Texv
相关产品推荐
相关产品推荐

