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

Posted

技术标签:

【中文标题】PDO 绑定参数取决于它们是不是存在于查询中【英文标题】:PDO Bind Params depending on whether they exists in the queryPDO 绑定参数取决于它们是否存在于查询中 【发布时间】:2015-06-12 10:29:58 【问题描述】:

假设我有一个根据特定条件构建的 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);

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

任何想法将不胜感激。

问候

詹姆斯

【问题讨论】:

您尝试过的有什么问题(有条件地添加参数)。我认为如果代码正常工作,那么它应该不是问题。 请添加您构建查询的完整代码 查看我的回答 here 构建动态查询 【参考方案1】:

您可以使用包含值的数组并将其作为参数发送到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);

【讨论】:

好吧,如果我们能看到 OP 的完整代码,我们甚至可以优化 if 语句 @Rizier123 没错,我只是使用 OP 的示例来表明您不需要任何额外的 if 语句。我经常这样使用它:-) 根据 OP 的完整代码,他甚至可能不需要任何 if 语句,或者至少他不必编写越来越多的代码。看看OP怎么说,我还在等OP的代码:***.com/questions/29498155/… :)

以上是关于PDO 绑定参数取决于它们是不是存在于查询中的主要内容,如果未能解决你的问题,请参考以下文章

PDO 案例存在不适用于绑定参数

如何在 PDO 中为准备好的查询绑定参数?

PHP PostgreSQL PDO 无法使用 LIKE 绑定参数

循环内 PDO 语句的绑定参数

PHP / PDO动态绑定值(无效的参数计数错误)

MySQL PDO如何为IN()[重复]绑定参数