首页 > 解决方案 > PHP 7.4 和 MySQL 连接

问题描述

我在另一个论坛上发布了这个,认为它与 Ubuntu 相关,MySQL 不能很好地与 PHP 配合使用,但后来我意识到 mysqli 确实在加载并与之通信,因为 phpinfo() 表明 mysqli 正在运行,所以我的问题是似乎与 PHP 7.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 的 Ubuntu 19.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

标签: phpmysqliphp-7.4

解决方案


根本问题是为用户分配了不受支持的身份验证插件,这导致密码不匹配。您可以不同地配置您的开发 MySQL 服务器,以建立类似的环境。为此,您必须编辑/etc/mysql/my.cnf

[mysqld]
...
default-authentication-plugin = mysql_native_password

但是,我宁愿建议将生产环境升级到 PHP 7.4 和 MySQL 8.0,以便使用caching_sha2_password它,这是自 MySQL 8.0 以来的默认身份验证插件。还可以在部署期间通过 MySQL CLI 更新密码——但运行相同的配置是最轻松的——并且测试它最可靠。

升级到 MySQL 8.0 : Default Authentication Plugin Considerations详细解释了它。


推荐阅读