我有一个PDO的问题,在被它困扰了很长一段时间后,我真的很想得到一个答案.

举个例子:

我将一个ID数组绑定到一个PDO语句,以便在MySQL in语句中使用.

数组应该是:$values = array(1,2,3,4,5,6,7,8);

数据库安全变量应该是$products = implode(',' $values);

因此,$products将是值为:'1,2,3,4,5,6,7,8'STRING

该语句将如下所示:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN (:products)

当然,$products将作为:products与语句绑定.

然而,当编译语句并绑定值时,它实际上是这样的:

SELECT users.id
FROM users
JOIN products
ON products.user_id = users.id
WHERE products IN ('1,2,3,4,5,6,7,8')

问题是它将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)

实际上,我能做到这一点的唯一方法是将值放在字符串本身中,而不绑定它们,不过我肯定知道必须有一种更简单的方法来做到这一点.

推荐答案

这与这个问题中的问题是一样的:Can I bind an array to an IN() condition?

答案是,对于in子句中大小可变的列表,您需要自己构造查询.

However,您可以使用带引号的逗号分隔列表(使用find_in_set),但是对于大型数据集,这会对性能产生相当大的影响,因为表中的每个值都必须转换为char类型.

例如:

select users.id
from users
join products
on products.user_id = users.id
where find_in_set(cast(products.id as char), :products)

Or, as a third option,您可以创建一个用户定义的函数,用于拆分逗号分隔的列表(参见http://www.slickdev.com/2008/09/15/mysql-query-real-values-from-delimiter-separated-string-ids/).这可能是这三个选项中最好的一个,尤其是当您有很多查询依赖于in(...)个子句时.

Php相关问答推荐

Woocommerce将自定义数据添加到自定义文件中购物车中的产品

Laravel 11发送邮箱时奇怪的未定义数组键名称

在不刷新页面的情况下无法使用JQuery更新id

Laravel 10查询中的多个where子句

composer如何解析包名?

在WooCommerce中执行一次银行电汇确认付款代码

如何使用属性#[Embedded]嵌入带有规则的对象集合?

WordPress:将自定义单选输入字段添加到用户配置文件

以编程方式更改新订单、已取消订单和失败订单的邮箱WooCommerce通知

Symfony Api平台:按自定义实体方式排序结果

来自POST请求的(无效)json字符串中的奇怪字符(编码问题)

在Symfony 6.4中将工作流动态添加到服务

如何配置我的.env文件以在laravel的一个项目中连接两个不同的数据库?

将数据推入所有子数组条目

Shopware 6 插件:如何删除布尔配置并将其迁移到多选配置

invalid_grant 和无效的 JWT 签名

WooCommerce:如果订单总数为零,则隐藏本地取货运输选项

标签打印机的 CSS

Composer自动加载器重复了子类的类文件路径

symfony/notifier + twig/inky-extra 在 dunglas/symfony-docker 中缺少 ext-xsl.