PHP PDO Prepared Statement MySQL Count of Select where X LIK


PHP PDO Prepared Statement MySQL Count of Select where X LIKE

使用PHP v.5.2.14和PDO MySQL扩展。

我不熟悉事先准备好的发言。需要创建一个搜索表单(所以用户输入)和一个"选择所有X,其中X喜欢…"的工作查询。

代码和结果:

$sql = 'SELECT COUNT(*) as num_books from t_books where title LIKE :search_term';
// Later access as num_books
$prep = $dbh->prepare($sql);
$num = $prep->execute(array(':search_term' => '%'.$search_term. '%'));
$total=$num->fetchColumn();

$prep的Var转储:object(PDOStatement)#2(1){["queryString"]=>string(58)"SELECT COUNT(*)from t_books where title LIKE:search_term"}

致命错误:在非对象上调用成员函数fetchColumn()

如果$prep是对象,那么$num应该是对象。但它是布尔值(true)。这里发生了什么?

但更重要的是,我该如何计数?

我用PDO-读了行计数。那里的建议对我不起作用,因为我需要一份事先准备好的声明。将有用户输入。

谢谢你的帮助。

PDOStatement::execute()只返回一个指示成功或失败的布尔值,因此您的变量$num不是您想要从中获取的。通过将结果分配给$num,您不是在分配对象$prep,而是仅将方法调用的返回值分配给execute()TRUE)。

相反,是您的PDOStatement对象$prep中的fetchColumn()

$num = $prep->execute(array(':search_term' => '%'.$search_term. '%'));
if ($num) {
  $total = $prep->fetchColumn();
}

除此之外,SQL应该正确执行,并且它返回的一列应该包含所需的计数。

在这种情况下(尤其是因为您在没有参数的情况下调用fetchColumn()),这并不重要,但对于未来的读者来说,建议使用一个别名来命名COUNT()聚合,然后可以在关联或对象提取中使用:

$sql = 'SELECT COUNT(*) AS num_books from t_books where title LIKE :search_term';
// Later access as num_books