要使用「PDO::MYSQL_ATTR_USE_BUFFERED_QUERY」,您應該呼叫
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
將其傳遞給 PDO::prepare() 將無法運作
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.default_socket | "/tmp/mysql.sock" | INI_SYSTEM |
pdo_mysql.debug | NULL | INI_SYSTEM |
以下是設定指令的簡短說明。
要使用「PDO::MYSQL_ATTR_USE_BUFFERED_QUERY」,您應該呼叫
PDO::setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
將其傳遞給 PDO::prepare() 將無法運作
SQLSTATE[HY000]: 一般錯誤:2014 當其他未緩衝的查詢處於作用中狀態時,無法執行查詢。 ...
在花了數小時試圖找出為什麼我們在新伺服器上收到此錯誤,而在其他伺服器上相同的程式碼卻能正常運作之後,我們發現問題出在我們的網路伺服器上執行的舊版 MySQL _用戶端_ 函式庫,以及在資料庫伺服器主機上執行的最新版 MySQL _伺服器_。
將網路伺服器上的 MySQL 用戶端升級到最新版本後,問題就消失了。
> 在 my.cnf 中設定 default_authentication_plugin=mysql_native_password 來更改它
這僅適用於 MySQL 8.0。default_authentication_plugin 變數已從 8.4 中移除。