PDO::setAttribute

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)

PDO::setAttribute 设置属性

说明

public PDO::setAttribute(int $attribute, mixed $value): bool

在数据库句柄上设置一个属性。一些可用的通用属性列在下面;一些驱动程序可能使用额外的驱动程序特定属性。请注意,驱动程序特定属性 *不能* 与其他驱动程序一起使用。

PDO::ATTR_CASE

强制列名转换为特定大小写。可以取以下值之一

PDO::CASE_LOWER
强制列名转换为小写。
PDO::CASE_NATURAL
保留数据库驱动程序返回的列名。
PDO::CASE_UPPER
强制列名转换为大写。
PDO::ATTR_ERRMODE

PDO 的错误报告模式。可以取以下值之一

PDO::ERRMODE_SILENT
仅设置错误代码。
PDO::ERRMODE_WARNING
引发 E_WARNING 诊断信息。
PDO::ERRMODE_EXCEPTION
抛出 PDOExceptions。
PDO::ATTR_ORACLE_NULLS

注意: 此属性适用于所有驱动程序,而不仅仅是 Oracle。

确定是否以及如何转换 null 和空字符串。可以取以下值之一

PDO::NULL_NATURAL
不进行转换。
PDO::NULL_EMPTY_STRING
空字符串转换为 null
PDO::NULL_TO_STRING
null 转换为空字符串。
PDO::ATTR_STRINGIFY_FETCHES

是否在获取时将数字值转换为字符串。采用 bool 类型的 value:true 启用,false 禁用。

PDO::ATTR_STATEMENT_CLASS

设置从 PDOStatement 派生的用户提供的语句类。需要 array(string classname, array(mixed constructor_args))

注意

不能与持久 PDO 实例一起使用。

PDO::ATTR_TIMEOUT

指定超时持续时间(以秒为单位)。采用 int 类型的 value。

注意:

并非所有驱动程序都支持此选项,并且其含义可能因驱动程序而异。例如,SQLite 会等待最多此时间值,然后放弃获取可写锁,但其他驱动程序可能会将其解释为连接或读取超时间隔。

PDO::ATTR_AUTOCOMMIT

注意: 仅适用于 OCI、Firebird 和 MySQL 驱动程序。

是否自动提交每个语句。采用 bool 类型的 value:true 启用,false 禁用。默认情况下,为 true

PDO::ATTR_EMULATE_PREPARES

注意: 仅适用于 OCI、Firebird 和 MySQL 驱动程序。

是否启用或禁用准备语句的模拟。一些驱动程序不支持原生准备语句,或者对它们的支持有限。如果设置为 true,PDO 将始终模拟准备语句,否则 PDO 将尝试使用原生准备语句。如果驱动程序无法成功准备当前查询,PDO 将始终回退到模拟准备语句。

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

注意: 仅适用于 MySQL 驱动程序。

是否使用缓冲查询。采用 bool 类型的 value:true 启用,false 禁用。默认情况下,为 true

PDO::ATTR_DEFAULT_FETCH_MODE

设置默认获取模式。有关模式的说明以及如何使用它们,请参见 PDOStatement::fetch() 文档。

参数

attribute

要修改的属性。

value

要设置 attribute 的值,可能需要根据属性需要特定类型。

返回值

成功返回 true,失败返回 false

参见

添加注释

用户贡献的注释 13 个注释

124
colinganderson [at] gmail [dot] com
17 年前
由于没有提供示例,为了消除由此产生的任何混淆,setAttribute() 方法的调用方式如下

setAttribute(ATTRIBUTE, OPTION);

因此,如果我想确保从查询返回的列名以数据库驱动程序返回的大小写返回(而不是以全部大写返回 [这是某些 PDO 扩展的默认值]),我会执行以下操作

<?php
// 创建一个新的数据库连接。
$dbConnection = new PDO($dsn, $user, $pass);

// 设置返回 column_names 的大小写。
$dbConnection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
?>

希望这对一些通过示例学习的人有所帮助(就像我一样)。

.Colin
30
yeboahnanaosei at gmail dot com
6 年前
这是我对之前写的一个关于如何在创建 PDO 连接字符串时设置多个属性的注释的更新。

你可以将你想要的属性都放在一个关联数组中,并将该数组作为连接字符串的第四个参数传递。因此,它看起来像这样
<?php
$options
= [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING
];

