2012-05-08 66 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代替

相關問題