1

假设我有一个 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);
}

这似乎很冗长,特别是如果查询的构建方式有很多条件。有没有人对如何做到这一点有一个更简洁的想法,而不必添加大量的条件测试。

任何想法将不胜感激。

问候

詹姆士

4

1 回答 1

6

您可以使用带有值的数组并将其作为参数发送给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);
于 2015-04-07T18:09:25.643 回答