PHP Conference Japan 2024

mysqli::options

mysqli_options

(PHP 5, PHP 7, PHP 8)

mysqli::options -- mysqli_options設定選項

說明

物件導向風格

public mysqli::options(int $option, string|int $value): bool

程序風格

mysqli_options(mysqli $mysql, int $option, string|int $value): bool

用於設定額外的連線選項並影響連線行為。

可以多次呼叫此函數來設定多個選項。

mysqli_options() 應該在 mysqli_init() 之後以及 mysqli_real_connect() 之前呼叫。

參數

mysql

僅程序式風格:由 mysqli_connect()mysqli_init() 返回的 mysqli 物件

option

您要設定的選項。可以是下列值之一

有效選項
名稱 說明
MYSQLI_OPT_CONNECT_TIMEOUT 連線逾時,單位為秒
MYSQLI_OPT_READ_TIMEOUT 命令執行結果逾時,單位為秒。PHP 7.2.0 起可用。
MYSQLI_OPT_LOCAL_INFILE 啟用/停用 LOAD LOCAL INFILE 的使用
MYSQLI_INIT_COMMAND 連線到 MySQL 伺服器後執行的命令
MYSQLI_SET_CHARSET_NAME 要設定為預設的字元集。
MYSQLI_READ_DEFAULT_FILE 從指定的選項檔案而不是 my.cnf 讀取選項。mysqlnd 不支援。
MYSQLI_READ_DEFAULT_GROUP my.cnf 或使用 MYSQL_READ_DEFAULT_FILE 指定的檔案中讀取指定群組的選項。mysqlnd 不支援。
MYSQLI_SERVER_PUBLIC_KEY 與基於 SHA-256 的驗證一起使用的 RSA 公開金鑰檔案。
MYSQLI_OPT_NET_CMD_BUFFER_SIZE 內部命令/網路緩衝區的大小。僅適用於 mysqlnd。
MYSQLI_OPT_NET_READ_BUFFER_SIZE 讀取 MySQL 命令封包主體時的最大讀取區塊大小,單位為位元組。僅適用於 mysqlnd。
MYSQLI_OPT_INT_AND_FLOAT_NATIVE 在使用非預備語句時,將整數和浮點數欄位轉換回 PHP 數字。僅適用於 mysqlnd。
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 是否驗證伺服器憑證。

value

選項的值。

返回值

成功時返回 true,失敗時返回 false

錯誤/例外

如果啟用了 mysqli 錯誤報告 (MYSQLI_REPORT_ERROR) 且請求的操作失敗,則會產生警告。此外,如果模式設定為 MYSQLI_REPORT_STRICT,則會改為拋出 mysqli_sql_exception

範例

請參閱 mysqli_real_connect()

注意事項

注意:

MySQLnd 一律採用伺服器預設字元集。此字元集會在連線握手/驗證期間傳送,mysqlnd 將使用此字元集。

Libmysqlclient 使用在 my.cnf 中設定的預設字元集,或是在呼叫 mysqli_real_connect() 之前但在 mysqli_init() 之後明確呼叫 mysqli_options() 所設定的字元集。

另請參閱

新增註記

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

php at darkain dot com
6 年前
有一個未記錄的選項:MYSQLI_OPT_READ_TIMEOUT。這在理論上類似於 MYSQLI_OPT_CONNECT_TIMEOUT,但應用略有不同。連線逾時僅指定初始 TCP 連線的等待時間。一旦建立連線,逾時便不再適用。然而,讀取逾時是從建立 TCP 連線到收到第一個實際數據包的時間。在某些情況下,可以建立 TCP 連線,但 MySQL 伺服器會無限期地停止,阻止執行返回 PHP。指定讀取逾時可以緩解這種情況,而連線逾時則無法。

如果未定義 MYSQLI_OPT_READ_TIMEOUT 常數,在未定義的情況下,舊版本仍然支援它。您可以在較舊的 PHP 版本中使用以下程式碼自行定義它。

<?php
if (!defined('MYSQLI_OPT_READ_TIMEOUT')) {
define ('MYSQLI_OPT_READ_TIMEOUT', 11);
}
?>

然後,您可以像使用連線逾時一樣使用讀取逾時。請注意,由於這是整個連線過程中兩個不同部分的兩個不同逾時值,因此逾時會累加(例如:10 秒連線逾時 + 10 秒讀取逾時 = 最大可能逾時 20 秒)

<?php
//建立物件
$connection = mysqli_init();

//指定連線逾時
$connection->options(MYSQLI_OPT_CONNECT_TIMEOUT, 10);

//指定讀取逾時
$connection->options(MYSQLI_OPT_READ_TIMEOUT, 10);

//初始化與伺服器的連線,使用先前指定的兩個逾時
$connection->real_connect('server', 'user', 'pass', 'database');
?>
fluppy
17 年前
這裡是一個建立 SSL 連線的小範例

<?php

$db
= mysqli_init();

/*
如果要使用個別的 cnf 檔
$test = $db->options(MYSQLI_READ_DEFAULT_FILE, 'myother.cnf');
*/

$db->ssl_set('server-key.pem','server-cert.pem',
'cacert.pem',NULL,NULL);

$db->real_connect('localhost','root','','mydb');

//這裡是一些查詢

$db->close();

?>
程序化人士
2 年前
雖然手冊上沒有說明,但 MYSQLI_OPT_SSL_VERIFY_SERVER_CERT 是一個僅適用於 mysqlnd 的選項,如果與 mysqli 一起使用會引發錯誤。
puneetsharam9 at hotmail dot com
2 年前
使用物件導向方法
mysqli 的 init 從 8.1 版開始似乎已被棄用
您可能必須使用空的 __construct()
這樣您才能擁有正確的整數和浮點數

class DB extends \mysqli {
private function __construct(
private $_user = DBUSER,
private $_pass = DBPWD,
private $_dbName = DBNAME,
private $_dbHost = DBHOST,
) {
parent::__construct();
parent::options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
}
}
}
Guy Sartorelli
1 年前
`MYSQLI_OPT_SSL_VERIFY_SERVER_CERT` 似乎總是失敗,`options()` 總是返回 false。
請改用 `real_connect()` 搭配 `MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT` 旗標。
king at bobfish dot org
16 年前
使用 mysqli_options 增加 max_allowed_packet 大小以便處理大型 blob 的範例。

function dbConnect() {
{
$user = 'jomama';
$pass = 'cartoon';
$dbName = 'LifeCycle';
$host = 'localhost';

$mysqli = mysqli_init();
mysqli_options($mysqli, MYSQLI_READ_DEFAULT_GROUP,
"max_allowed_packet=50M");
mysqli_real_connect($mysqli, $host, $user, $pass, $dbName)
or die ('<P>無法連線</P>');

}
}
To Top