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

时间:2012-01-24 17:58:39

标签: 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) ;

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

$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

我认为这样可行,但我得到了:

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

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

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

5 个答案:

答案 0 :(得分:8)

解决方案

如果$values是一个数组,这应该有效:

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

说明

execute()期望提供一个参数 - 在本例中为数组。通过添加array_merge($values, array($product)),您可以在最后添加$product创建一个数组,因此查询应该可以正常运行。

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

答案 1 :(得分:5)

$stm->execute($values,$product) ; //error happens when adding product placeholder

这里的问题是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);

答案 2 :(得分:1)

另一个解决方案可以是(如果你喜欢:param_name = $ value方式,就像我一样):

$params = array(
     ':product' =>  $product
);
$_in_params = array();
foreach ( $_in_values as $idx_in => $value_in)
{
    $_in_params[] = ':param_in_'.$idx_in;
    $params[':param_in_'.$idx_in] = $value_in;
}

$query .= "SELECT * FROM table WHERE id IN (".join(',',$_in_params).") AND product=:product";

我不确定这是否是最好和最优的解决方案,但它更具人性化:)如果你有一个复杂的查询并且你想调试它会很有帮助

(我很好奇,如果有人为什么不以这种方式做一个好的论据)

答案 3 :(得分:0)

你忘了准备它^ _ ^

$query = "SELECT * FROM table WHERE id IN ($placeholders) AND product=?";
$stm = $db->prepare($query) ;
$stm->execute($values,$product) ; //p00f

除此之外 execute()应该只有一个参数

所以上面的无效全部

See the DOCs

答案 4 :(得分:0)

如果您需要占位符版本

$values = [1, 4, 7, 8];
$placeholders =  preg_filter('/^/', ':prefix_', array_keys($values)));
$query = 'SELECT * FROM table WHERE id IN ( '. implode(', ', $placeholders) . ')';

$stmt = $db->prepare($query);

if (count($values) > 0) {
    foreach ($values as $key => $current_value) {
        $stmt->bindValue($placeholders[$key] , $current_value, PDO::PARAM_STR);
    }
}

$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);