我有一个表单字段,它返回一个逗号分隔的字符串,我想将其传递给PHP PDO MySQL查询IN操作,但IN操作要求值以逗号分隔(而不是我的 string 分隔值。)
我该怎么做?
$values = $_POST['values']; # '10,5,4,3' (string)
$query = "SELECT * FROM table WHERE id IN (:values)";
$data = array( ':values' => $values );
答案 0 :(得分: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) ;
答案 1 :(得分: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));
答案 2 :(得分: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);