PDO是否可以使命名占位符匹配所有内容?

时间:2013-12-17 17:36:56

标签: php sql pdo

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
  1. 显示所有用户的查询

    • 参数:以某种方式将:targetGroup:userId设置为某个特殊值ALL
    • 结果查询:$sql = "SELECT * FROM users
  2. 我想使用这个,以便我可以在程序中的某个地方定义查询,作为静态字符串,然后将它们重用于我的喜欢。

3 个答案:

答案 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查询然后重用,抽象出功能并在需要时使用该方法调用,它将为您提供定义查询一次的能力,但您将有两个查询就是现在。这种方式更安全,更易于阅读和使用。