ZetCode

PHP PDO::setAttribute 方法

最后修改于 2025 年 4 月 19 日

PHP 中的 PDO::setAttribute 方法用于配置数据库连接行为。它允许设置各种控制 PDO 如何操作的属性。

基本定义

PDO::setAttribute 在数据库连接句柄上设置一个属性。属性控制错误处理、大小写敏感性等方面的行为。

语法:PDO::setAttribute(int $attribute, mixed $value): bool。该方法接受一个属性常量及其值,成功时返回 true。

将错误模式设置为异常

此示例展示了如何配置 PDO 在发生错误时抛出异常。

set_error_mode.php
<?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 抛出异常。这是开发环境中推荐的错误处理模式。

启用持久连接

此演示了如何启用持久数据库连接。

persistent_connection.php
<?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 设置。请谨慎使用。

设置默认获取模式

此示例展示了如何为所有查询设置默认的获取模式。

default_fetch_mode.php
<?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 以关联数组形式返回结果,不包含数字索引。

配置大小写敏感性

此示例演示了控制列名大小写敏感性。

case_sensitivity.php
<?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 的连接超时。

connection_timeout.php
<?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 中启用模拟预处理语句。

emulated_prepared.php
<?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 中模拟预处理语句。这可以提高性能,但对于某些数据库可能不够安全。

设置字符串转换

此示例展示了如何控制字符串转换行为。

string_conversion.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 将所有获取的数据转换为字符串。这对于处理需要字符串处理的数字数据很有用。

最佳实践

来源

PHP PDO::setAttribute 文档

本教程通过实际示例介绍了 PDO::setAttribute 方法。了解这些设置有助于优化 PHP 中的数据库交互。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 PHP PDO 函数