好的,我使用的是Yii2
,并且我熟悉在使用mysql查询时准备/绑定数据,例如:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id=:some_id");
$sql->bindValue(':some_id', $some_id);
但是,如果值 * 可以 * 包含多个值,比如使用MySQL
语法IN
时,该怎么办呢?
例如:
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id IN (:parents)");
$sql->bindValue(':parents', $parents);
现在,我明白了,只有当$parents
变量只有 * 一个 * 值时,上面的方法才能很好地工作;但是如果它有多个值,比如1,2,3
,那么当你真正需要'1','2','3'
或1,2,3
时,你最终会得到'1,2,3'
这样的结果。
正确的做法是什么?
7条答案
按热度按时间7rtdyuoh1#
我找到了解决办法
t9eec4r02#
您可以使用Yii的QueryBuilder函数,一切都会自动处理。试试这个:
结果是:
hgncfbus3#
Yii 2的数据库函数是基于
PDO
的。根据bindValue
的手册,不支持Array
类型的值。(第三个参数-data_type
)。解决方案是在查询之前创建一个字符串,该字符串适合您的
IN
子句,并将其绑定为字符串。类似于:
编辑
占位符似乎被内爆数组替换为一个字符串值
'1,2,3'
,而不是'1','2','3'
(因为它是一个占位符)。为了解决这个问题,我建议使用多个
?
占位符,这样就不用IN (:parents)
了,因为我们已经有了一个排列好的数组-我们可以使用count($array)
来知道我们需要放置多少占位符。请注意bindValue的第一个参数的传递值;手册中提到的是
$i+1
而不是$i
的原因:对于使用问号占位符的预准备语句,这将是参数的1索引位置。
有关详细信息和替代解决方案,请参阅以下答案:https://stackoverflow.com/a/920523/998096
zc0qhyus4#
如果数据是可信的,则此解决方案非常有效:
ubof19bj5#
我最后是这样做的:
其中,
$this->db
是Yii::$app->db
的一个示例。5lwkijsr6#
如果有人需要Yii1的解决方案:
ttisahbt7#
只管做
应该可以了。