使用带参数的PDO COUNT查询

时间:2014-09-09 16:24:24

标签: php mysql pdo

我设置了以下PDO查询:

$CHECK_MATCH = $DBH->query("
    SELECT COUNT(*) as matches FROM users WHERE 
        username = :username AND password = :password
");
$CHECK_MATCH->bindParam(':username', $username);
$CHECK_MATCH->bindParam(':password', $password);

然而,我收到一个错误说:

Fatal error: Call to a member function bindParam() on a non-object

为什么这不起作用?
如果我使用prepare而不是query,我将如何从语句中检索所需的值?

3 个答案:

答案 0 :(得分:3)

你没有准备一份声明。您直接执行了查询。由于就->query()而言,占位符使用查询不是有效查询,因此查询失败,并返回布尔值FALSE。然后,您将该布尔值设为FALSE并尝试将其视为对象。

正确的顺序是:

$stmt = $dbh->prepare('.... your query here ...');
              ^^^^^^^----note the new method call
$stmt->bindParam(...);

$stmt->execute();

答案 1 :(得分:3)

我认为这个答案没有必要,因为 Marc B 的答案实际上解决了问题。好吧,既然@proPhet要求提供完整的解决方案,那么它就是:

$CHECK_MATCH = $DBH->prepare("SELECT COUNT(*) as matches FROM users WHERE 
    username = :username AND password = :password");
$CHECK_MATCH->bindParam(':username', $username);
$CHECK_MATCH->bindParam(':password', $password);

$CHECK_MATCH->execute();
// Fetch as object
$row = $CHECK_MATCH->fetch(PDO::FETCH_OBJ);

echo $row->matches;

答案 2 :(得分:0)

您需要准备查询:

$CHECK_MATCH = $DBH->prepare("  <------ Changed query for prepare
    SELECT COUNT(*) as matches FROM users WHERE 
        username = :username AND password = :password
");
$CHECK_MATCH->bindParam(':username', $username);
$CHECK_MATCH->bindParam(':password', $password);