php pdo查询结果获取方式取决于查询类型:select用fetch()/fetchall(),insert/update/delete用rowcount(),单值用fetchcolumn(),流式处理可用bindcolumn()。

PHP PDO 查询结果获取方式主要取决于查询类型和数据处理需求,核心在于选择合适的 fetch 方法和设置正确的 fetch mode。
SELECT 查询:用 fetch() 或 fetchAll() 获取数据
执行 SELECT 语句后,需调用 fetch()(逐行取)或 fetchAll()(一次性取全部)来获取结果集。注意:PDOStatement 对象本身不直接包含数据,必须显式调用获取方法。
- fetch() 返回当前行并自动移到下一行,适合循环遍历大结果集,内存占用低
- fetchAll() 返回包含所有行的数组,默认是数字索引+关联索引混合(PDO::FETCH_BOTH),适合小数据量快速处理
- 可指定 fetch mode,如
PDO::FETCH_ASSOC(仅关联键)、PDO::FETCH_NUM(仅数字键)、PDO::FETCH_OBJ(返回 StdClass 对象)
INSERT/UPDATE/DELETE:用 rowCount() 判断影响行数
非查询类语句不返回结果集,不能用 fetch 系列方法。应使用 rowCount() 获取被插入、更新或删除的记录数量。
- 执行成功后
$stmt->rowCount()返回受影响行数(可能为 0) - 注意:某些数据库(如 MySQL)在无匹配 WHERE 条件时,UPDATE/DELETE 返回 0;而有些驱动可能返回 -1(需检查 PDO::ATTR_EMULATE_PREPARES 设置)
- 不建议用 rowCount() 判断 INSERT 是否成功,应结合异常捕获或 lastInsertId()(对自增主键)
获取单个值或单列:用 fetchColumn()
当只需要一个字段的一个值(如 COUNT(*)、MAX(id)、用户名等),fetchColumn() 最简洁高效。
立即学习“PHP免费学习笔记(深入)”;
- 默认取第一列(索引 0),也可传入列号(如
fetchColumn(1)) - 只返回标量值,不构建数组或对象,性能开销最小
- 注意:它也移动内部指针,重复调用会取下一行同列值;若只要一个值,执行一次即可
绑定结果到变量:用 bindColumn()(较少用但适合流式处理)
bindColumn() 将结果集中的列直接绑定到 PHP 变量,每次 fetch() 时自动更新变量值,适合处理超大数据集且需逐行加工的场景。
- 需在 execute() 后、fetch() 前调用,例如:
$stmt->bindColumn('name', $name); - 支持按列名或列序号绑定,列名区分大小写(依数据库实际返回为准)
- 实际项目中较少使用,多数情况用 fetch() + 关联数组更直观,但批量导出或日志处理时有优势
不复杂但容易忽略:fetch 方法必须在 execute() 之后调用;未执行就 fetch 会返回 false 或空;开启异常模式(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)能及时暴露错误。











