Php 使用带参数的PDO计数查询

Php 使用带参数的PDO计数查询,php,mysql,pdo,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', $passw

我设置了以下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
,如何从语句中检索所需的值?

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

正确的顺序是:

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

$stmt->execute();

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

正确的顺序是:

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

$stmt->execute();

您需要准备查询:

$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);

$CHECK\u MATCH=$DBH->prepare(您需要准备查询:

$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);

$CHECK\u MATCH=$DBH->prepare(我认为这个答案没有必要,因为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;

我认为这个答案是不必要的,因为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;

为什么不启用PDO警告?
->query
用于直接执行,而不是语句准备。尝试
$DBH->prepare
而不是
$DBH->query
我使用了
->query
以便从结果中获取值。如何使用准备好的语句获取这些值?可以使用
$ro获取这些值w=$CHECK_MATCH->fetch(PDO::fetch_OBJ)
为什么不启用PDO警告?
->query
用于直接执行,而不是语句准备。尝试
$DBH->prepare
而不是
$DBH->query
我使用了
->query
以便从结果中获取值。如何使用准备好的语句获取这些值?可以使用获取这些值ode>$row=$CHECK\u MATCH->fetch(PDO::fetch\u OBJ)