请注意,当使用“localhost”作为主机名时,端口选项可能会被忽略。
如果您希望通过除默认端口之外的其他端口进行连接,请用“127.0.0.1”替换 localhost。
(PHP 5, PHP 7, PHP 8)
mysqli::real_connect -- mysqli_real_connect — 打开到 mysql 服务器的连接
面向对象风格
$hostname
= null
,$username
= null
,$password
= null
,$database
= null
,$port
= null
,$socket
= null
,$flags
= 0过程式风格
$mysql
,$hostname
= null
,$username
= null
,$password
= null
,$database
= null
,$port
= null
,$socket
= null
,$flags
= 0建立到 MySQL 数据库引擎的连接。
此函数与 mysqli_connect() 不同
mysqli_real_connect() 需要一个有效的对象,该对象必须由函数 mysqli_init() 创建。
使用 mysqli_options() 函数,您可以为连接设置各种选项。
有一个 flags
参数。
mysql
仅限过程式风格:由 mysqli_connect() 或 mysqli_init() 返回的 mysqli 对象
hostname
可以是主机名或 IP 地址。当传递 null
时,该值将从 mysqli.default_host 中检索。如果可能,将使用管道而不是 TCP/IP 协议。如果一起提供了主机名和端口号,例如 localhost:3308
,则使用 TCP/IP 协议。
username
MySQL 用户名或 null
,以根据 mysqli.default_user ini 选项假定用户名。
password
MySQL 密码或 null
,以根据 mysqli.default_pw ini 选项假定密码。
database
执行查询时要使用的默认数据库,或 null
。
port
尝试连接到 MySQL 服务器的端口号,或 null
,以根据 mysqli.default_port ini 选项假定端口。
socket
要使用的套接字或命名管道,或 null
,以根据 mysqli.default_socket ini 选项假定套接字。
注意:
指定
socket
参数不会明确确定连接到 MySQL 服务器时要使用的连接类型。如何连接到 MySQL 数据库由hostname
参数确定。
flags
使用参数 flags
,您可以设置不同的连接选项
名称 | 说明 |
---|---|
MYSQLI_CLIENT_COMPRESS |
使用压缩协议 |
MYSQLI_CLIENT_FOUND_ROWS |
返回匹配的行数,而不是受影响的行数 |
MYSQLI_CLIENT_IGNORE_SPACE |
允许函数名后的空格。使所有函数名成为保留字。 |
MYSQLI_CLIENT_INTERACTIVE |
允许 interactive_timeout 秒(而不是 wait_timeout 秒)的空闲时间,然后关闭连接 |
MYSQLI_CLIENT_SSL |
使用 SSL(加密) |
MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT |
与 MYSQLI_CLIENT_SSL 相同,但禁用对提供的 SSL 证书的验证。这仅适用于使用 MySQL 本机驱动程序和 MySQL 5.6 或更高版本的安装。 |
注意:
出于安全原因,PHP 中不支持
MULTI_STATEMENT
标志。如果要执行多个查询,请使用 mysqli_multi_query() 函数。
如果启用了 mysqli 错误报告(MYSQLI_REPORT_ERROR
)并且请求的操作失败,则会生成警告。此外,如果模式设置为 MYSQLI_REPORT_STRICT
,则会抛出 mysqli_sql_exception 而不是警告。
版本 | 说明 |
---|---|
7.4.0 | 所有参数现在都是可空的。 |
示例 #1 mysqli::real_connect() 示例
面向对象风格
<?php
$mysqli = mysqli_init();
if (!$mysqli) {
die('mysqli_init failed');
}
if (!$mysqli->options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!$mysqli->real_connect('localhost', 'my_user', 'my_password', 'my_db')) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . $mysqli->host_info . "\n";
$mysqli->close();
?>
扩展 mysqli 类时的面向对象风格
<?php
class foo_mysqli extends mysqli {
public function __construct($host, $user, $pass, $db) {
parent::__construct();
if (!parent::options(MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!parent::options(MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!parent::real_connect($host, $user, $pass, $db)) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
}
$db = new foo_mysqli('localhost', 'my_user', 'my_password', 'my_db');
echo 'Success... ' . $db->host_info . "\n";
$db->close();
?>
过程式风格
<?php
$link = mysqli_init();
if (!$link) {
die('mysqli_init failed');
}
if (!mysqli_options($link, MYSQLI_INIT_COMMAND, 'SET AUTOCOMMIT = 0')) {
die('Setting MYSQLI_INIT_COMMAND failed');
}
if (!mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 5)) {
die('Setting MYSQLI_OPT_CONNECT_TIMEOUT failed');
}
if (!mysqli_real_connect($link, 'localhost', 'my_user', 'my_password', 'my_db')) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
echo 'Success... ' . mysqli_get_host_info($link) . "\n";
mysqli_close($link);
?>
上面的示例将输出
Success... MySQL host info: localhost via TCP/IP
注意:
MySQLnd 始终假定服务器默认字符集。该字符集是在连接握手/身份验证期间发送的,mysqlnd 将使用它。
Libmysqlclient 使用在 my.cnf 文件中设置的默认字符集,或者在调用 mysqli_options()(在调用 mysqli_real_connect() 之前,但在调用 mysqli_init() 之后)时通过显式调用设置的默认字符集。
这是因为它尝试使用字符串 localhost 与套接字进行通信。这已在文档中记录并广为人知。