您好!欢迎访问家园网-www.jy.wang!

家园网

15个核心PDO预定义常量的完整说明及实用示例,采用技术文档规范格式呈现

网络 作者:本站 点击:

以下是15个核心PDO预定义常量的完整说明及实用示例,采用技术文档规范格式呈现:


1. ‌PDO::PARAM_BOOL

布尔类型参数绑定常量

// 用户状态切换
$stmt = $db->prepare("UPDATE users SET is_active=? WHERE id=?");
$stmt->bindValue(1, true, PDO::PARAM_BOOL); // 显式声明布尔类型
$stmt->bindValue(2, 1001, PDO::PARAM_INT);
$stmt->execute();

2. ‌PDO::PARAM_NULL

NULL值绑定常量

// 清空用户邮箱
$stmt = $db->prepare("UPDATE contacts SET email=? WHERE user_id=?");
$stmt->bindValue(1, null, PDO::PARAM_NULL); // 明确传递NULL值
$stmt->bindValue(2, 2002, PDO::PARAM_INT);
$db->beginTransaction();
$stmt->execute();
$db->commit();

3. ‌PDO::PARAM_LOB

二进制大对象处理常量

// PDF文件存储
$pdfData = file_get_contents('contract.pdf');
$stmt = $db->prepare("INSERT INTO documents (title, file_data) VALUES (?, ?)");
$stmt->bindValue(1, "年度合同");
$stmt->bindValue(2, $pdfData, PDO::PARAM_LOB); // 处理二进制数据
$stmt->execute();

4. ‌PDO::PARAM_INPUT_OUTPUT

存储过程INOUT参数常量

// 调用账户余额调整存储过程
$balance = 500;
$stmt = $db->prepare("CALL adjust_balance(?, ?)");
$stmt->bindParam(1, $userId, PDO::PARAM_INT);
$stmt->bindParam(2, $balance, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);
$stmt->execute();
echo "最新余额:".$balance; // 获取存储过程修改后的值

5. ‌PDO::FETCH_LAZY

延迟加载获取模式

// 大数据量内存优化
$stmt = $db->query("SELECT * FROM sensor_readings");
while ($obj = $stmt->fetch(PDO::FETCH_LAZY)) {
    // 按需访问字段,减少内存占用
    echo $obj->sensor_id . ": " . $obj->value;
}

6. ‌PDO::FETCH_NAMED

同名列数组获取模式

// 处理含同名列的联合查询
$stmt = $db->query("
    SELECT 'user' as type, id, name FROM users 
    UNION SELECT 'admin', id, name FROM admins
");
$stmt->setFetchMode(PDO::FETCH_NAMED);
foreach ($stmt as $row) {
    print_r($row['name']); // 返回数组形式的值集合
}

7. ‌PDO::FETCH_CLASSTYPE

动态类实例化模式

// 多态数据映射
class User { public function role() { return '普通用户'; } }
class Admin { public function role() { return '管理员'; } }
$stmt = $db->query("
    SELECT 'Admin' as class_type, id, name FROM admins 
    UNION SELECT 'User', id, name FROM users
");
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_CLASSTYPE);
while ($obj = $stmt->fetch()) {
    echo $obj->name . " - " . $obj->role();
}

8. ‌PDO::FETCH_PROPS_LATE

延迟属性赋值模式

// 构造函数优先执行
class Product {
    public function __construct() {
        $this->created_at = date('Y-m-d');
    }
}
$stmt = $db->query("SELECT name, price FROM products");
$stmt->setFetchMode(
    PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 
    'Product'
);
while ($product = $stmt->fetch()) {
    echo $product->name . " 创建于 " . $product->created_at;
}

9. ‌PDO::ATTR_PREFETCH

预取缓冲区设置

// 优化大数据查询
$db->setAttribute(PDO::ATTR_PREFETCH, 1000); // 设置每次预取1000行
$stmt = $db->query("SELECT * FROM historical_data");
while ($row = $stmt->fetch()) {
    process_data($row); // 减少网络往返次数
}

10. ‌PDO::FETCH_SERIALIZE

对象序列化模式

// 分布式缓存场景
class User implements Serializable {
    public function serialize() { return serialize($this); }
    public function unserialize($data) { /*...*/ }
}
$stmt = $db->prepare("SELECT * FROM users WHERE id=?");
$stmt->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_SERIALIZE, 'User');
$stmt->execute([3003]);
$user = $stmt->fetch();
file_put_contents('cache.dat', $user);

11. ‌PDO::FETCH_KEY_PAIR

键值对获取模式

// 生成下拉菜单选项
$stmt = $db->query("SELECT id, username FROM users");
$options = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
echo "<select name='user'>";
foreach ($options as $id => $name) {
    echo "<option value='$id'>$name</option>";
}
echo "</select>";

12. ‌PDO::FETCH_FUNC

自定义处理函数模式

// 数据格式化处理
function formatOrder($id, $amount, $date) {
    return sprintf("订单#%05d | 金额: ¥%.2f | 日期: %s", 
        $id, $amount, date('Y/m/d', strtotime($date)));
}
$stmt = $db->query("SELECT id, amount, create_time FROM orders");
$results = $stmt->fetchAll(PDO::FETCH_FUNC, 'formatOrder');
print_r($results);

13. ‌PDO::ATTR_STRINGIFY_FETCHES

强制字符串转换属性

// 兼容旧系统数字处理
$db->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$stmt = $db->query("SELECT id, price FROM products");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    // 所有字段值强制转为字符串
    var_dump($row['price']); // string(6) "199.99"
}

14. ‌PDO::FETCH_INTO

对象属性更新模式

// 增量更新对象
class Customer {
    public $id, $name, $balance;
}
$customer = new Customer();
$customer->id = 4004;
$stmt = $db->prepare("SELECT name, balance FROM accounts WHERE id=?");
$stmt->setFetchMode(PDO::FETCH_INTO, $customer);
$stmt->execute([$customer->id]);
$stmt->fetch(); // 自动更新$customer对象的name和balance属性

15. ‌PDO::FETCH_UNIQUE

唯一行获取模式

// 防止重复数据
$stmt = $db->query("SELECT category, item_name FROM inventory");
$results = $stmt->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC);
/*
结果格式:
[
    '电子产品' => ['item_name' => '手机'],
    '食品' => ['item_name' => '面包']
]
*/

常量应用特点总结:

  1. 类型安全‌:PARAM_* 系列确保数据边界检查

  2. 内存优化‌:FETCH_LAZY等模式降低资源消耗

  3. OOP集成‌:类映射相关常量简化ORM实现

  4. 特殊场景‌:二进制数据、存储过程等专业处理

  5. 性能调优‌:预取缓冲区等属性提升查询效率


标签: