【问题标题】:PHP PDO Prepared Statement MySQL Count of Select where X LIKEPHP PDO Prepared Statement MySQL Count of Select where X LIKE
【发布时间】:2012-08-18 07:50:33
【问题描述】:

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

我是准备好的陈述的新手。需要创建一个搜索表单(以便用户输入)和一个“Select all X where X like...”品种的工作查询。

代码和结果:

$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 的变量转储: object(PDOStatement)#2 (1) { ["queryString"]=> string(58) "SELECT COUNT(*) from t_books where title LIKE :search_term" }

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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

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

    相反,fetchColumn() 来自 $prep,您的 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
    

    【讨论】:

    • 成功了。感谢您,我正在使用 PDO 进行分页。也感谢别名的建议。在学习新事物时,我喜欢学习最佳实践。
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2011-10-21
    • 2013-07-03
    • 1970-01-01
    相关资源
    最近更新 更多