PHP PDO::setAttribute 方法
最后修改于 2025 年 4 月 19 日
PHP 中的 PDO::setAttribute 方法用于配置数据库连接行为。它允许设置各种控制 PDO 如何操作的属性。
基本定义
PDO::setAttribute 在数据库连接句柄上设置一个属性。属性控制错误处理、大小写敏感性等方面的行为。
语法:PDO::setAttribute(int $attribute, mixed $value): bool。该方法接受一个属性常量及其值,成功时返回 true。
将错误模式设置为异常
此示例展示了如何配置 PDO 在发生错误时抛出异常。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// This will throw an exception if table doesn't exist
$pdo->query('SELECT * FROM non_existent_table');
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
将 PDO::ATTR_ERRMODE 设置为 PDO::ERRMODE_EXCEPTION 会使 PDO 抛出异常。这是开发环境中推荐的错误处理模式。
启用持久连接
此演示了如何启用持久数据库连接。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password', [
PDO::ATTR_PERSISTENT => true
]);
// Or set it after connection
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true);
echo "Using persistent connection";
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
持久连接在脚本执行后保持打开状态,减少了开销。它们可以在构造函数选项中或通过 setAttribute 设置。请谨慎使用。
设置默认获取模式
此示例展示了如何为所有查询设置默认的获取模式。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$stmt = $pdo->query('SELECT * FROM users LIMIT 1');
$user = $stmt->fetch(); // Will use FETCH_ASSOC
print_r($user);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
PDO::ATTR_DEFAULT_FETCH_MODE 设置默认的行获取方式。PDO::FETCH_ASSOC 以关联数组形式返回结果,不包含数字索引。
配置大小写敏感性
此示例演示了控制列名大小写敏感性。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
$stmt = $pdo->query('SELECT firstName FROM users LIMIT 1');
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// Column name will be lowercase
echo $user['firstname'];
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
PDO::ATTR_CASE 将列名强制转换为特定的大小写。PDO::CASE_LOWER 将所有列名转换为小写。PDO::CASE_UPPER 将它们转换为大写。
设置连接超时
此示例展示了如何配置 PDO 的连接超时。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_TIMEOUT, 5);
echo "Connection timeout set to 5 seconds";
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
PDO::ATTR_TIMEOUT 设置连接尝试的超时时间(秒)。并非所有驱动程序都支持此属性。请查阅您的数据库文档。
启用模拟预处理语句
此演示了在 PDO 中启用模拟预处理语句。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([1]);
$user = $stmt->fetch();
print_r($user);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
PDO::ATTR_EMULATE_PREPARES 使 PDO 在 PHP 中模拟预处理语句。这可以提高性能,但对于某些数据库可能不够安全。
设置字符串转换
此示例展示了如何控制字符串转换行为。
<?php
declare(strict_types=1);
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, true);
$stmt = $pdo->query('SELECT id, name FROM users LIMIT 1');
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// All values will be strings
var_dump($user);
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
PDO::ATTR_STRINGIFY_FETCHES 将所有获取的数据转换为字符串。这对于处理需要字符串处理的数字数据很有用。
最佳实践
- 错误处理:为安全起见,请始终设置 ERRMODE_EXCEPTION。
- 持久连接:在高流量应用程序中请谨慎使用。
- 获取模式:设置与您的需求相匹配的默认模式。
- 大小写敏感性:在列名的大小写方面保持一致。
- 超时:为您的环境设置适当的值。
来源
本教程通过实际示例介绍了 PDO::setAttribute 方法。了解这些设置有助于优化 PHP 中的数据库交互。
作者
列出 所有 PHP PDO 函数。