我在另一个论坛上发布了这篇文章,认为这是与Ubuntu相关的,而MySQL并没有很好地与PHP打交道,但后来我意识到mysqli确实在加载并与其通信,因为phpinfo()显示mysqli正在运行,所以我遇到的问题似乎与PHP7.4中连接到数据库的方式的变化有关。
它显然与密码有关,所以即使不向后兼容,也必须对密码进行哪些更改才能工作?我的本地开发数据库使用一个简单的密码,我不知道我需要做什么才能让它再次工作,同时仍然保持与活动服务器上的旧的MySQL 5.X的兼容性,但是我的站点使用这个函数连接。
我确实在这里和其他地方回顾了另一篇帖子和其他几个关于它的内容,并尝试了上面链接的示例中提供的测试代码,但是仍然无法连接。
function dbConn($DBname) {
global $DBhost;
global $DBusername;
global $DBpass;
$dbconn = new mysqli($DBhost, $DBusername, $DBpass, $DBname);
mysqli_set_charset($dbconn,"UTF8");
return $dbconn;
}我使用Apache2 2.4.41和MySQL 8.0.18运行Ubuntu19.10,即使启用了mysql_native_password,也会产生错误。
Warning: mysqli::__construct(): Unexpected server response while doing caching_sha2 auth: 109 in /var/www/html/testsite.loc/db_test.php on line 32
Warning: mysqli::__construct(): (HY000/2006): MySQL server has gone away in /var/www/html/testsite.loc/db_test.php on line 32
Warning: mysqli::query(): Couldn't fetch mysqli in /var/www/html/testsite.loc/db_test.php on line 33
Fatal error: Uncaught Error: Call to a member function fetch_row() on bool in /var/www/html/testsite.loc/db_test.php:34 Stack trace: #0 {main} thrown in /var/www/html/testsite.loc/db_test.php on line 34发布于 2019-12-24 01:25:06
解决方案是简单地将数据库密码更改为它可以通过登录到终端中的mysql来使用的内容:
sudo mysql -p -u root然后在mysql>提示符下运行其中的每一个:
ALTER USER 'USERNAME'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YOUR_PASSWORD';
FLUSH PRIVILEGES;由于我的代码没有改变,并且仍然使用相同的密码,所以它应该在本地PHP 7.4和Live5.X上都能工作。不过,我不知道如何在活动服务器上这样做,因为我没有访问mysql表的权限。
发布于 2019-12-23 22:48:12
根本的问题是有一个不受支持的身份验证插件分配给用户,这会导致密码不匹配。您可以以不同的方式配置您的开发MySQL服务器,以便建立类似的环境。为了做到这一点,您必须编辑/etc/mysql/my.cnf
[mysqld]
...
default-authentication-plugin = mysql_native_password但是,我建议将生产环境升级到PHP7.4和MySQL 8.0,以便使用caching_sha2_password,这是自PHP8.0以来默认的身份验证插件。您还可以在部署期间通过MySQL CLI更新密码--但运行相同的配置是最不麻烦的,也是最可靠的测试方法。
升级到MySQL 8.0 :默认身份验证插件注意事项对此作了详细解释。
https://stackoverflow.com/questions/59461990
复制相似问题