PHP PDO
是否可以使用有效匹配所有内容的命名占位符?
举例:$sql = "SELECT * FROM users WHERE targetGroup = :targetGroup AND userId = :userId"
并采取$statement = $this->dbh->prepare($sql);
然后我可以以某种方式绑定值,以便我得到以下行为:
:targetGroup = 1
,:userId = 5
。$sql = "SELECT * FROM users WHERE targetGroup = 1 AND userId = 5
显示所有用户的查询
:targetGroup
和:userId
设置为某个特殊值ALL
。$sql = "SELECT * FROM users
我想使用这个,以便我可以在程序中的某个地方定义查询,作为静态字符串,然后将它们重用于我的喜欢。
答案 0 :(得分:1)
你做不到。您必须为不同的查询准备不同的语句。
$findOneStmt = $pdo->prepare("SELECT * FROM user WHERE target_group = :tg AND user_id = :uid");
$findAllStmt = $pdo->prepare("SELECT * FROM users");
稍后,当您需要其中一个查询时,请致电:
$findOneStmt->execute(array(':tg' => 123, ':uid' => 321));
$user = $findOneStmt->fetch();
// ...
$findAllStmt->execute();
$users = $findAllStmt->fetchAll();
答案 1 :(得分:1)
您可以在SQL中添加一个条件,让您显示所有内容。例如:
SELECT *
FROM users
WHERE
1 = :showAll OR (
targetGroup = :targetGroup
AND userId = :userId
)
然后,当您要按:showAll
和:targetGroup
进行过滤时,可以将:userId
设置为0,或者当您要忽略:targetGroup
和{{1}时,可以将:userId
设置为1 }。
我认为最佳做法是提出两个不同的查询。
答案 2 :(得分:0)
问题是你实际上是在执行两个完全不同的查询。它们可能看起来非常相似,但没有where子句的SELECT *与带有where子句的SELECT *完全不同。
不是在一个地方定义SQL查询然后重用,抽象出功能并在需要时使用该方法调用,它将为您提供定义查询一次的能力,但您将有两个查询就是现在。这种方式更安全,更易于阅读和使用。