PHP 日本大会 2024

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
抛出PDOException
PDO::ATTR_ORACLE_NULLS

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

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

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

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

PDO::ATTR_STATEMENT_CLASS

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

警告

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

PDO::ATTR_TIMEOUT

指定超时持续时间(秒)。取int类型的值。

注意:

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

PDO::ATTR_AUTOCOMMIT

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

是否为每个语句自动提交。取bool类型的值:true启用,false禁用。默认值为true

PDO::ATTR_EMULATE_PREPARES

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

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

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY

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

是否使用缓冲查询。取bool类型的值:true启用,false禁用。默认值为true

PDO::ATTR_DEFAULT_FETCH_MODE

设置默认提取模式。PDOStatement::fetch()文档中提供了模式的描述以及如何使用它们。

参数

attribute

要修改的属性。

value

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

返回值

成功时返回true,失败时返回false

参见

添加注释

用户贡献的注释 8 条注释

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
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 {
// 将选项作为连接字符串的最后一个参数传递
$connection = new PDO("mysql:host=$host; dbname=$dbname", $user, $password, $options);

// 这就是设置多个属性的方法
} catch(PDOException $e) {
die(
"数据库连接失败: " . $e->getMessage());
}
?>
gregory dot szorc at gmail dot com
17 年前
值得注意的是,并非所有属性都可以通过 setAttribute() 设置。例如,PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 只能在 PDO::__construct() 中设置。您必须将 PDO::MYSQL_ATTR_MAX_BUFFER_SIZE 作为构造函数可选的第四个参数的一部分传递。详情请参见 http://bugs.php.net/bug.php?id=38015
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());
}

我希望这对某些人有所帮助。 :)
匿名
3年前
请注意,与大多数 PDO 方法相反,当 setAttribute 返回 false 时,它不会抛出 PDOException。
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() 实际上确实接受整数值。
antoyo
13年前
还有一种方法可以指定默认的提取模式
<?php
$connection
= new PDO($connection_string);
$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
?>
david at datava dot com
7个月前
请注意,为了使
\PDO::ATTR_TIMEOUT
生效,您必须设置

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

如果

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

它似乎没有任何作用。
To Top