phpEnv中不能直接UPDATE修改MySQL用户Host,因主键冲突且bind-address限制;应创建专用用户(如'lanuser'@'192.168.3.%'),授权后修改my.ini中bind-address=0.0.0.0并重启服务,再开放防火墙3306端口。

phpEnv 中 MySQL 用户的 Host 不能直接 UPDATE 修改
phpEnv 是集成环境,MySQL 默认以 mysqld --skip-grant-tables 或服务方式运行,但它的用户权限表(mysql.user)受严格校验。直接执行 UPDATE mysql.user SET host = '%' WHERE user = 'root' 极大概率失败,报错 ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY' —— 因为已有 'root'@'localhost' 和 'root'@'127.0.0.1',再插入 'root'@'%' 会违反主键唯一性约束。
更关键的是:phpEnv 的 MySQL 配置常启用 bind-address = 127.0.0.1,即使用户 Host 改成 %,网络层也拒绝外部连接。
- 不要用
UPDATE mysql.user手动改 Host 字段 - 不要跳过
FLUSH PRIVILEGES,否则权限不生效 - 确认你操作的是 phpEnv 自带的 MySQL 实例(不是系统全局 MySQL),路径通常在
phpenv\mysql\bin\下
正确添加局域网可访问用户的三步法
目标是让局域网其他设备(如 192.168.3.105)能连上 phpEnv 的 MySQL,而不是强行把 root 开放给 % —— 这既不安全,也常因权限叠加冲突失败。
- 用 phpEnv 自带的 MySQL 客户端登录:
phpenv\mysql\bin\mysql -u root -p - 创建专用用户(推荐):
CREATE USER 'lanuser'@'192.168.3.%' IDENTIFIED BY 'your_strong_pwd';(注意网段匹配,比%更精准) - 授权并刷新:
GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'lanuser'@'192.168.3.%'; FLUSH PRIVILEGES;
如果必须用 %(例如测试环境不确定 IP),请确保只用于非生产场景,并确认防火墙已放行 3306 端口。
立即学习“PHP免费学习笔记(深入)”;
必须同步修改 my.ini 中的 bind-address
phpEnv 的 MySQL 配置文件默认在 phpenv\mysql\my.ini。仅改用户权限没用,因为 MySQL 默认只监听本地回环地址。
找到 [mysqld] 段落,修改或添加:
bind-address = 0.0.0.0
⚠️ 注意:0.0.0.0 表示监听所有 IPv4 接口;* 不被 MySQL 5.7+ 支持;127.0.0.1 或 localhost 则彻底屏蔽局域网。
- 改完必须重启 phpEnv 的 MySQL 服务(通过 phpEnv 控制面板或命令行
phpenv\mysql\bin\mysqld --install+ 重启服务) - Windows 防火墙需放行 TCP 3306 端口(不是仅开 Apache 的 80 端口)
-
netstat -ano | findstr :3306可验证是否监听0.0.0.0:3306,而非127.0.0.1:3306
连接测试与典型失败原因
从局域网另一台机器用客户端(如 Navicat、DBeaver 或命令行 mysql -h 192.168.3.100 -u lanuser -p)连接时,常见报错及对应点:
-
Host '192.168.3.105' is not allowed to connect to this MySQL server→ 用户 Host 设置错误,或没FLUSH PRIVILEGES -
Can't connect to MySQL server on '192.168.3.100' (10061)→bind-address未改、MySQL 服务未重启、或 Windows 防火墙拦截 - 能连上但无法查库 → 权限未授予具体数据库,
GRANT里用了ON *.*但目标库名含特殊字符(如短横线),需用反引号包裹:GRANT ... ON `my-db`.*
Host 匹配逻辑是“最长前缀优先”,'lanuser'@'192.168.3.105' 比 'lanuser'@'192.168.3.%' 更精确,但后者更实用;别混用 '%' 和 'localhost',它们是完全独立的账号主体。



















