PHP PDO准备语句MySQL计数选择X LIKE

时间:2012-08-22 20:18:43

标签: php mysql pdo prepared-statement

使用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)。这里发生了什么?

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

我读过Row count with PDO - 。那些建议对我不起作用,因为我需要准备好的声明。会有用户输入。

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

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

而是来自$prep的{​​{3}},您的PDOStatement对象。

$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