You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过PHP连接MySQL数据库及ERROR 1698权限问题求助

解决MySQL root无密码登录失败&PHP连接权限问题

我之前处理过好几个类似的问题,核心原因是MySQL 5.7及以后版本的安全默认设置搞的鬼——root用户默认用了auth_socket认证插件,而不是传统的密码验证机制:

  • 用sudo mysql -u root能登录,是因为sudo是以系统root用户身份运行客户端,刚好匹配auth_socket的验证逻辑(它只认系统用户身份,不需要密码);
  • 直接运行mysql -u root或PHP连接失败,是因为普通用户/PHP进程的运行用户(比如www-data)无法通过auth_socket的身份校验。

下面是一步步的解决方法:

1. 将root用户切换为密码验证模式

首先通过sudo登录MySQL:

sudo mysql -u root

登录成功后,执行以下SQL语句(把your_secure_password替换成你自己的密码):

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_secure_password';
FLUSH PRIVILEGES;

这里的mysql_native_password是MySQL传统的密码验证插件,能兼容PHP的所有数据库扩展(mysqli、PDO等)。

2. 验证普通用户登录是否正常

退出MySQL控制台,然后执行:

mysql -u root -p

输入刚才设置的密码,应该能顺利登录了,不会再出现ERROR 1698 (28000)错误。

3. 修复PHP连接(并遵循最佳实践)

现在你的PHP代码用root账号和设置的密码就能正常连接了,但强烈不建议在PHP应用中使用root用户——root权限太大,一旦代码泄露会导致整个数据库被篡改。最佳做法是创建一个专门的应用用户,只授予必要的权限:

创建专用数据库用户

回到MySQL控制台(这次可以用普通登录了),执行以下SQL(替换your_app_db为你的应用数据库名,app_user_password为用户密码):

CREATE USER 'php_app_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'app_user_password';
-- 只给这个用户授予目标数据库的全部权限
GRANT ALL PRIVILEGES ON your_app_db.* TO 'php_app_user'@'localhost';
FLUSH PRIVILEGES;

修改PHP连接代码

把你的PHP连接代码改成使用这个新用户,示例如下:

<?php
$db_host = 'localhost';
$db_user = 'php_app_user';
$db_pass = 'app_user_password';
$db_name = 'your_app_db';

// 用mysqli连接示例
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);

if (!$conn) {
    die('数据库连接失败: ' . mysqli_connect_error());
}
echo '连接成功!';
?>

额外说明

如果你的PHP是通过socket连接MySQL(而不是TCP),还要确保PHP运行用户(比如www-data)对MySQL的socket文件有读取权限,不过一般默认配置下不需要额外调整,只要认证方式改对就能解决问题。

内容的提问来源于stack exchange,提问作者Ijhar Ansari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:33:29