【问题标题】:SELECT COUNT(*) returns an object instead of an integer [duplicate]SELECT COUNT(*) 返回一个对象而不是一个整数
【发布时间】:2019-06-20 02:47:13
【问题描述】:

我有一个数据库表timestamps_sessions,其中包含用户在我的网页上开始练习的时间戳,并且只有在用户实际完成练习时才会更新。因此,每一行在started 列中总是有一个值,但并不总是在finished 列中。后者默认为NULL

当我在 Sequel Pro 中查询时,我的 SELECT COUNT() 语句完美运行,并返回正确的整数 11。也就是说:确实只有 11 行在 startedfinished 中都有值。

然而,当我在 PHP 中执行它时,它返回一个包含

的对象
{
    current_field: null,
    field_count: null,
    lengths: null,
    num_rows: null,
    type: null
}

我在Sequel Pro中查询成功的语句如下:

SELECT COUNT(finished) FROM timestamps_sessions

我在 PHP 中使用失败的语句如下:

$sql = "SELECT COUNT(finished) FROM timestamps_sessions";
$result = $conn->query($sql);
$exercise['clears'] = $result;

还有几个其他SELECT 查询正在对同一个数据库和同一个表执行而没有问题。似乎只有 COUNT() 语句出现故障。

我做错了什么,我应该怎么做?

我的目标是计算具有非空finished 列的行数,而不传递实际数据以保留带宽。我只需要整数。

【问题讨论】:

  • 什么是$conn
  • 在 SELECT 子句中使用类似 total 的别名并访问第一行的 ['total'] 元素。
  • 如果 $conn 是 PDO 对象,请参阅 stackoverflow.com/questions/883365/row-count-with-pdo
  • @MartinHeralecký 这是一个 MySQLi 对象,从问题中提供的对象中的属性可以看出 - num_rows 是 MySQLi 结果属性。

标签: php mysql select mysqli count


【解决方案1】:

首先,$result 是一个符合预期的对象。这是mysqli::query() 方法返回的结果。在您可以访问此查询中的数据之前,您需要获取它。如果您为计数提供别名会更容易,因为访问计数会变得更容易。

$sql = "SELECT COUNT(finished) as cnt FROM timestamps_sessions";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$exercise['clears'] = $row['cnt'];

【讨论】:

    【解决方案2】:

    传递给 count 函数的参数可以是任何值,因为您只需要行数,而不是它们的数据。

    SELECT COUNT(1) FROM timestamps_sessions WHERE finished IS NOT NULL;
    

    【讨论】:

      【解决方案3】:
      $sql = "SELECT COUNT(finished) AS count_finished FROM timestamps_sessions";
      $result = $conn->query($sql);
      $row = $result->fetch_assoc();
      echo $exercise['clears'] = $row['count_finished'];
      

      给计数起一个别名,例如 count_finished。然后从结果对象中您需要获取该行。该行包含您的数据。

      看看这个https://www.w3schools.com/php/php_mysql_select.asp

      【讨论】:

        【解决方案4】:

        您缺少代码 mysql_fetch_array 以获取第一条记录

        $sql = "SELECT COUNT(finished) totals FROM timestamps_sessions";
        $result = $conn->query($sql);
        $row = $result->fetch_assoc();
        
        $total = $row['totals'];
        

        【讨论】:

        • 您不能混合使用 MySQL 和 MySQLi 库。
        • 是的,抱歉,我修好了
        • 另外,当使用面向对象的接口时,fetch_assoc()是在对象上调用的方法,不带任何参数。 :-)
        猜你喜欢
        • 1970-01-01
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 2021-01-11
        • 2015-11-26
        • 1970-01-01
        相关资源
        最近更新 更多