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