5

我需要做一个简单的查询

$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 数据“同步”,并且我必须检查我在数据库中的用户是否存在,更新那些存在的用户,插入新用户并删除那些不是我朋友的用户。

4

5 回答 5

4

如果您确定数组元素是数字:

$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);
于 2012-05-08T15:15:17.033 回答
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动态执行此操作。

也就是说,考虑到清理整数是多么容易,我不确定这是否真的是准备好的语句值得麻烦的情况。

于 2012-05-08T15:21:34.673 回答
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改用

于 2014-01-30T13:14:02.473 回答
0

是的,动态sql就是这里的方式。幸运的是,整数很容易搞砸。

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

确保您至少有一个值,然后将其内爆。这里不需要prepared statement,直接执行sql即可。

于 2012-05-08T15:18:45.560 回答
-1

你可以这样做 :

$query = $wpdb->prepare("SELECT id from table where id IN :param");
$query->bindParam("param", "(".implode(',', array_map('intval', $array_of_ids)).")");
于 2012-05-08T15:23:56.187 回答