PHP和PDO:使用IPv6地址连接到MySQL

Joh*_*adj 6 php mysql pdo ipv6

我想通过使用其IPv6地址连接到远程MySQL实例(Google Cloud SQL实例).

我正在使用PHP PDO:

$db = new \PDO('mysql:host=<ipv6-address>;port=3306;dbname=<database-name>',
  '<username>',
  '<password>'
);
Run Code Online (Sandbox Code Playgroud)

但它总是失败,出现以下异常消息:

PDOException:SQLSTATE [HY000] [2002]没有到主机的路由

从终端我可以连接到MySQL实例,没有任何问题,像这样:

mysql --host=<ipv6-address> --user=<username> --<password>
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激.

谢谢

小智 7

万一其他人遇到同样的问题,并为他们节省 2 小时钻研 PHP 源代码的时间,如果您在地址周围放置方括号,PDO MySQL IPv6 连接就可以工作。

见:https : //github.com/php/php-src/blob/master/main/streams/xp_socket.c#L568

例如

$pdo = new PDO("mysql:host=[1234:5678::42];port=3306;dbname=foo", ...);
Run Code Online (Sandbox Code Playgroud)


Omn*_*ens -1

尝试将其用于您的 PDO 连接,看看它是否有效。

$dbh = new PDO('mysql:host=<ipv6-address>;port=<port>;dbname=<dbname>', <dbusername>, <dbpassword>);
Run Code Online (Sandbox Code Playgroud)

如果失败,您可以更好地使用try...catch来准确定位错误

<?php
try {
    $dbh = new PDO('mysql:host=<ipv6-address>;port=<port>;dbname=<dbname>', <dbusername>, <dbpassword>);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
?>
Run Code Online (Sandbox Code Playgroud)