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
相关产品推荐
相关产品推荐

