【问题标题】:sql count() example on PHP manualPHP 手册中的 sql count() 示例
【发布时间】:2020-06-16 02:38:03
【问题描述】:

我正在使用 PHP pdo 开发分页功能。所以如果你想从一个 select 语句中计算行数,你必须使用 query() 方法并使用 SQL count() 函数

https://www.php.net/manual/en/pdostatement.rowcount.php

这一切都说得通,但是如果我需要从使用 prepare() 和绑定参数的 select 语句中计算行数怎么办?例如如果我将敏感的用户数据插入到 select 语句中?

【问题讨论】:

  • 我在这里看不到问题。 rowCount 所做的只是返回一些行。它无法公开任何数据。
  • @EL_Vanja 非常有意义。谢谢

标签: php sql pdo


【解决方案1】:

这个特定的手册页几乎是完整垃圾。它确实混淆了两个绝对不同且永远无法互换的任务。

因此,SQL count() 查询与选择查询的 PDO::rowCount() 无关,并且应该永远不要使用

您必须使用结果本身,而不是那种多余且无用的查询:

  • 如果您只选择一行,则获取该行并在打算使用行数的任何地方使用获取的数组:

    $stmt = $pdo->prepare("SELECT * FROM users WHERE id=?");
    $stmt->execute([$id]); 
    $user = $stmt->fetch();
    if ($user) {
        ...
    }
    
  • 如果您选择多行 - 同时获取它们并使用获取的数据:

    $stmt = $pdo->prepare("SELECT * FROM users LIMIT :limit, :offset");
    $stmt->execute(['limit' => $limit, 'offset' => $offset]); 
    $data = $stmt->fetchAll();
    if ($data) {
        ...
    }
    

我无法想象您需要获取返回行的实际计数的情况,但在这种情况下,只需使用 PHP 的 count():

 $count = count($data);

【讨论】:

  • 这不是意味着将所有结果加载到数组中吗?还是thaey已经在数组中?我在通过谷歌搜索时遇到了类似的答案,显然这会导致从非常大的结果集中获得大量数组的问题。同样当我在这里时,我是否正确地说 fetch() 仅在您知道您将只返回一行结果并且 fetchall 用于多个结果时使用?
  • 您不应该从数据库中请求大型数据集。
  • 我对这个真的很陌生,你认为大集合是什么?
  • 您目前不需要的任何数据。
猜你喜欢
  • 2012-07-20
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多