如何基于num_rows使用PDO展示内容?解析PDO与mysqli的差异
在PDO中实现基于行数展示内容的功能
确实,PDO里和行数相关的机制跟mysqli差别不小,我结合你的需求给你两种靠谱的实现方式,你可以根据场景选择:
方法一:获取结果集后统计行数(通用兼容所有数据库)
这种方法不管你用什么数据库驱动都能正常工作,是最稳妥的方案。思路是先把查询结果全部取出来,再用PHP的count()函数统计行数:
<?php // PDO连接数据库 $dsn = 'mysql:host=127.0.0.1;dbname=mydbname;charset=utf8mb4'; $username = 'root'; $password = 'mypassword'; try { $pdo = new PDO($dsn, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch(PDOException $e) { die("Sorry, could not connect: " . $e->getMessage()); } $id = 1; $qry = "SELECT * FROM customers WHERE id = ?"; $stmt = $pdo->prepare($qry); // PDO绑定参数的方式,直接把参数数组传给execute更简洁 $stmt->execute([$id]); // 获取所有结果行 $customers = $stmt->fetchAll(PDO::FETCH_ASSOC); // 统计行数 $count = count($customers); // 后续逻辑示例:根据行数展示内容 if ($count > 0) { foreach ($customers as $customer) { echo "客户ID:" . $customer['id'] . ",姓名:" . $customer['name'] . "<br>"; } } else { echo "没有找到匹配的客户"; } ?>
方法二:使用rowCount()(仅部分数据库支持,比如MySQL)
PDO的rowCount()方法可以直接返回受影响的行数,对于MySQL的SELECT语句,它也能返回查询到的行数,但要注意:不是所有数据库驱动都支持用rowCount()获取SELECT的结果行数(比如PostgreSQL就不行)。如果你的项目只针对MySQL,这种方法更高效(不用一次性取出所有行):
<?php // 连接部分和上面一致,省略... $id = 1; $qry = "SELECT * FROM customers WHERE id = ?"; $stmt = $pdo->prepare($qry); $stmt->execute([$id]); // 直接获取行数 $count = $stmt->rowCount(); // 如果需要获取具体数据,再执行fetch/fetchAll if ($count > 0) { $customer = $stmt->fetch(PDO::FETCH_ASSOC); echo "客户ID:" . $customer['id'] . ",姓名:" . $customer['name']; } else { echo "没有找到匹配的客户"; } ?>
小提示
- 如果你只是想判断有没有结果,其实不用统计行数,直接用
$stmt->fetch()试试,如果返回false就是没有数据,这样更高效。 - PDO的错误处理建议用异常模式(就是代码里的
PDO::ERRMODE_EXCEPTION),比mysqli的手动判断错误更省心。
内容的提问来源于stack exchange,提问作者Hayden
相关产品推荐
相关产品推荐

