如何通过mysqli连接到不同的MySQL端口?

5
在 PHP 的 mysqli 文档 中,它说:

mysqli mysqli_connect ([ string $host = ini_get("mysqli.default_host") [, string $username = ini_get("mysqli.default_user") [, string $passwd = ini_get("mysqli.default_pw") [, string $dbname = "" [, int $port = ini_get("mysqli.default_port") [, string $socket = ini_get("mysqli.default_socket") ]]]]]] )

但是当我执行:

$dblink = new \mysqli($c['host'], $c['user'], $c['pass'], $c['name'], $c['port']);

它连接到默认端口。 只有在我做了这个之后

$dblink = new \mysqli($c['host'].":".$c['port'], $c['user'], $c['pass'], $c['name'], $c['port']);

它连接到了正确的端口吗。


你已经回答了自己的问题... - Niraj Shah
在你的情况下,$c['host'] == 'localhost' 是否成立? - axiac
是的,@axiac,但文档中说端口可以作为参数提到。 - anjanesh
3个回答

2
mysqli_connect()的文档中提到:

host

可以是主机名或IP地址。将NULL值或字符串"localhost"传递给此参数时,会假定为本地主机。如果可能,将使用管道而不是TCP/IP协议。

这是底层libmysql库的行为。在已弃用的mysql_connect()函数的文档中也提到了这一点,同时还提供了解决方案:

注意:

无论您将"localhost""localhost:port"指定为服务器时,MySQL客户端库都将覆盖此设置,并尝试连接到本地套接字(在Windows上命名管道)。如果要使用TCP/IP,请改用"127.0.0.1"而不是"localhost"

PDO_MYSQL DSN文档中也指定了这种行为,但这次更加隐晦:

注意:仅Unix:

当将主机名设置为"localhost"时,则通过域套接字连接到服务器。如果PDO_MYSQL编译了libmysqlclient,则套接字文件的位置在其编译位置上。如果PDO_MYSQL编译了mysqlnd,则可以通过pdo_mysql.default_socket setting设置默认套接字。


0

你是对的,不管别人说什么。 根据我的测试,以下是结果:

  1. 如果你将localhost留空,无论端口如何,它都会连接到默认端口,而不管最后一个参数。
  2. 如果你将字符串"localhost"作为localhost,它仍然会连接到默认端口,而不管最后一个参数。
  3. 只有当你将localhost设置为127.0.0.1或者任何其他带有MySQL服务器的IP时,最后一个参数才会被接受和使用。

所以,我的解决方案是,如果用户选择了空的localhost,强制将localhost设置为"127.0.0.1",这样连接将被强制使用该端口。


0

连接到 MySQL 后,您可以查看连接的信息。

$dblink = new \mysqli($c['host'], $c['user'], $c['pass'], $c['name'], $c['port']);
if ($dblink->connect_error) {
    die('Connect Error (' . $dblink->connect_errno . ') '. $dblink->connect_error);
}
echo $dblink->host_info;

2
没有任何错误/异常被抛出。看起来mysqli构造函数中的端口参数被忽略了。 - anjanesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接