php - mysqli 在 PHP 7.4 中支持 caching_sha2_password 吗?

标签 php mysql authentication mysqli php-7.4

当我尝试从 PHP 7.3 升级到 PHP 7.4 时,收到此错误:

Unexpected server response while doing caching_sha2 auth 109

据我所知,这表明 PHP 7.4 MySQLi 正在尝试使用 caching_sha2_password插入。 This article指出 PHP MySQLi 不支持该插件(它也暗示将来支持它),但由于 PHP 7.4 是新的并且似乎正在尝试使用它,我想它应该可以工作。此外,错误消息与不支持时的错误消息不同(访问被拒绝身份验证方法未知)。

所以我将我的 MySQL 身份验证插件更改为 caching_sha2_password (使用与之前相同的密码):

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

但这导致了另一个错误:

Access denied for user 'root'@'localhost' (using password: YES).

切换回 PHP 7.3 和 mysql_native_password它又可以工作了。

我对两个插件、同一个网站使用了相同的密码,并应用了相同的 php.ini 更改。 然而我没有改变任何mysqli配置。 MySQL 的日志没有显示任何内容,apache2 日志仅显示“访问被拒绝”错误消息。

php7.4-mysqli是否支持caching_sha2_password

为什么我的密码被拒绝以及如何修复它? See my follow-up question

另外,如果 MySQLi 仍然不支持该插件:我该如何使用 mysql_native_password有了它?

最佳答案

我对此进行了测试,PHP 7.4 中的 mysqli 确实支持 caching_sha2_password。

php -v
PHP 7.4.0 (cli) (built: Nov 29 2019 16:18:44) ( NTS )

这是我编写的一个简单的 PHP 脚本,用于连接到在 docker 容器中运行的 MySQL 8.0.17(使用端口 6603):

<?php
error_reporting(E_ALL);
$conn = new mysqli('127.0.0.1', 'root', 'root', '', 6603);
$result = $conn->query("SELECT NOW()");
$now = $result->fetch_row()[0];
echo "$now\n";

我确认我的 MySQL 实例正在使用 caching_sha2_password:

mysql> select user,host,plugin from mysql.user where user='root';
+------+-----------+-----------------------+
| user | host      | plugin                |
+------+-----------+-----------------------+
| root | %         | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------+-----------+-----------------------+

mysql> select @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password           |
+---------------------------------+

运行我的 PHP 脚本,成功了。

php my.php
2019-12-08 18:11:58

但是,当我尝试像您一样将密码更改为 '' 时,我能够重现相同的错误:

PHP Warning: mysqli::__construct(): Unexpected server response while doing caching_sha2 auth: 0 in /Users/bkarwin/Documents/SO/my.php on line 5

当我恢复密码并将其设置为非空字符串时,问题得到解决。

不要使用空白密码。

关于php - mysqli 在 PHP 7.4 中支持 caching_sha2_password 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59231143/

相关文章:

php - 如果不在 PHP 中显式调用父构造函数会发生什么情况?

php - Apache 似乎没有检测到我的 .htaccess 文件

python - 如何在python中收到mqtt消息后重新连接到mysql?

c# - Owin auth - 如何获取请求身份验证 token 的客户端的 IP 地址

php - 用户使用php和mysql数据库登录

Azure OAuth 登录 - 正在工作,现在收到 AADSTS700022/AADSTS700023 错误

php - curl 可以连接到任何 TCP 端口,而不仅仅是 HTTP/HTTPS 吗?

php - 处理跨服务器 php 的最佳方法包括

MySQL IN() 函数问题 - 使用字母数字值

mysql - 按mysql中select语句 "in"子句中的值顺序排序