2024 日本 PHP 研討會

MySQL 函式 (PDO_MYSQL)

簡介

PDO_MYSQL 是一個驅動程式,它實作了 PHP 資料物件 (PDO) 介面,以便從 PHP 存取 MySQL 資料庫。

PDO_MYSQL 預設使用模擬預處理。

MySQL 8

當執行 PHP 7.1.16 之前的版本,或 PHP 7.2 7.2.4 之前的版本時,請將 MySQL 8 伺服器的預設密碼插件設定為 *mysql_native_password*,否則即使未用到 *caching_sha2_password*,您也會看到類似 *伺服器要求用戶端未知的驗證方法 [caching_sha2_password]* 的錯誤訊息。

這是因為 MySQL 8 預設使用 caching_sha2_password 插件,而較舊版本的 PHP (mysqlnd) 無法識別此插件。請在 my.cnf 中設定 default_authentication_plugin=mysql_native_password 來更改它。從 PHP 7.4.4 開始完全支援 *caching_sha2_password* 插件。對於較舊的版本,mysql_xdevapi 擴充套件支援此插件。

警告

注意:某些 MySQL 資料表類型(儲存引擎)不支援交易。當使用不支援交易的資料表類型編寫交易式資料庫程式碼時,MySQL 會假裝交易已成功啟動。此外,任何發出的 DDL 查詢都會隱含地提交任何待處理的交易。

注意事項:

MySQL 驅動程式無法透過 PDOStatement::bindParam() 正確支援 PDO::PARAM_INPUT_OUTPUT;雖然可以使用此類參數,但它們不會被更新(即實際輸出會被忽略)。

安裝

常見的 Unix 發行版包含可以安裝的 PHP 二進位版本。雖然這些二進位版本通常會內建對 MySQL 擴充套件的支援,但可能需要使用額外的套件來安裝擴充套件程式庫本身。請檢查您選擇的發行版隨附的套件管理器以確認可用性。

例如,在 Ubuntu 上,php5-mysql 套件會安裝 ext/mysql、ext/mysqli 和 PDO_MYSQL PHP 擴充套件。在 CentOS 上,php-mysql 套件也會安裝這三個 PHP 擴充套件。

或者,您可以自行編譯此擴充套件。從原始碼建置 PHP 可讓您指定要使用的 MySQL 擴充套件,以及每個擴充套件的用戶端程式庫選擇。

編譯時,請使用 --with-pdo-mysql[=DIR] 來安裝 PDO MySQL 擴充套件,其中可選的 [=DIR] 是 MySQL 基礎程式庫。 Mysqlnd 是預設程式庫。有關選擇程式庫的詳細資訊,請參閱 選擇 MySQL 程式庫

(選用)--with-mysql-sock[=DIR] 可設定所有 MySQL 擴充套件(包括 PDO_MYSQL)的 MySQL Unix Socket 指標位置。如果未指定,則會搜尋預設位置。

(選用)--with-zlib-dir[=DIR] 用於設定 libz 安裝字首的路徑。

$ ./configure --with-pdo-mysql --with-mysql-sock=/var/mysql/mysql.sock

使用適當的 Pdo\Mysql::ATTR_SSL_* 啟用 SSL 支援,這相當於呼叫 » MySQL C API 函式 mysql_ssl_set()。此外,由於連線已存在,因此無法使用 PDO::setAttribute() 啟用 SSL。另請參閱有關 » 使用 SSL 連線到 MySQL 的 MySQL 文件。

預定義常數

以下常數由此驅動程式定義,並且只有在擴充套件已編譯到 PHP 中或在執行階段動態載入時才可用。此外,只有在使用此驅動程式時才應使用這些驅動程式特定的常數。將驅動程式特定屬性與其他驅動程式一起使用可能會導致未預期的行為。可以使用 PDO::getAttribute() 來取得 PDO::ATTR_DRIVER_NAME 屬性以檢查驅動程式,如果您的程式碼可以在多個驅動程式上執行的話。

