2015-07-01 57 views
3

我可以使用以下代码在PDO准备语句内成功实现IN子句。MYSQL - 具有多个IN子句的PDO

in_array = array(1,2,3); 
$in = str_repeat('?,', count($in_array) - 1) . '?'; 
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)"; 
$stm = $db->prepare($sql); 
$stm->execute($in_array); 
$data = $stm->fetchAll(); 

我该怎么做多个$ in?例如,我已经失败尝试了以下内容:

in_array1 = array(1,2,3); 
$in1 = str_repeat('?,', count($in_array) - 1) . '?'; 
in_array2 = array(4,5,1); 
$in2 = str_repeat('?,', count($in_array) - 1) . '?'; 
$sql = "SELECT * FROM my_table WHERE (my_value1 IN ($in1)) AND (my_value2 IN ($in2))"; 
$stm = $db->prepare($sql); 
$stm->execute($in_array1,$in_array2); 
$data = $stm->fetchAll(); 

我认为它必须做与STM->执行,但不能肯定,帮助表示赞赏

+2

'执行()'需要** ** 1的参数,这是参数... – Rizier123

回答

3

您当前的查询出来的

SELECT * FROM my_table WHERE (my_value1 IN (?,?,?)) AND (my_value2 IN (?,?,?)) 

所以你execute使用是不正确,http://php.net/manual/en/pdostatement.execute.php。它应该只传递一个包含值的数组。

具有与执行的SQL语句中绑定参数一样多的元素的值数组。所有值都被视为PDO :: PARAM_STR。

我想用array_merge,http://php.net/manual/en/function.array-merge.php,将让你完成你正在尝试

$stm->execute(array_merge($in_array1,$in_array2)); 

这样的执行是

$stm->execute(array(1,2,3,4,5,1)); 

相当于这似乎不正确,因为阵列配对现在已消失,但占位符1(第一个问号)将映射到1,占位符4到4,依此类推。

+0

非常感谢你解释这个给我。老实说,我不明白将数组放在execute()中的目的,但是现在我知道它与现在有意义的占位符有关!这让我无法尝试在for循环中执行查询,再次感谢! –

+0

做什么$ in_array1和$ in_array2是一样的? – Subin

+0

@Subin它应该仍然合并罚款,不是吗?你能否提出一个问题的例子,还是你有一个悬而未决的问题? – chris85