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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:05:23