PDO::MYSQL_ATTR_USE_BUFFERED_QUERY整數
Pdo\Mysql::ATTR_USE_BUFFERED_QUERY 的別名
PDO::MYSQL_ATTR_LOCAL_INFILE整數
Pdo\Mysql::ATTR_LOCAL_INFILE 的別名
PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY整數
Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY 的別名。PHP 8.1.0 起可用。
PDO::MYSQL_ATTR_INIT_COMMAND整數
Pdo\Mysql::ATTR_INIT_COMMAND 的別名
PDO::MYSQL_ATTR_READ_DEFAULT_FILE整數
Pdo\Mysql::ATTR_READ_DEFAULT_FILE 的別名
PDO::MYSQL_ATTR_READ_DEFAULT_GROUP整數
Pdo\Mysql::ATTR_READ_DEFAULT_GROUP 的別名
PDO::MYSQL_ATTR_MAX_BUFFER_SIZE整數
Pdo\Mysql::ATTR_MAX_BUFFER_SIZE 的別名
PDO::MYSQL_ATTR_DIRECT_QUERY整數
PDO::ATTR_EMULATE_PREPARES 的別名
PDO::MYSQL_ATTR_FOUND_ROWS整數
Pdo\Mysql::ATTR_FOUND_ROWS 的別名
PDO::MYSQL_ATTR_IGNORE_SPACE整數
Pdo\Mysql::ATTR_IGNORE_SPACE 的別名
PDO::MYSQL_ATTR_COMPRESS整數
Pdo\Mysql::ATTR_COMPRESS 的別名
PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY整數
Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY 的別名
PDO::MYSQL_ATTR_SSL_CA整數
Pdo\Mysql::ATTR_SSL_CA 的別名
PDO::MYSQL_ATTR_SSL_CAPATH整數
Pdo\Mysql::ATTR_SSL_CAPATH 的別名
PDO::MYSQL_ATTR_SSL_CERT整數
Pdo\Mysql::ATTR_SSL_CERT 的別名
PDO::MYSQL_ATTR_SSL_CIPHER整數
Pdo\Mysql::ATTR_SSL_CIPHER 的別名
PDO::MYSQL_ATTR_SSL_KEY整數
Pdo\Mysql::ATTR_SSL_KEY 的別名
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT整數
Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT 的別名
PDO::MYSQL_ATTR_MULTI_STATEMENTS (整數)
Pdo\Mysql::ATTR_MULTI_STATEMENTS 的別名

執行時期設定

這些函式的行為會受到 php.ini 中設定的影響。

PDO_MYSQL 設定選項
名稱 預設值 可變更性
pdo_mysql.default_socket "/tmp/mysql.sock" INI_SYSTEM
pdo_mysql.debug NULL INI_SYSTEM
關於 INI_* 模式更詳細的資訊與定義,請參考 設定設定值的可能位置

以下是設定指令的簡短說明。

pdo_mysql.default_socket 字串

設定 Unix 網域通訊端。如果在 configure 時找到網域通訊端,則此值可以在編譯時設定。此 ini 設定僅適用於 Unix。

pdo_mysql.debug 布林值

啟用 PDO_MYSQL 的除錯功能。此設定僅在 PDO_MYSQL 使用 mysqlnd 編譯且處於 PDO 除錯模式時可用。

目錄

新增註記

使用者貢獻的註記 3 則註記

7
davey at php dot net
17 年前
要使用「PDO::MYSQL_ATTR_USE_BUFFERED_QUERY」,您應該呼叫
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

將其傳遞給 PDO::prepare() 將無法運作
6
brian at diamondsea dot com
16 年前
SQLSTATE[HY000]: 一般錯誤:2014 當其他未緩衝的查詢處於作用中狀態時,無法執行查詢。 ...

在花了數小時試圖找出為什麼我們在新伺服器上收到此錯誤,而在其他伺服器上相同的程式碼卻能正常運作之後,我們發現問題出在我們的網路伺服器上執行的舊版 MySQL _用戶端_ 函式庫,以及在資料庫伺服器主機上執行的最新版 MySQL _伺服器_。

將網路伺服器上的 MySQL 用戶端升級到最新版本後,問題就消失了。
0
snoyes at gmail dot com
1 個月前
> 在 my.cnf 中設定 default_authentication_plugin=mysql_native_password 來更改它

這僅適用於 MySQL 8.0。default_authentication_plugin 變數已從 8.4 中移除。
To Top