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)