PHP MySQLi 函数

PHP mysqli::set_opt() / mysqli_set_opt() 函数用于设置额外的连接选项并影响行为用于连接。

可以多次调用此函数来设置多个选项。该函数应在 mysqli_init() 之后、mysqli_real_connect() 之前调用。

该方法是 mysqli_options() 函数的别名。

语法

//面向对象风格
public mysqli::set_opt(option, value)

//面向过程风格
mysqli_set_opt(mysql, option, value) 

参数

mysql必填。 仅适用于面向过程风格:指定 mysqli_connect() 或 mysqli_init() 返回的 mysqli 对象。
options必填。 指定要设置的选项。它可以是以下值之一:
  • 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 - 仅对 mysqlnd 有效。读取 MySQL 命令数据包正文时的最大读取块大小(以字节为单位)。
  • MYSQLI_OPT_INT_AND_FLOAT_NATIVE - 将整数和浮点列转换回 PHP 数字。仅对 mysqlnd 有效。
  • MYSQLI_OPT_SSL_VERIFY_SERVER_CERT - 是否验证服务器证书。
value必填。 指定选项的值。

返回值

成功时返回 true,失败时返回 false。

示例:面向对象风格

下面的示例显示了 mysqli::set_opt() 方法的用法。

<?php
$mysqli = mysqli_init();
if (!$mysqli) {
  die('mysqli_init failed');
}

if (!$mysqli->set_opt(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
  die('Setting MYSQLI_INIT_COMMAND failed');
}

//指定连接超时
if (!$mysqli->set_opt(MYSQLI_OPT_CONNECT_TIMEOUT, 10)) {
  die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}

//建立与数据库的连接
if (!$mysqli->real_connect("localhost", "user", "password", "database")) {
  die('Connect Error: '. mysqli_connect_error());
}

echo 'Success... ' . $mysqli->host_info . "\n";

//关闭连接
$mysqli->close();
?> 

输出上述代码的内容将为:

Success... MySQL host info: localhost via TCP/IP 

示例:扩展 mysqli 类时的面向对象风格

考虑下面的示例,其中在扩展 mysqli 类时使用此方法.

<?php
class acs_mysqli extends mysqli {
  public function __construct($host, $user, $pass, $db) {
    parent::init();

    if (!parent::set_opt(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
      die('Setting MYSQLI_INIT_COMMAND failed');
    }

    if (!parent::set_opt(MYSQLI_OPT_CONNECT_TIMEOUT, 10)) {
      die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
    }

    if (!parent::real_connect($host, $user, $pass, $db)) {
      die('Connect Error: ' . mysqli_connect_error());
    }
  }
}

//建立与数据库的连接
$db = new acs_mysqli("localhost", "user", "password", "database");

echo 'Success... ' . $db->host_info . "\n";

//关闭连接
$db->close();
?> 

上述代码的输出将是:

Success... MySQL host info: localhost via TCP/IP 

示例:面向过程风格

下面的示例显示了 mysqli_set_opt() 函数。

<?php
$mysqli = mysqli_init();
if (!$mysqli) {
  die('mysqli_init failed');
}

if (!mysqli_set_opt($mysqli, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
  die('Setting MYSQLI_INIT_COMMAND failed');
}

//指定连接超时
if (!mysqli_set_opt($mysqli, MYSQLI_OPT_CONNECT_TIMEOUT, 10)) {
  die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}

//建立与数据库的连接
if (!mysqli_real_connect($mysqli, "localhost", "user", "password", "database")) {
  die('Connect Error: '. mysqli_connect_error());
}

echo 'Success... ' . mysqli_get_host_info($mysqli) . "\n";

//关闭连接
mysqli_close($mysqli);
?> 

上述代码的输出将是:

Success... MySQL host info: localhost via TCP/IP