2012-05-08 69 views
5

我需要做一个简单的查询如何在查询中使用准备好的语句与IN子句中PHP

$array_of_ids = array(); 
//poulate $array_of_ids, they don't come from another db but from Facebook 
//so i can't use a subquery for the IN clause 
$wpdb->prepare("SELECT id from table where id IN (%d, %d)", $array_of_ids [0], $array_of_ids [1]); 

的问题是,如果我有数组中200个元素,什么是处理的正确方法这个吗?我必须用200 %d手动建立查询吗?我需要这个查询,因为我必须使用facebook数据“同步”我的数据库,并且我必须检查我在数据库中的用户是否存在,更新存在的用户,插入新用户并删除那些不是我朋友的用户。

+0

看看[这个问题] [1]不回答你的问题 [1]:http://stackoverflow.com/questions/327274/mysql-prepared-statements-with-a-variable-size-variable-list –

回答

3

如果你肯定知道数组元素都是数字:

$wpdb->prepare("SELECT id FROM table WHERE id IN (" 
    . implode(',',$array_of_ids) . ")"); 

否则,您可以使用vsprintf形式的prepare参数数组中传递:

$wpdb->prepare("SELECT id FROM table WHERE id IN (" 
    . str_repeat("%d,", count($array_of_ids)-1) . "%d)" , $array_of_ids); 
+3

有点击败准备状态的整个目的在那里,不是。 – cHao

+0

您可以执行'implode(',',array_map('intval',$ array_of_ids))'以确保它们实际上是数字。 –

+0

公平点;在我修改后的答案中也显示了另一种方法。 – eggyal

0

是,动态SQL是这里的方式。幸运的是,整数很容易被忽略。

$vals = array_filter(array_map('intval', $vals)); 

请确保您至少有一个值,然后爆裂它。这里不需要准备好的语句,只需执行sql。

1

我不知道,这是一个很好的方法,但你可以做到这一点以这种方式:

$sql = "SELECT id from table where id IN (" 
    . implode(',', array_fill(0, count($array_of_ids), "%d")) 
    . ")"; 

call_user_func_array(array($wpdb, 'prepare'), $array_of_ids); 

这将构建与%d适当数量的字符串,然后使用call_user_func_array做它动态地。

这就是说,我不确定这是否真的是这样一种情况,即准备好的语句值得花费麻烦,因为清理整数是多么容易。

+0

array_map()很好地处理了我的想法,但是如果我使用数组映射,那么我可以轻松地跳过准备好的语句:) –

-1

你可以这样做:

$query = $wpdb->prepare("SELECT id from table where id IN :param"); 
$query->bindParam("param", "(".implode(',', array_map('intval', $array_of_ids)).")"); 
+1

当然' array_map('intval',...)'保证SQL注入的安全性? – eggyal

+0

是的,你是对的;) –

+0

在我看来,如果你绑定'param',它将被SQL转义,引用,并被视为一个字符串...不是一个东西的列表。除非MySQL用一些魔术来将字符串解释为列表,否则这可能不起作用。 – cHao

0

因为这有没有公认的答案了,我会去与我的做法与array_filter

$array_of_ids = array(0,1,1,2,3,5,8,13); 

echo "SELECT id from table where id IN (".implode(',', array_filter($array_of_ids,'is_int')).")"; 

将输出

SELECT id from table where id IN (0,1,1,2,3,5,8,13) 

$array_of_ids = array('zero',1,true,2,3,5,8,'thirteen'); 

echo "SELECT id from table where id IN (".implode(',', array_filter($array_of_ids,'is_int')).")"; 

将输出

SELECT id from table where id IN (1,2,3,5,8) 

请注意:is_int不起作用与$ _GET变量,所以使用is_numeric代替

相关问题