You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中num_rows在SQL Server PDO中的等效函数求解

解决PDO连接SQL Server时获取SELECT结果行数的问题

我明白你现在遇到的困扰——MySQL里的num_rows能直接拿到SELECT的记录数,但换成PDO连SQL Server后,试了两种方法都没得到预期结果,我来帮你理清楚问题出在哪,以及正确的实现方式。

先说说你之前两种方法为什么不对

方法一:fetchColumn()的误区

你用$result->fetchColumn()拿到的是结果集第一行第一列的值,刚好你的查询条件是tms_key='575',结果集的第一列就是tms_key字段,所以返回了575,这完全不是你要的记录行数。

方法二:rowCount()的限制

SQL Server的PDO驱动里,rowCount()对于SELECT语句是不支持返回行数的,它只会返回-1。这个方法本来是用来统计INSERT/UPDATE/DELETE这类操作影响的行数,对SELECT场景并不适用。

正确的两种实现方式

方式1:先执行COUNT(*)查询获取行数,再查数据

这种方法最直接,先单独查一次记录数,再查询实际数据:

// 第一步:获取记录数
$countQuery = "SELECT COUNT(*) FROM tracker WHERE tms_key='575'";
$countStmt = $conn->query($countQuery);
$count = $countStmt->fetchColumn();
echo '$count: '.$count.'<br>';

// 第二步:获取实际数据并遍历
$dataQuery = "SELECT * FROM tracker WHERE tms_key='575'";
$result = $conn->query($dataQuery);
foreach ($result as $row) {
    echo $row['cucm_tmsDeviceName'] . '<br>';
}

注意:如果你的表在两次查询之间有数据插入/删除,行数和实际数据可能会有微小差异,但大部分业务场景下这个问题可以忽略。

方式2:一次性获取所有数据到数组,再用count()统计

如果不想执行两次SQL,可以把结果集全部读取到数组里,然后用PHP的count()函数获取数组长度,同时遍历这个数组:

$sql = "SELECT * FROM tracker WHERE tms_key='575'";
$result = $conn->query($sql);
// 把结果集转为关联数组
$rows = $result->fetchAll(PDO::FETCH_ASSOC);
// 统计行数
$count = count($rows);
echo '$count: '.$count.'<br>';

// 遍历数据
foreach ($rows as $row) {
    echo $row['cucm_tmsDeviceName'] . '<br>';
}

这种方法更适合数据量不大的场景,能避免两次查询的开销。

内容的提问来源于stack exchange,提问作者jamesMcKey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:27:45