MySQL IN 语句的 PDO 绑定值
使用 PDO 将值数组绑定到 MySQL IN 时遇到问题陈述。您的目标是按如下方式执行查询:
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (1,2,3,4,5,6,7,8)
但是,PDO 会将绑定值转换为逗号分隔的字符串,从而导致以下错误查询:
SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN ('1,2,3,4,5,6,7,8')
您尝试使用自定义函数来拆分查询本身内的逗号分隔字符串,但这不是最佳选择解决方案。
解决方案 1:手动构造查询
正如上一个问题中所建议的,您可以通过连接每个 IN 子句值的占位符来手动构造查询。例如:
$products = array(1,2,3,4,5,6,7,8); $placeholders = array_fill(0, count($products), '?'); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE products IN (" . implode(',', $placeholders) . ")"; $stmt = $pdo->prepare($sql); $stmt->execute($products);
解决方案 2:使用 find_in_set()
您可以使用 find_in_set() 函数将值与逗号分隔的字符串进行匹配。但是,这种方法在处理大型数据集时可能会出现性能问题,因为它需要将表中的每个值转换为字符类型。
$products = array(1,2,3,4,5,6,7,8); $sql = "SELECT users.id FROM users JOIN products ON products.user_id = users.id WHERE find_in_set(cast(products.id as char), '" . implode(',', $products) . "') > 0"; $stmt = $pdo->prepare($sql); $stmt->execute();
解决方案 3:创建用户定义函数
最好的解决方案是创建一个用户定义函数(UDF)来分割逗号分隔的字符串。这是一个相对复杂的解决方案,但它为具有可变大小列表的 IN 子句提供了最佳性能。
有关创建 UDF 的说明,请参阅提供的链接。
以上是如何使用 PDO 将数组值正确绑定到 MySQL IN 语句?的详细内容。更多信息请关注PHP中文网其他相关文章!