PHP 7.4和MySQL连接

时间:2019-12-23 22:40:24

标签: php mysqli php-7.4

我在另一个论坛上发布了此内容,认为它与Ubuntu相关,并且MySQL与PHP的配合不好,但后来我意识到mysqli确实正在加载并与其通信,因为phpinfo()表明mysqli正在运行,因此我一直遇到的问题似乎与PHP 7.4连接数据库的方式有关。

它显然与密码有关,因此即使不向后兼容,也必须对其进行什么更改?我的本地开发数据库使用一个简单的密码,但是我不确定在恢复与实时服务器上旧MySQL 5.X的兼容性的同时又需要执行什么操作,但是我的站点使用此功能进行连接。

我确实查看了another posting以及此处和其他地方的其他内容,并尝试了上面示例中提供的测试代码,但仍然无法连接。

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

2 个答案:

答案 0 :(得分:2)

潜在的问题是分配给用户的身份验证插件不受支持,这导致密码不匹配。您可以不同地配置开发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在部署过程中更新密码-但运行相同的配置最省事-并且最可靠的测试方法。

Upgrading to MySQL 8.0 : Default Authentication Plugin Considerations对其进行了详细说明。

答案 1 :(得分:0)

解决方案是将数据库密码更改为可以通过以下方式登录的mysql密码:

sudo mysql -p -u root

然后在mysql>提示符下运行每个命令:

ALTER USER 'USERNAME'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'YOUR_PASSWORD';

FLUSH PRIVILEGES;

由于我的代码未更改,并且仍使用与以前相同的密码,因此它应可在本地PHP 7.4和实时5.X上运行。不过,我不确定如何在实时服务器上执行此操作,因为我无法访问 mysql 表。