phpenv中mysql root连接失败,主因是默认仅允许root@localhost本地登录且可能禁用空密码;需检查my.ini删skip-networking、确认服务运行,并创建用户时严格匹配host(如'root'@'localhost')与php连接参数一致。

phpEnv里连不上MySQL root?先确认是否启用了root远程登录
phpEnv 默认安装的 MySQL 通常只允许 root@localhost 本地登录,且密码可能为空或为 root(取决于安装时选项)。直接在 PHP 脚本里用 mysqli_connect('127.0.0.1', 'root', 'root') 失败,大概率是因为:
– MySQL 配置中 bind-address 是 127.0.0.1(不监听公网)
– 或者 phpEnv 启动的是 MariaDB,而某些版本默认禁用空密码 root 登录
– 也可能是 Windows 系统下服务未真正启动(任务管理器里看 mysqld.exe 进程是否存在)
解决办法:打开 phpEnv 控制面板 → “数据库” → “MySQL 配置” → 检查 my.ini 中是否有这行:skip-networking(必须删掉或注释)bind-address = 127.0.0.1(保持即可,本地够用)
改完重启 MySQL 服务。
CREATE USER 语句在 phpEnv 下必须显式执行,不能靠 GRANT 自动创建
phpEnv 常用 MySQL 5.7+ 或 MariaDB 10.4+,这些版本默认启用 sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,导致旧式写法:GRANT SELECT ON mydb.* TO 'app'@'localhost' IDENTIFIED BY '123';
会报错 ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option 或更常见的 ERROR 1820 (HY000): You must reset your password using ALTER USER statement。
正确流程只有两步,缺一不可:
- 先运行
CREATE USER 'app'@'localhost' IDENTIFIED BY 'StrongPass!2026'; - 再运行
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app'@'localhost'; - 最后必须执行
FLUSH PRIVILEGES;(高版本虽自动刷新,但 phpEnv 环境下仍建议显式执行)
注意:IDENTIFIED BY 只在 CREATE USER 中合法;GRANT ... IDENTIFIED BY 在当前模式下已被禁用。
PHP 脚本里建库失败?多半卡在连接权限或字符集上
用 PHP 创建数据库(如 CREATE DATABASE `myapp` CHARACTER SET utf8mb4)失败,常见原因不是语法错,而是:
- 连接时指定了数据库名(第四个参数非空),导致权限检查绕过 CREATE 权限校验,但实际执行时被拒绝
- 连接用户没被授予
CREATE权限(仅SELECT不够) - 库名含非法字符却没用反引号包裹,比如
my-app必须写成`my-app` - 字符集指定错误:
utf8在 MySQL 8.0+ 已废弃,必须用utf8mb4,否则建库成功但后续存 emoji 报错
安全写法示例(MySQLi 面向对象):
$conn = new mysqli('127.0.0.1', 'root', '', '', 3306);
if ($conn->connect_error) die("连接失败: " . $conn->connect_error);
$sql = "CREATE DATABASE IF NOT EXISTS `myapp` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
if (!$conn->query($sql)) {
die("建库失败: " . $conn->error);
}
$conn->close();
phpEnv 下测试新用户权限,别跳过 host 匹配细节
创建了 'app'@'localhost',但用 PHP 连接时写 mysqli_connect('localhost', ...) 却失败,原因是 MySQL 内部把 localhost 当作 socket 连接处理,而 'app'@'127.0.0.1' 才对应 TCP 连接——两者权限记录是分开的。
所以测试前务必确认三点:
- 用户创建时的 host 是
'localhost'还是'127.0.0.1'(查SELECT User, Host FROM mysql.user WHERE User='app';) - PHP 连接时的 host 参数必须严格一致(
'localhost'≠'127.0.0.1') - 如果用 PDO,DSN 中写
host=127.0.0.1就必须授权'app'@'127.0.0.1',否则报Access denied for user 'app'@'localhost'
最省事的兼容方案:创建用户时直接用 'app'@'%'(仅限开发环境),并确保 MySQL 配置中 bind-address 允许该连接方式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











