PHP Conference Japan 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(屬性, 選項);

因此,如果我想確保從查詢返回的欄位名稱以資料庫驅動程式返回的大小寫返回(而不是全部以大寫返回 [某些 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