ZetCode

PHP PDOStatement::getAttribute 方法

最后修改于 2025 年 4 月 19 日

PDOStatement::getAttribute 方法检索一个语句属性值。它提供了对预处理语句配置的元数据访问。

基本定义

PDOStatement::getAttribute 获取语句级别的属性值。这些属性控制语句在执行期间的行为。

语法:public PDOStatement::getAttribute(int $attribute): mixed。该方法接受一个属性常量并返回其当前值。

获取默认的 fetch 模式

本示例展示了如何检索语句的当前 fetch 模式。

get_fetch_mode.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM users');
    
    $fetchMode = $stmt->getAttribute(PDO::ATTR_DEFAULT_FETCH_MODE);
    echo "Default fetch mode: " . $fetchMode;
    
    // Common fetch mode values:
    // PDO::FETCH_ASSOC = 2
    // PDO::FETCH_BOTH = 4
    // PDO::FETCH_OBJ = 5
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码检索语句上设置的默认 fetch 模式。该值将匹配 PDO 的 FETCH_* 常量之一。示例显示了常见的模式值。

检查语句错误模式

本示例演示了如何检查语句的错误处理模式。

get_error_mode.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM users');
    
    $errorMode = $stmt->getAttribute(PDO::ATTR_ERRMODE);
    
    if ($errorMode === PDO::ERRMODE_EXCEPTION) {
        echo "Statement is set to throw exceptions on errors";
    } elseif ($errorMode === PDO::ERRMODE_WARNING) {
        echo "Statement will generate warnings on errors";
    } else {
        echo "Statement will silently ignore errors";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码检查语句如何处理错误。该值将是 PDO::ERRMODE_SILENT、PDO::ERRMODE_WARNING 或 PDO::ERRMODE_EXCEPTION 之一。

获取游标类型

本示例检索为语句配置的游标类型。

get_cursor_type.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM users');
    
    $cursorType = $stmt->getAttribute(PDO::ATTR_CURSOR);
    
    if ($cursorType === PDO::CURSOR_FWDONLY) {
        echo "Forward-only cursor (default)";
    } elseif ($cursorType === PDO::CURSOR_SCROLL) {
        echo "Scrollable cursor";
    } else {
        echo "Unknown cursor type: " . $cursorType;
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码检查语句是使用仅向前游标还是可滚动游标。大多数驱动程序为了更好的性能,默认使用 PDO::CURSOR_FWDONLY。

检查语句字符串化

本示例展示了如何检查语句是否将数字值转换为字符串。

get_stringify.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM products WHERE price > :price');
    
    $stringify = $stmt->getAttribute(PDO::ATTR_STRINGIFY_FETCHES);
    
    echo "Stringify fetches: " . ($stringify ? 'ON' : 'OFF');
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码检查在 fetch 时是否将数字值转换为字符串。PDO::ATTR_STRINGIFY_FETCHES 控制此行为。它通常默认为 false。

获取语句超时

本示例检索语句执行的超时设置。

get_timeout.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM large_table');
    
    $timeout = $stmt->getAttribute(PDO::ATTR_TIMEOUT);
    
    if ($timeout === false) {
        echo "Timeout not supported by driver";
    } else {
        echo "Statement timeout: " . $timeout . " seconds";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码以秒为单位获取语句执行超时。某些驱动程序可能不支持超时,在这种情况下,该方法返回 false。

检查模拟预处理

此代码检查语句是否使用模拟预处理语句。

get_emulate_prepares.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
    
    $emulated = $stmt->getAttribute(PDO::ATTR_EMULATE_PREPARES);
    
    echo "Prepared statements are " . ($emulated ? "emulated" : "native");
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码确定驱动程序是模拟预处理语句还是使用本机预处理语句。对于缺少本机支持的驱动程序,可能会使用模拟。

获取特定于驱动程序的属性

本示例演示了如何检索特定于驱动程序的语句属性。

get_driver_attributes.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM users');
    
    // MySQL-specific attribute
    if ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'mysql') {
        $bufferSize = $stmt->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);
        echo "Buffered query: " . ($bufferSize ? 'ON' : 'OFF');
    }
    
    // SQLite-specific attribute
    if ($pdo->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite') {
        $busyTimeout = $stmt->getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT);
        echo "SQLite busy timeout: " . $busyTimeout;
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此代码展示了如何获取特定于驱动程序的属性。首先检查驱动程序名称,然后请求特定于驱动程序的属性。每个驱动程序都有自己的常量。

最佳实践

来源

PHP PDOStatement::getAttribute 文档

本教程介绍了 PDOStatement::getAttribute 方法,并提供了实际示例,演示了如何检索各种语句属性。

作者

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

列出 所有 PHP PDO 函数