SELECT COUNT(*) 返回一个对象而不是一个整数

Posted

技术标签:

【中文标题】SELECT COUNT(*) 返回一个对象而不是一个整数【英文标题】:SELECT COUNT(*) returns an object instead of an integer [duplicate] 【发布时间】: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 对象,请参阅 ***.com/questions/883365/row-count-with-pdo @MartinHeralecký 这是一个 mysqli 对象,从问题中提供的对象中的属性可以看出 - num_rows 是 MySQLi 结果属性。 【参考方案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'];
mysqli::query() docs mysqli::fetch_assoc() docs

【讨论】:

【参考方案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()是在对象上调用的方法,不带任何参数。 :-)

以上是关于SELECT COUNT(*) 返回一个对象而不是一个整数的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine queryBuilder:返回对象而不是数组

面试总结 mysql中的select count

select count和 select count(*)

c#连接mysql数据库以后 怎么的获取select语句返回的值而不是影响的条数 需要用啥样的代码写

COUNT(*) 在配置单元中返回多行而不是一

Linq选择返回字符串而不是对象