需要注意的是,PDO::FETCH_CLASS 會在設定值(或呼叫 __set)*之後* 才呼叫建構子。
以下常數由此擴充套件定義,並且只有在擴充套件已編譯到 PHP 中或在執行階段動態載入時才會可用。
PDO::PARAM_BOOL
(整數)PDO::PARAM_NULL
(整數)PDO::PARAM_INT
(整數)PDO::PARAM_STR
(整數)PDO::PARAM_STR_NATL
(整數)PDO::PARAM_STR_CHAR
(int)PDO::PARAM_LOB
(int)PDO::PARAM_STMT
(int)PDO::PARAM_INPUT_OUTPUT
(int)PDO::FETCH_DEFAULT
(int)PDO::FETCH_LAZY
(int)PDO::FETCH_LAZY
返回一個 PDORow 物件,該物件會在存取物件屬性名稱時建立它們。在 PDOStatement::fetchAll() 內無效。
PDO::FETCH_ASSOC
(int)PDO::FETCH_ASSOC
每個欄位名稱只返回一個值。
PDO::FETCH_NAMED
(int)PDO::FETCH_NAMED
每個欄位名稱返回一個值的陣列。
PDO::FETCH_NUM
(int)PDO::FETCH_BOTH
(int)PDO::FETCH_OBJ
(int)PDO::FETCH_BOUND
(int)PDO::FETCH_COLUMN
(int)PDO::FETCH_CLASS
(int)注意:如果請求的類別中不存在該屬性,則會呼叫魔術方法 __set()。
PDO::FETCH_INTO
(int)PDO::FETCH_FUNC
(int)PDO::FETCH_GROUP
(int)PDO::FETCH_COLUMN
或 PDO::FETCH_KEY_PAIR
結合使用。
PDO::FETCH_UNIQUE
(int)PDO::FETCH_KEY_PAIR
(int)PDO::FETCH_CLASSTYPE
(int)PDO::FETCH_SERIALIZE
(int)PDO::FETCH_INTO
相似,但物件以序列化字串的形式提供。如果設定了此標記,則永遠不會呼叫類別建構函式。自 PHP 8.1.0 起已棄用。
PDO::FETCH_PROPS_LATE
(int)PDO::ATTR_AUTOCOMMIT
(int)false
,PDO 會嘗試停用自動提交,以便連線開始一個事務。
PDO::ATTR_PREFETCH
(int)PDO::ATTR_TIMEOUT
(int)PDO::ATTR_ERRMODE
(整數)PDO::ATTR_SERVER_VERSION
(整數)PDO::ATTR_CLIENT_VERSION
(整數)PDO::ATTR_SERVER_INFO
(整數)PDO::ATTR_CONNECTION_STATUS
(整數)PDO::ATTR_CASE
(整數)PDO::CASE_*
常數將欄位名稱強制轉換為特定大小寫。
PDO::ATTR_CURSOR_NAME
(整數)PDO::ATTR_CURSOR
(整數)PDO::CURSOR_FWDONLY
和 PDO::CURSOR_SCROLL
。除非您知道需要可捲動游標,否則請堅持使用 PDO::CURSOR_FWDONLY
。
PDO::ATTR_DRIVER_NAME
(整數)
範例 #1 使用 PDO::ATTR_DRIVER_NAME
<?php
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
echo "在 mysql 上運行;在此處執行 mysql 特定的操作\n";
}
?>
PDO::ATTR_ORACLE_NULLS
(整數)PDO::ATTR_PERSISTENT
(整數)PDO::ATTR_STATEMENT_CLASS
(整數)PDO::ATTR_FETCH_CATALOG_NAMES
(整數)PDO::ATTR_FETCH_TABLE_NAMES
(整數)PDO::ATTR_STRINGIFY_FETCHES
(整數)PDO::ATTR_MAX_COLUMN_LEN
(整數)PDO::ATTR_DEFAULT_FETCH_MODE
(整數)PDO::ATTR_EMULATE_PREPARES
(整數)PDO::ATTR_DEFAULT_STR_PARAM
(整數)PDO::PARAM_STR_NATL
和 PDO::PARAM_STR_CHAR
其中之一。 PHP 7.2.0 起可用。PDO::ERRMODE_SILENT
(整數)PDO::ERRMODE_WARNING
(整數)E_WARNING
訊息。有關此屬性的更多資訊,請參閱錯誤和錯誤處理。
PDO::ERRMODE_EXCEPTION
(整數)PDO::CASE_NATURAL
(整數)PDO::CASE_LOWER
(整數)PDO::CASE_UPPER
(整數)PDO::NULL_NATURAL
(整數)PDO::NULL_EMPTY_STRING
(整數)PDO::NULL_TO_STRING
(整數)PDO::FETCH_ORI_NEXT
(整數)PDO::FETCH_ORI_PRIOR
(整數)PDO::FETCH_ORI_FIRST
(整數)PDO::FETCH_ORI_LAST
(整數)PDO::FETCH_ORI_ABS
(整數)PDO::FETCH_ORI_REL
(整數)PDO::CURSOR_FWDONLY
(整數)PDO::CURSOR_SCROLL
(整數)PDO::FETCH_ORI_*
常數來控制從結果集中擷取的列。
PDO::ERR_NONE
(字串)PDO::PARAM_EVT_ALLOC
(整數)PDO::PARAM_EVT_FREE
(整數)PDO::PARAM_EVT_EXEC_PRE
(整數)PDO::PARAM_EVT_EXEC_POST
(整數)PDO::PARAM_EVT_FETCH_PRE
(整數)PDO::PARAM_EVT_FETCH_POST
(整數)PDO::PARAM_EVT_NORMALIZE
(整數)PDO::SQLITE_DETERMINISTIC
(整數)PDO::PARAM_STR_CHAR 和 PDO::PARAM_STR_NATL 必須與 PDO::PARAM_STR 使用位元或運算來進行參數綁定。
這些旗標控制值引用(例如 PDO::quote),並且在某些情況下(見下文),參數綁定(例如 PDO::bindParam、PDO::bindValue)會在字串字面值前加上 N'',如 SQL-92 中所定義。從 PHP 7.3 開始,只有 dblib 和 mysql 支援這些旗標。對於 mysql 驅動程式,只有在 PDO::ATTR_EMULATE_PREPARES 為 true(預設值)時,這些旗標才會影響參數綁定。
無論 `SET NAMES` 或 charset 參數為何,MySQL 和 MariaDB 都會將字首為 N 的字串字面值解釋為 utf8(而非 utf8mb4)。如果資料庫/資料表/欄位的字元集不是 utf8,這可能會造成問題。例如,在使用 utf8mb4 的資料庫中,查詢 "SELECT * FROM table WHERE col = :param" 並使用 bindValue(":param", "\u{1F600}", PDO::PARAM_STR | PDO::PARAM_STR_NATL) 將會導致 "PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='". 使用 PDO::PARAM_STR 而不要使用 PDO::PARAM_STR_NATL,並確保正確設定 charset DSN 參數可以避免此問題。
參見
https://wiki.php.net/rfc/extended-string-types-for-pdo
https://mariadb.com/kb/en/library/string-literals/
https://mysqldev.dev.org.tw/doc/refman/8.0/en/string-literals.html
\PDO::ATTR_TIMEOUT 的預設值是 30 秒。
參考:https://github.com/php/php-src/blob/PHP-7.1.0/ext/pdo_mysql/mysql_driver.c#L600
PDO::FETCH_UNIQUE 不僅擷取唯一值,它還會使用第一個 SQL 欄位作為陣列鍵結果,這對於快速建立索引非常有用,例如
<?php
$sql = <<<SQL
SELECT ALL
c1, -- 作為結果索引
c1, c2
FROM (
VALUES
ROW('ID-1', '值 1'),
ROW('ID-2', '值 2a'),
ROW('ID-2', '值 2b'),
ROW('ID-3', '值 3')
) AS t (c1, c2);
SQL;
$result = $pdo->query($sql);
print_r($result->fetchAll(PDO::FETCH_UNIQUE));
/*
結果:
ID-1 => [c1 => ID-1, c2 => 值 1]
ID-2 => [c1 => ID-2b, c2 => 值 2b]
ID-3 => [c1 => ID-3, c2 => 值 3]
*/
?>
所有 PDO::MYSQL_* 常數的參考資料可以在 MySQL 的驅動程式文件中找到:https://mysqldev.dev.org.tw/doc/connectors/en/apis-php-pdo-mysql.html
例如我正在尋找的 PDO::MYSQL_ATTR_SSL_CA 和 PDO::MYSQL_ATTR_SSL_CAPATH,但此頁面並未列出。
要綁定浮點數,請使用 bindValue 搭配 PDO::PARAM_STR。您可以省略 PDO::PARAM_STR,因為它是預設選項。使用 bindParam 綁定會將綁定變數的類型更改為字串,這可能會導致類型錯誤。