【问题标题】:Using SQlite3 in PHP how to count the number of rows in a result set?在 PHP 中使用 SQlite3 如何计算结果集中的行数?
【发布时间】:2011-02-04 21:47:38
【问题描述】:

目前我正在使用:

$result = new SQLite3(sprintf("users/USERIDS_DB.sqlite"));

$numRows = $result->exec ("SELECT count(*) FROM USERIDS");

echo sprintf("the number of rows are: %d", $numRows);

但结果应该是 6 时是 1(我使用 firefox sqlite3 插件创建的行数)

有人可以帮忙吗?

【问题讨论】:

    标签: php count sqlite


    【解决方案1】:
    $db = new SQLite3('filename.db3');
    $count = $db->querySingle("SELECT COUNT(*) as count FROM tablename");
    echo $count;
    

    【讨论】:

    • 这会计算数据库中的记录数,而不是结果中的行数。
    【解决方案2】:

    来自documentation

    public bool SQLite3::exec (string $query)

    对给定数据库执行无结果查询。

    此方法返回布尔值,而不是结果集。当您将true 转换为整数时,它将变为1

    您应该使用SQLite3::query()。示例(未经测试):

    $rows = $result->query("SELECT COUNT(*) as count FROM USERIDS");
    $row = $rows->fetchArray();
    $numRows = $row['count'];
    

    顺便说一句,将 SQLite3 类的实例命名为 $result 可能会产生误导(尤其是在 DB 环境中)。我会称它为$db$connection

    【讨论】:

    • 应该是 $numRows = $row['COUNT(*)'];
    • @Unplug: 不,因为COUNT(*) 的结果存储在count: COUNT(*) as count
    • querySingle() 也是一个不错的选择:$numRows = $db->querySingle("SELECT COUNT(*) as count FROM USERIDS");
    • 这会计算数据库中的记录数,而不是结果中的数。
    【解决方案3】:
    $result = $db->query("SELECT * FROM db_name")
    $row=$result->fetchArray(SQLITE3_ASSOC);
        // check for empty result
        if ($row != false) {
          // do something here if record exists
        }
    

    【讨论】:

    • 这会检查是否有有效的结果,而不是有多少。
    【解决方案4】:
    <?php
        function SqliteNumRows($query){
            $numRows = 0;
            while($rows = $query->fetchArray()){
                ++$numRows;
            }
            return $numRows;
        }
    ?>
    

    这对我很有帮助,实际上你可以试试

    【讨论】:

      【解决方案5】:

      这是一种获取行数的有效方法,因为sqlite_num_rows($result)$result-&gt;numRows() 都不适用于 SQLite3:

      <?php
           $db = new SQLite3('database.db');
      
          $results = $db->query('SELECT COUNT(*) FROM (SELECT `id`,* FROM `table` ORDER BY `id` ASC);');
              while ($row = $results->fetchArray()) {
                 echo $row["COUNT(*)"];
              }
      ?>
      

      【讨论】:

      • 这会计算数据库中的记录数,而不是结果中的数。
      【解决方案6】:

      当您在计数select 查询中有条件时,这是有好处的:

      $stmt = $db->prepare('SELECT COUNT(*) AS `count` FROM `tablename` WHERE `foo`=:foo');
      $stmt->bindValue(':foo', $foo);
      $stmt->execute();
      $count = $stmt->fetchColumn();
      echo $count;
      

      【讨论】:

      • 这会计算数据库中的记录数,而不是结果中的数。
      • @Joeri 根据WHERE查询中指定的条件,数据库记录数与返回结果一致。
      • @Nabi-k-a-z 否。在获得结果后,您无法知道是否有人添加到数据库中或从数据库中删除。问题是计算结果,而不是计算数据库中的当前数据。
      • @Joeri 从逻辑上讲你是对的,但从技术上讲,发生的事情是一样的,因为计数线是在瞬间发生的。无论您是直接在查询中计算它们还是返回结果并计算它们。它们无关紧要,因为它发生在一个快速的时刻。无论如何,如果你对这个主题很着迷,你可以做一个简单的SELECT查询,然后count()函数查询结果的数量。
      • @Nabi-k-a-z 我并不着迷,我所处的环境不止一个服务可以访问数据库。如果您没有在阻塞事务中获取数据,那么数据可能会在两个查询之间发生变化。希望如此,为什么还要使用数据库。甚至没有提到 2 个查询而不是 1 个查询有多慢。而且,stackoverflow 上的答案应该可以回答这个问题。问题明确提到了结果集,所以从技术上讲你错了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2015-01-07
      • 2019-10-01
      • 2012-05-12
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多