以下是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' => '面包']
]
*/常量应用特点总结:
类型安全:PARAM_* 系列确保数据边界检查
内存优化:FETCH_LAZY等模式降低资源消耗
OOP集成:类映射相关常量简化ORM实现
特殊场景:二进制数据、存储过程等专业处理
性能调优:预取缓冲区等属性提升查询效率