Jam*_*ern 2 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();
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行上面的代码,它仅在 $mode=="archived" 时才有效,否则命名占位符“:archived”将不会成为查询的一部分。
从一方面来说,这对我来说是有道理的,但又引出了如何优雅地处理它的问题。我的应用程序中有很多查询是有条件构建的。我可以这样做,但这对我来说似乎是重复的:
if($mode=="archived") {
$stmt->bindParam(':archived', $archived);
}
Run Code Online (Sandbox Code Playgroud)
这看起来很冗长,特别是如果查询的构建方式有很多条件的话。有谁对如何做到这一点有一个更简洁的想法,而无需添加大量条件测试。
任何想法将不胜感激。
问候
詹姆士
您可以使用包含值的数组并将其作为参数发送给该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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |