PDO绑定参数取决于它们是否存在于查询中

时间:2015-04-07 18:03:52

标签: php mysql pdo bindparam

假设我有一个mysql查询,它根据特定条件构建:示例

$query = "SELECT * from `usertable` where users_active=:users_active";
if($mode=="archived") {
    $query .= " AND archived=:archived";
}

$stmt = $dbpdo->prepare($query);
$stmt->bindParam(':users_active', $users_active);
$stmt->bindParam(':archived', $archived);
$stmt->execute();

现在,如果我执行上述操作,它将仅在$ mode ==" archived"时起作用,否则命名占位符":archived"不会成为查询的一部分。

这在某个方面对我有意义,但是引出了如何优雅地处理它的问题。我的应用程序中有很多查询是有条件构建的。我能做到这一点,但这对我来说似乎有些重复:

if($mode=="archived") {
    $stmt->bindParam(':archived', $archived);
}

这看起来很长,特别是如果有很多条件来构建查询。有没有人有一个更简洁的想法如何做到这一点,而无需添加大量的条件测试。

任何想法都会受到赞赏。

此致

詹姆斯

1 个答案:

答案 0 :(得分:3)

您可以使用包含值的数组,并将其作为参数发送到execute()方法。

如果bindParam()提供的变量的类型转换并不那么重要(您甚至不使用它......),这使得构建查询变得更加容易,因为您可以填充数组你构建了查询字符串。

对于你的例子:

$query = "SELECT * from `usertable` where users_active=:users_active";
$params = array(':users_active' => $users_active);

if($mode=="archived") {
    $query .= " AND archived=:archived";
    $params[':archived'] = $archived;
}

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

$stmt->execute($params);