PDO IN()数组语句和占位符

Mav*_*ick 13 php mysql pdo warnings

我在SO上找到了这个代码,这对于一起使用PDO和IN()语句非常有用.

$values = explode(',', $values) ; # 1,4,7

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

$stm = $db->prepare($query) ;
$stm->execute($values) ;
Run Code Online (Sandbox Code Playgroud)

但是,我如何混合查询的另一个添加,以便查询如下所示:

$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";
$stm = $db->prepare($query) ;
$stm->execute(array($values,$product)) ; //error happens when adding product placeholder
Run Code Online (Sandbox Code Playgroud)

我认为这会起作用,但我得到:

警告: PDOStatement :: execute()[pdostatement.execute]:SQLSTATE [HY093]:参数号无效:绑定变量数与第3行中的标记数不匹配($ stm行)

知道如何让它按预期运行吗?

UPDATED执行到数组,仍然无法正常工作..

Tad*_*eck 8

这应该工作,如果$values是一个数组:

$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";
$stm->execute(array_merge($values, array($product)));
Run Code Online (Sandbox Code Playgroud)

说明

execute()期望提供一个参数 - 在这种情况下是一个数组.通过添加array_merge($values, array($product))您创建一个$product最后添加的数组,所以查询应该正常工作.

请参阅此处的演示:http://ideone.com/RcClX


Cha*_*les 5

$stm->execute($values,$product) ; //error happens when adding product placeholder
Run Code Online (Sandbox Code Playgroud)

这里的问题是execute需要单个阵列.您无法传递多个数组,更糟糕的是,您无法嵌套数组.

我们已经有了一个非常好的$values数组,所以让我们创建占位符字符串重用它.

$values = explode(',', $values) ; # 1,4,7

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

// New!
$values[] = $product;

$stm = $db->prepare($query);
$stm->execute($values);
Run Code Online (Sandbox Code Playgroud)

  • @Maverick:我是故意这样做的(在`execute()`call中合并了数组),因为你以后总是可以在你的代码中使用`$ values`.如果你在追加`$ product`后再这样做,那么你只需要处理一个你不想要的额外元素:)但决定是你的 - 只记得不要让代码变得复杂:)如果你想要在一行中执行类似`$ values [] =($ product,$ type)`的操作,只需执行以下操作:`$ values = array_merge($ values,array($ product,$ type))`. (2认同)