【问题标题】:PHP PDO initialization fails due to "double port" - Uncaught PDOException: SQLSTATE[HY000] [2002]由于“双端口”,PHP PDO 初始化失败 - 未捕获的 PDOException: SQLSTATE[HY000] [2002]
【发布时间】:2017-04-20 10:20:15
【问题描述】:

我收到这个错误

PHP 致命错误:未捕获的 PDOException: SQLSTATE[HY000] [2002] 无法解析 [myPath]/xxDb.php:32 中的地址“localhost:3306:3306”

注意地址中的“双”端口:localhost:3306:3306

xxDb.php line32 看起来像这样:

$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8', DB_USER, DB_PW, array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" ));

转储 DB_HOST 导致localhost:3306

我看不到第二个端口部分3306 来自哪里,这在连接初始化期间显然存在。 非常感谢任何帮助。

【问题讨论】:

  • 在没有评论的情况下对问题投反对票……太好了。 SO规则...
  • 拒绝投票不需要发表评论,只是建议(也不是我)。 DB_HOST 是手动设置的吗?如果是,则尝试从中删除端口,将其更改为 localhost
  • DB_HOST 由CMS系统设置,根据用户的设置而变化(此代码属于插件的一部分)。你能想到这个端口被复制的任何原因吗?任何地方都没有单独的端口设置,而且 PDO 构造函数似乎只是将它加倍(我不太相信..)。我迷路了。
  • 这是什么 CMS/平台?这也是在什么服务器环境上运行的?
  • 我知道DB_HOST 是由CMS 设置的,但可能需要将端口指定为自己的值。喜欢host=x;port=x;。见PDO_MYSQL DSN。我相信 3306 是默认端口,所以也许你可以完全省略它。

标签: php mysql pdo


【解决方案1】:

showdev 的评论是正确的,即 PDO DSN 不允许 host:port 语法。

如果您的 CMS 定义了您无法控制的 DB_HOST,则您不能直接使用该常量。但是你可以从中提取信息。

$host_port = preg_replace('/:(\d+)/', ';port=${1}', DB_HOST);
$db = new PDO("mysql:host={$host_port};dbname=".DB_NAME.";charset=utf8", 
    DB_USER, DB_PW, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

【讨论】:

  • 谢谢。分别定义“主机”和“端口”修复它。
  • 有谁知道 PDO DNS 什么时候不接受 host:port 语法?这个问题刚刚出现在我们身上,这个解决方案奏效了。
  • @ElliotReed,至少从 2005 年开始,根据github.com/php/php-src/blame/master/ext/pdo_mysql/… 查看第 798-802 行中的代码,左栏中的“责备”提交历史记录显示了这些代码行的历史。
猜你喜欢
  • 2016-02-23
  • 1970-01-01
  • 2018-10-20
  • 2020-01-22
  • 1970-01-01
  • 2014-10-11
  • 2019-02-07
  • 2012-07-08
相关资源
最近更新 更多