【问题标题】:Is there a way to use SELECT FOUND_ROWS() in php and mysqli?有没有办法在 php 和 mysqli 中使用 SELECT FOUND_ROWS() ?
【发布时间】:2019-07-10 03:04:51
【问题描述】:

我正在尝试在我的网站中实施分页系统,但无法克服这个顽固的错误。我不确定你是否可以在 mysqli 中使用 FOUND_ROWS() 而不是 PDO,但这就是我来这里的目的。

我有最新版本的 PHP 并且在分页中到目前为止一切正常。

$stmt = $conn->prepare('SELECT count(*) FROM owned_assets WHERE uid=? AND type=? LIMIT '.$start.', '.$rLim);
    $stmt->bind_param('ii', $uid, $assetType);
    $stmt->execute();
    $total = $conn->query('SELECT FOUND_ROWS() as total')->mysqli_fetch_array()['total'];

应该发生的事情(到目前为止)是 mysql 将计算在匹配查询中找到的行,我可以从那里进一步工作。

这是我当前的错误:

致命错误:未捕获的错误:在 bool 上调用成员函数 mysqli_fetch_array()

【问题讨论】:

  • hmm,添加另一个查询以使用FOUND_ROWS()来获取计数不需要,只需获取并使用初始查询返回值

标签: php mysqli


【解决方案1】:

当然有,但你必须遵循正确的例程

您当前的查询没有意义,因为它计算了您已经知道的数字,存储在 $rLim 中(好吧,并非总是如此,但这不是重点)。

要使用 FOUND_ROWS() 进行分页,您必须将 SQL_CALC_FOUND_ROWS 添加到获取单个页面数据的查询中。

然后您将能够通过使用 FOUND_ROWS() 运行另一个查询来无限制地获取总行数。

也就是说,不推荐使用 SQL_CALC_FOUND_ROWS,因为它与获取所有行一样慢没有限制。这就是该功能最近弃用的原因。

因此您必须进行两次查询,一次使用 LIMIT 子句获取实际数据,另一次使用 count(*) 且不使用 LIMIT。

【讨论】:

    【解决方案2】:

    您已经有了计数查询,只需获取该值即可。无需再次查询FOUND_ROWS()

    $stmt = $conn->prepare('SELECT count(*) FROM owned_assets WHERE uid=? AND type=?');
    $stmt->bind_param('ii', $uid, $assetType);
    $stmt->execute();
    $result = $stmt->get_result();
    $total = $result->fetch_assoc();
    echo $total['count(*)'];
    

    旁注:您可以在查询中使用count(*) AS total 的别名,并在返回值中以$total['total'] 访问索引。

    【讨论】:

    • 当我进行另一个查询时它工作正常(就像我使用第一个查询时它不会返回其他值一样)
    • @RandomRando 并在计数后立即执行FOUND_ROWS() 会产生不正确的结果,我没有测试过,但我认为执行FOUND_ROWS() 会每次都给你1,因为count() 给出你一排。它不会像您期望的那样工作。删除计数并将其替换为SELECT * 然后FOUND_ROWS() 是正确的序列。但这需要两次,只需使用COUNT(*) 然后获取该列即可。
    • 这个查询基本上没有用,因为它计算了预定义的行数。只是说。
    • @YourCommonSense 好点,它本来就不应该有限制
    【解决方案3】:

    您不需要其他查询来获取总行数,因为您已经使用COUNT() 获得了它。您可以使用 bind_result():

    将第一个查询的结果绑定到 $total
    $stmt->bind_result($total);
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 2016-04-25
      • 2011-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      相关资源
      最近更新 更多