我正在尝试从我的本地计算机远程连接到MySQL服务器,但是我收到以下错误:
Warning: PDO::__construct(): The server requested authentication
method unknown to the client [mysql_old_password] in
C:\xampp\htdocs\ticket\terminal\sync.php
SQLSTATE[HY000] [2054] The server requested authentication method
umknown to the client
我的本地MySQL服务器版本是5.5.27,libmysql - mysqlnd 5.0.10 远程MySQL服务器版本是5.5.23,mysqlnd版本没有公开。
我猜这是一个不兼容的密码哈希问题,但我不知道如何解决它。 以下是我的连接代码的一部分
$dsn = 'mysql:host=184.173.209.193;dbname=my_db_name';
$options = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
try {
$online_dbh = new PDO($dsn, 'myusername', 'mypassword', $options);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Congratulations!";
} catch (PDOException $e) {
echo $e->getMessage();
}
答案 0 :(得分:13)
假设您使用的是PHP 5.3+,您可能会遇到其中一个Backward Incompatibility Changes:
新的mysqlnd库需要使用MySQL 4.1更新的41字节密码格式。继续使用旧的16字节密码将导致mysql_connect()和类似的函数发出错误,“mysqlnd无法使用旧的身份验证连接到MySQL 4.1+。”
如果是,请参阅https://stackoverflow.com/a/1340538/187954以获取有关更新密码的信息。
答案 1 :(得分:4)
我克服了挑战。 我发现我的远程MySQL数据库主机仍然使用16字节的旧MySQL密码哈希,而我的localhost数据库服务器使用41字节密码哈希。我使用以下查询来查找密码长度:
SELECT PASSWORD('mypass')
我通过运行以下查询
将localhost数据库服务器密码哈希值更改为16字节SET GLOBAL old_passwords = 1;
然后我编辑了my.ini
文件,并设置old_password=1
以确保在服务器重新启动时,它不会恢复到新的密码系统。但这并没有解决我的问题。
我发现由于我使用的是PHP
的{{1}} MySQL
,所以它是处理身份验证的PHP,因此我将其降级为API
并且我能够成功建立远程连接。
我希望这有助于某人。
答案 2 :(得分:3)
这可能有助于解决此问题的人。这就是我在我的情况下修复它的方法。 来自MySQL PHP API (PDO_MYSQL)网站
在7.1.16之前运行PHP版本或在7.2.4之前运行PHP 7.2时,请设置 MySQL 8 Server的mysql_native_password或默认密码插件 否则你会看到类似于服务器请求的错误 客户端未知的身份验证方法[caching_sha2_password] 即使没有使用caching_sha2_password。
这是因为MySQL 8默认为caching_sha2_password,一个插件 旧的PHP(mysqlnd)版本无法识别。代替, 通过设置更改它 my.cnf中的default_authentication_plugin = mysql_native_password。该 未来的PHP将支持caching_sha2_password插件 发布。与此同时,mysql_xdevapi扩展程序确实支持它。
答案 3 :(得分:2)
我遇到了同样的问题并且发现问题确实与PHP有关。
解决方案对我来说很简单:切换到mysqli而不是PDO。使用Zend_Db时,这就像更改1行一样简单:
$db = Zend_Db::factory('pdo_mysql',array('host' => MYSQL_HOST, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));
变为
$db = Zend_Db::factory('mysqli',array('host' => MYSQL_HOST, 'username' => MYSQL_USER, 'password' => MYSQL_PASS, 'dbname' => MYSQL_SCHEMA));
但是如果你的应用程序没有使用Zend_Db抽象(或任何其他)层,你可能会遇到麻烦。
答案 4 :(得分:1)
我在共享主机服务(bluehost.com)上遇到此问题。我只是通过Bluehost提供的Web界面重置了borking MySql用户的密码。我重新使用旧密码,在界面上重新输入并保存,一切都很好。
答案 5 :(得分:0)
运行带有laravel 5.6和默认mysql数据库(设置为服务:)的bitbucket管道时出现此问题。
解决方案是使用旧版本的mysql
definitions:
services:
mysql:
image: mysql:5.6
PS:它是PHP 7.1
答案 6 :(得分:0)
用mysql_native_password通过“ password”标识的用户“ username” @“ localhost”;会解决它。
答案 7 :(得分:0)
如果您使用 Bitbucket Pipelines
和 MySQL 5.8+
,您可以像这样将已知参数 --default-authentication-plugin=mysql_native_password
添加到您的服务中:
definitions:
services:
mysql:
image: mysql:8.0
environment:
MYSQL_DATABASE: 'app'
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_DEFAULT_AUTH: 'mysql_native_password'