PHP的PDO设置提取模式

wen PHP项目 2

本文目录导读:

PHP的PDO设置提取模式

  1. 在查询前设置默认提取模式
  2. 在执行查询时设置
  3. 在 fetch() 或 fetchAll() 时临时设置
  4. 常用的提取模式
  5. 最佳实践
  6. 注意事项

在 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);
?>

注意事项

  1. 性能建议:除非有特定需求,建议设置全局默认模式,避免每次查询都重复设置。
  2. 模式优先级:在 fetch() 中指定的模式优先级最高,其次是查询时的设置,最后才是全局默认。
  3. 对象模式:使用 FETCH_CLASS 时,可以结合构造函数参数使用 PDO::FETCH_PROPS_LATE

选择哪种设置方式取决于你的项目需求和代码风格,建议在项目初始化时设置全局默认模式,特殊情况再临时覆盖。

抱歉,评论功能暂时关闭!