2011-01-18 88 views
4

我有一个表单字段,它返回一个逗号分隔的字符串,我想将它传递给PHP PDO MySQL查询IN操作,但IN操作要求这些值由逗号分隔(与我的字符串分隔值的)。将值传递给PDO准备语句中的MySQL IN操作?

我该怎么做?

$values = $_POST['values']; # '10,5,4,3' (string) 
$query = "SELECT * FROM table WHERE id IN (:values)"; 
$data = array(':values' => $values); 

回答

9

您无法在单个占位符中传递多个值。您必须为每个值输入一个不同的占位符,以传入IN()。由于您不知道会有多少个,请使用?而不是命名参数。

$values = explode(',', $values) ; 

$placeholders = rtrim(str_repeat('?, ', count($values)), ', ') ; 
$query = "SELECT * FROM table WHERE id IN ($placeholders)"; 

$stm = $db->prepare($query) ; 
$stm->execute($values) ; 
+0

+1不错,我会然而,做到以下几点:`$值= array_filter(array_map( '微调',爆炸( '',$值) ),'is_numeric');`,你永远不知道什么来自用户输入... – 2011-01-18 23:02:22

+0

你的语法反转了'rtrim`:应该是`rtrim(str_repeat('?,',count($ values)), ',');`。但除此之外,这是我一起去的解决方案。谢谢! – neezer 2011-01-18 23:37:37

0

PDO本身不能将数组绑定到:parameter。你需要一个辅助函数。

另外在你的例子中,文字字符串'10,5,4,3'将作为一个值接收。参数绑定将把它变成.. id IN ('10,5,4,3')而不是列表比较。

你的情况的解决方法是回退使用动态SQL和转义。

$values = preg_replace('/[^\d,]/', "", $_POST['values']); 
$query = "SELECT * FROM table WHERE id IN ($values)"; 

我个人使用,其具有阵列的特殊语法的包装/辅助function(但你实际上并没有一个开始,所以这将是一个双重的解决方法):

db("SELECT * FROM table WHERE id IN (??)", explode(",",$values)); 
0

关键是要认识到,$values是一堆个人的价值观,并考虑设立查询与此有关。如果您使用?占位符而非命名占位符,则更容易。例如,你可以做类似如下:

$values = explode(',', $_POST['values']); //array(10,5,4,3) 
$placeholder_string = implode(',', array_fill(0, count($values), '?')); // string '?,?,?,?' 
$query = "SELECT * FROM table WHERE id IN ($placeholder_string)"; 

$statement = $db->prepare($query); 
$statement->execute($values);