// 现在你创建你的连接字符串
try {
// 然后将 options 作为连接字符串中的最后一个参数传递
$connection = new PDO("mysql:host=$host; dbname=$dbname", $user, $password, $options);

// 这就是设置多个属性的方法
} catch(PDOException $e) {
die(
"Database connection failed: " . $e->getMessage());
}
?>
18
gregory dot szorc at gmail dot com
17 年前
值得注意的是,并非所有属性都可以在 setAttribute() 中设置。例如,PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 只能在 PDO::__construct() 中设置。您必须将 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 作为构造函数可选的第 4 个参数的一部分传递。这在 http://bugs.php.net/bug.php?id=38015 中有详细说明。
15
yeboahnanaosei at gmail dot com
7 年前
嗯,我还没有在任何地方看到它被提及,并且认为值得一提。这可能对某人有所帮助。如果您想知道是否可以设置多个属性,那么答案是肯定的。

您可以像这样进行
try {
$connection = new PDO("mysql:host=$host; dbname=$dbname", $user, $password);
// 您现在可以开始设置您想要的所有属性。
$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$connection->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);
$connection->setAttribute(PDO::ATTR_ORACLE_NULLS, PDO::NULL_EMPTY_STRING);

// 这就是您可以设置多个属性的方式
}
catch(PDOException $e)
{
die("数据库连接失败: " . $e->getMessage());
}

希望这能帮助到某人。 :)
1
Anonymous
2 年前
请注意,与大多数 PDO 方法相反,setAttribute 在返回 false 时不会抛出 PDOException。
5
steve at websmithery dot co dot uk
7 年前
对于 PDO::ATTR_EMULATE_PREPARES,手册指出需要布尔值。但是,当使用 getAttribute() 检查此值时,返回的是整数(1 或 0)而不是 true 或 false。

这意味着,如果您正在检查 PDO 对象是否按要求配置,那么

<?php
// 检查是否关闭模拟准备
if ($pdo->getAttribute(\PDO::ATTR_EMULATE_PREPARES) !== false) {
/* 执行某些操作 */
}
?>

将始终“执行某些操作”,无论如何。

要么

<?php
// 检查是否关闭模拟准备
if ($pdo->getAttribute(\PDO::ATTR_EMULATE_PREPARES) != false) {
/* 执行某些操作 */
}
?>



<?php
// 检查是否关闭模拟准备
if ($pdo->getAttribute(\PDO::ATTR_EMULATE_PREPARES) !== 0) {
/* 执行某些操作 */
}
?>

是必要的。

还需要注意的是,如果您希望保持一致性,setAttribute() 实际上确实接受一个整数值。
11
antoyo
13 年前
还有一种方法可以指定默认的提取模式
<?php
$connection
= new PDO($connection_string);
$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
?>
0
david at datava dot com
3 个月前
请注意,为了使
\PDO::ATTR_TIMEOUT
生效,您必须设置

\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_EXCEPTION。

如果

\PDO::ATTR_ERRMODE=>\PDO::ERRMODE_WARNING

它似乎什么也没做。
-4
rob51 at mac dot com
5 年前
我在哪里可以找到属性的默认值?
-6
guillaume at thug dot com
6 年前
function pdo_connect(){
try {

$pdo = new PDO('mysql:host=localhost;dbname='.DB_NAME, DB_USER, DB_PASS);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

} catch (PDOException $e) {

die("错误!: " . $e->getMessage() . "<br/>");

}

return $pdo;
}
-8
justinasu at gmail dot com
8 年前
在 v5.5 中,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 只能在 PDO 构造函数中设置,不能通过将其传递给 setAttribute 来设置。
如果您使用 setAttribute 设置它,它将不起作用。getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY) 将返回 0。
-10
vstoykov at proab dot info
6 年前
我正在 GoDaddy 上使用 PHP 5.6 和 MySQL 5.0。
当执行这样的查询时
<?php
$stmt
= $this->PDO->query("SHOW CREATE TABLE table");
?>
我得到
未捕获的异常“PDOException”,消息为
“SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yet”
在我添加了之后
<?php
$this
->PDO->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
?>
该查询成功执行。
-15
m dot leuffen at gmx dot de
18 年前
您好,

如果您想知道升级到 PHP5.1.4 后关于 blob 和文本字段的大小限制(1 MB)。您可以尝试使用 setAttribute() 方法来增加此限制。

这将失败。相反,在实例化 pdo 时使用选项数组

$pdo = new PDO ("connection_settings", "user", "pass", array
(PDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>1024*1024*50));

这应该可以解决问题,并将限制增加到 50 MB。

再见,
马蒂亚斯
To Top