PHP PDOStatement::getAttribute 方法
最后修改于 2025 年 4 月 19 日
PDOStatement::getAttribute 方法检索一个语句属性值。它提供了对预处理语句配置的元数据访问。
基本定义
PDOStatement::getAttribute 获取语句级别的属性值。这些属性控制语句在执行期间的行为。
语法:public PDOStatement::getAttribute(int $attribute): mixed。该方法接受一个属性常量并返回其当前值。
获取默认的 fetch 模式
本示例展示了如何检索语句的当前 fetch 模式。
<?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_* 常量之一。示例显示了常见的模式值。
检查语句错误模式
本示例演示了如何检查语句的错误处理模式。
<?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 之一。
获取游标类型
本示例检索为语句配置的游标类型。
<?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。
检查语句字符串化
本示例展示了如何检查语句是否将数字值转换为字符串。
<?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。
获取语句超时
本示例检索语句执行的超时设置。
<?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。
检查模拟预处理
此代码检查语句是否使用模拟预处理语句。
<?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();
}
此代码确定驱动程序是模拟预处理语句还是使用本机预处理语句。对于缺少本机支持的驱动程序,可能会使用模拟。
获取特定于驱动程序的属性
本示例演示了如何检索特定于驱动程序的语句属性。
<?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();
}
此代码展示了如何获取特定于驱动程序的属性。首先检查驱动程序名称,然后请求特定于驱动程序的属性。每个驱动程序都有自己的常量。
最佳实践
- 检查支持:使用您的驱动程序验证属性支持。
- 错误处理:始终处理潜在的 PDO 异常。
- 文档:查阅驱动程序文档以获取特定属性。
- 性能:某些属性会对性能产生显著影响。
- 默认值:了解您的驱动程序的默认设置。
来源
PHP PDOStatement::getAttribute 文档
本教程介绍了 PDOStatement::getAttribute 方法,并提供了实际示例,演示了如何检索各种语句属性。
作者
列出 所有 PHP PDO 函数。