【问题标题】:Can't bind parameters to WHERE clause PDO无法将参数绑定到 WHERE 子句 PDO
【发布时间】:2018-02-26 07:21:08
【问题描述】:

我使用了很多使用 PostgreSQL 和 PHP 的 sql 语句,其中许多在 'WHERE' 子句中有变量。我可以让准备好的语句对 INSERT 和 UPDATE 执行得很好,但我不能让它对 WHERE 子句中带有变量的 SELECT 语句起作用。我已经在谷歌上搜索了一个没有成功的答案。请看下面的例子。这是从名为 bankrec 的表中选择最近核对的银行余额。我错过了什么?

$rec = $dbh->prepare('SELECT clearedbal FROM bankrec WHERE bankno = :bankno ');
$result = $rec->execute(['bankno'=>$bankno])->fetch(PDO::FETCH_ASSOC);

当我运行它时,我得到:

"Fatal error: Call to a member function fetch() on boolean"

但是,我知道查询是正确的,因为在没有准备好的语句的情况下简单地运行查询可以获得我想要的结果,但它很容易受到 sql 注入:

$rec = $dbh->query("SELECT clearedbal FROM bankrec WHERE bankno = '$bankno' ")->fetch(PDO::FETCH_ASSOC);

【问题讨论】:

  • 不要链接它,它应该是$rec->fetch(PDO::FETCH_ASSOC);,但执行返回bool
  • @LawrenceCherone 嗯,这是一个简单的修复!这样可行!为什么我可以像这样为 INSERT 和 UPDATE 而不是 SELECT 链接它?非常感谢!
  • @AppreciateCo execute() 返回一个布尔值,而query() 返回一个PDOStatement,它允许您进行方法链接。

标签: php sql postgresql pdo prepared-statement


【解决方案1】:

正如您在 this 链接上看到的那样,PDO 的 execute 方法根据定义返回布尔值。

我会推荐这种方法:

$rec = $dbh->prepare('SELECT clearedbal FROM bankrec WHERE bankno = :bankno ');
if($rec->execute(['bankno'=>$bankno])){
  $result=$rec->fetch(PDO::FETCH_ASSOC);
  //do another stuff there
} else {
  //Query failed handle error
}

如您所见,您可以使用execute 来确定查询是否成功执行。此外,如果您需要获取多于一行的结果,您应该使用fetchAll 方法:http://php.net/manual/en/pdostatement.fetchall.php

【讨论】:

  • 谢谢迪米特里奥斯。你说的和劳伦斯基本一样。我无法将评论标记为答案,所以我标记了你的。谢谢你们俩。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2017-11-18
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多