本文目录导读:

在 PHP 的 PDO 中,设置提取模式(Fetch Mode)主要有三种方式,以下是详细的说明和示例:
在查询前设置默认提取模式
使用 PDO::setAttribute() 设置全局默认的提取模式:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 设置默认提取模式为关联数组
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// 之后的查询都会使用该模式
$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch()) {
print_r($row); // 输出关联数组
}
?>
在执行查询时设置
在 query() 或 prepare() 执行时指定提取模式:
<?php
// 使用 query 方法直接设置
$stmt = $pdo->query('SELECT * FROM users', PDO::FETCH_ASSOC);
// 使用 prepare + execute 方法
$stmt = $pdo->prepare('SELECT * FROM users');
$stmt->execute();
// 设置提取模式(如果已经执行,可以使用 setFetchMode)
$stmt->setFetchMode(PDO::FETCH_ASSOC);
?>
在 fetch() 或 fetchAll() 时临时设置
每次提取时临时指定模式,不影响其他查询:
<?php
$stmt = $pdo->query('SELECT * FROM users');
// 在 fetch 时指定
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// 处理数据
}
// 或者在 fetchAll 时指定
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
常用的提取模式
PDO::FETCH_ASSOC - 关联数组
<?php
$stmt = $pdo->query('SELECT id, name FROM users');
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// $row = ['id' => 1, 'name' => '张三']
?>
PDO::FETCH_NUM - 数字索引数组
<?php
$stmt = $pdo->query('SELECT id, name FROM users');
$row = $stmt->fetch(PDO::FETCH_NUM);
// $row = [0 => 1, 1 => '张三']
?>
PDO::FETCH_BOTH - 同时包含关联和数字索引
<?php
$stmt = $pdo->query('SELECT id, name FROM users');
$row = $stmt->fetch(PDO::FETCH_BOTH);
// $row = ['id' => 1, 0 => 1, 'name' => '张三', 1 => '张三']
?>
PDO::FETCH_OBJ - 对象
<?php
$stmt = $pdo->query('SELECT id, name FROM users');
$row = $stmt->fetch(PDO::FETCH_OBJ);
// $row = object(stdClass) { id: 1, name: '张三' }
?>
PDO::FETCH_CLASS - 指定类的对象
<?php
class User {
public $id;
public $name;
}
$stmt = $pdo->query('SELECT id, name FROM users');
$user = $stmt->fetchObject('User'); // 或者设置 FETCH_CLASS
// $user = object(User) { id: 1, name: '张三' }
?>
PDO::FETCH_KEY_PAIR - 键值对
<?php
$stmt = $pdo->query('SELECT id, name FROM users');
$users = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
// $users = [1 => '张三', 2 => '李四', ...]
?>
最佳实践
设置全局默认模式
<?php
try {
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 设置全局默认提取模式
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 业务代码
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([1]);
$user = $stmt->fetch();
} catch (PDOException $e) {
echo '连接失败: ' . $e->getMessage();
}
?>
结合使用不同的模式
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
// 单条记录使用对象
$stmt = $pdo->query('SELECT * FROM users LIMIT 1');
$user = $stmt->fetch(PDO::FETCH_OBJ);
// 多条记录使用关联数组
$stmt = $pdo->query('SELECT * FROM users');
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 获取某列的数组
$stmt = $pdo->query('SELECT name FROM users');
$names = $stmt->fetchAll(PDO::FETCH_COLUMN);
?>
注意事项
- 性能建议:除非有特定需求,建议设置全局默认模式,避免每次查询都重复设置。
- 模式优先级:在 fetch() 中指定的模式优先级最高,其次是查询时的设置,最后才是全局默认。
- 对象模式:使用
FETCH_CLASS时,可以结合构造函数参数使用PDO::FETCH_PROPS_LATE。
选择哪种设置方式取决于你的项目需求和代码风格,建议在项目初始化时设置全局默认模式,特殊情况再临时覆盖。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播