修复SQLSTATE[HY000] [1045] 用户'username'@'localhost'(使用密码:YES)访问被拒绝问题
MySQL连接失败排查方案
- 确认MySQL服务状态:Linux环境执行
systemctl status mysql检查服务是否正常运行,Windows环境在服务管理器中查看MySQL服务是否处于运行状态。 - 端口与监听检查:MySQL默认监听3306端口,执行
netstat -tunlp | grep 3306确认端口正常监听,若使用非默认端口,需在DSN中添加port=自定义端口号参数。 - localhost连接兼容问题:部分环境下
localhost会优先走Unix Socket连接而非TCP/IP,若Socket路径配置错误会导致连接失败,可尝试将DBHOST的值替换为127.0.0.1走TCP连接测试。 - MySQL用户权限校验:MySQL用户权限绑定访问来源,即使账号密码正确,若对应账号不允许从
localhost/127.0.0.1访问也会连接失败,登录MySQL执行SELECT user,host FROM mysql.user WHERE user='user';可查看账号允许的访问来源。 - PDO扩展校验:执行
phpinfo()确认已加载pdo_mysql扩展,未加载的话需修改php.ini配置文件开启对应扩展。 - DSN配置优化:建议在DSN中显式指定编码和端口,比单独执行
SET NAMES更稳定,避免环境默认配置冲突。
优化后代码参考
<?php namespace App\Core; use PDO; use PDOException; class Db extends PDO { private static $instance; // 可尝试将localhost替换为127.0.0.1测试 private const DBHOST = '127.0.0.1'; private const DBUSER = 'user'; private const DBPASS = 'passe'; private const DBNAME = 'bloghkjw_dbname'; // 新增端口常量 方便修改 private const DBPORT = 3306; private function __construct() { // DSN中显式指定端口、编码 避免默认配置问题 $_dsn = sprintf('mysql:dbname=%s;host=%s;port=%d;charset=utf8mb4', self::DBNAME, self::DBHOST, self::DBPORT); try{ parent::__construct($_dsn, self::DBUSER, self::DBPASS); $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); }catch(PDOException $e){ die($e->getMessage()); } } public static function getInstance():self { if(self::$instance === null){ self::$instance = new self(); } return self::$instance; } }
内容的提问来源于stack exchange,提问作者Azarab Haimoud
相关产品推荐
相关产品推荐

