ERROR 1045在phpEnv下主因是认证不匹配,需先确认其独立MySQL实例的端口、socket路径、认证插件(如caching_sha2_password不兼容旧PHP),再用phpEnv自带mysql.exe直连验证,改用127.0.0.1+端口或显式指定socket连接。

ERROR 1045 在 phpEnv 环境下出现,基本可以确定不是服务未启动或端口不通这类网络层问题——phpEnv 自带的 MySQL 是本地集成服务,localhost 连接失败,99% 是权限/认证层面的问题。直接改密码或删用户不是首选,先定位真实原因再动手。
确认 phpEnv 使用的 MySQL 实际配置路径和端口
phpEnv 默认不走系统全局 MySQL,而是启动自己封装的实例(通常基于 MySQL 5.7 或 8.0)。它可能用非标准端口(比如 3307)、独立数据目录、甚至自定义 my.ini。盲目套用“改系统 MySQL 密码”的方案会失败。
- 打开 phpEnv 控制面板 → “数据库” → 查看“MySQL 配置文件路径”,通常是类似
D:\phpEnv\config\mysql\my.ini的位置 - 打开该
my.ini,检查[mysqld]下的port、datadir、socket值,记下实际端口(别默认 assume 3306) - 检查是否有
skip-grant-tables残留 —— 如果之前试过重置但没清理干净,会导致后续所有连接都绕过密码验证,反而掩盖真实问题
用 phpEnv 自带的 mysql.exe 直连验证账号状态
不要用 Navicat 或 PHP 脚本测试,先用 phpEnv 提供的命令行工具直连,避免客户端兼容性干扰。进入 phpEnv 安装目录下的 mysql\bin\,执行:
mysql -u root -p -P 3307
(-P 后填上你刚查到的真实端口)
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 如果提示
Access denied for user 'root'@'localhost' (using password: YES):密码确实不对,或用户记录损坏 - 如果提示
Access denied for user 'root'@'localhost' (using password: NO):说明连接时没传密码,PHP 代码里$password可能为空字符串或未定义 - 如果能进,立刻执行:
SELECT host, user, authentication_string, plugin FROM mysql.user WHERE user = 'root';—— 重点看plugin字段:MySQL 8.0+ 默认是caching_sha2_password,而 phpEnv 自带的旧版客户端(尤其 PHP 7.x)常只支持mysql_native_password
修复 root 用户认证插件和密码(MySQL 8.0+ 场景)
phpEnv 若集成 MySQL 8.0,且你用的是 PHP 7.4 或更早版本,caching_sha2_password 插件会导致握手失败,报错仍是 1045。这不是密码错,是协议不兼容。
立即学习“PHP免费学习笔记(深入)”;
- 在 mysql 命令行中执行(假设已用
skip-grant-tables或其他方式登录):ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_password'; - 执行
FLUSH PRIVILEGES; - 检查是否生效:
SELECT plugin FROM mysql.user WHERE user = 'root' AND host = 'localhost';—— 返回必须是mysql_native_password - 如果 phpEnv 控制面板里“重启 MySQL”按钮无效,手动去任务管理器结束
mysqld.exe进程,再点启动
PHP 连接代码中必须显式指定 socket 或 port
phpEnv 的 MySQL 不一定监听 localhost:3306,而 PHP 的 mysqli 或 PDO 在用 localhost 时会强制走 socket 文件(Unix)或命名管道(Windows),若 socket 路径不对,也会表现为 1045(因为根本没连到正确的 mysqld 实例)。
- 改用
127.0.0.1替代localhost,强制走 TCP:$conn = new mysqli('127.0.0.1', 'root', 'pwd', 'db', 3307); - 或明确指定 socket 路径(从
my.ini中找socket=...那行):$conn = mysqli_init(); mysqli_real_connect($conn, 'localhost', 'root', 'pwd', 'db', null, 'D:/phpEnv/mysql/data/mysql.sock'); - 检查
phpinfo()页面里的mysqli.default_socket值,如果它指向一个不存在的 socket 文件,也会静默失败


















