提问者:小点点

PHP红豆MySQL多值绑定在getAll()中的计算


我在php中有一个包含字符串的数组,我想以以下方式在Red Bean MySQL的查询中使用这些字符串:

$someString = '\'abc\',\'def\',\'ghi\'';
R::getAll("select * from table where name not in (:list)", array(':list'=> $someString));

问题是,无论我如何设置数组字符串中的值,列表都没有被正确计算,结果中返回了名称abc、def、ghi。我尝试了以下方法:

$someString = '\'abc\',\'def\',\'ghi\''
$someString = 'abc\',\'def\',\'ghi'
$someString = 'abc,def,ghi'

在SQL server中手动运行查询是正常的,并且我不会得到返回的值,但是在使用redbean的php代码中运行查询是不正常的,并且看起来列表没有得到正确的语法解释。谁能对这件事说点什么吗?


共1个答案

匿名用户

由于RyanVincent的评论,我使用查询中的位置参数解决了这个问题,或者更具体地说,使用R::genslots函数。

替换了以下内容:

$someString = '\'abc\',\'def\',\'ghi\'';
R::getAll("select * from table where name not in (:list)", array(':list'=> $someString));

与:

$someArray = array('abc', 'def', 'ghi');
R::getAll("select * from table where name not in (". R::genSlots($someArray) .")", $someArray);

这将为查询中的参数创建一个$SOMEARRAY长度位置,然后用传递给getAll函数的第二个参数中的值填充这些位置。注意,在本例中,我使用了一个set content数组(3个变量),但它将动态地与您将要使用的任何长度数组一起工作。

此外,这也可以适用于查询中的多个位置,例如:

$surnameArray = array('smith');
$arr1 = array('john', 'pete');
$arr2 = array('lucy', 'debra');

$mergedVarsArray = array_merge($surnameArray,$arr1);
$mergedVarsArray = array_merge($mergedVarsArray,$arr2);

R::getAll("select * from table where surname != ? and name in (." R::genSlots($arr1).") and name not in (". R::genSlots($arr2) .")", $mergedVarsArray);

该代码将有效地翻译为:

select * from table where surname != 'smith' and name in ('john','pete') and name not in ('lucy', 'debra')

每个‘?’放置在查询中的(或由genSlots()动态生成的)将被作为参数传递给查询的数组中的相关定位项所替换。

希望这能让一些人明白这个用法,因为在我得到帮助之前,我不知道该怎么做。