PHP 5.4 PDO无法使用旧的不安全身份验证连接到MySQL 4.1+

时间:2012-05-02 20:04:03

标签: php mysql pdo

我知道有很多类似的问题,事实上我已经阅读了所有这些问题。

然而,他们都没有解决我的问题。

我有一个共享托管包(最低限度)。我的包中包含的是域名,以及托管MySQL服务器的单独IP地址。对于开发,我正在使用http://localhost/和PHP 5.4的开发服务器,我正在使用我在托管包中获得的MySQL服务器。

问题出现在我的电脑上,因为我安装了PHP 5.4,但我的网络主机安装了PHP 5.2.17并且不会升级。 MySQL服务器在MySQL 5.1.50上。

幸运的是,phpMyAdmin有一个内置的“更改密码”功能。

phpMyAdmin中有两个用于更改密码的哈希选项:

  • MySQL 4.1+
  • MySQL 4.0兼容

我使用MySQL 4.1+选项更改了密码,并确认更新成功。

  

个人资料已更新。 SET PASSWORD = PASSWORD( '***' )

但是,当我执行此查询时:

SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));

它告诉我密码长度仍为16.输出:

1     1     16

所以问题仍然存在。

  

无法连接到数据库。   SQLSTATE [HY000] [2000] mysqlnd无法使用旧的不安全身份验证连接到MySQL 4.1+。请使用管理工具使用命令SET PASSWORD = PASSWORD('your_existing_password')重置密码。这将在mysql.user中存储一个新的,更安全的哈希值。如果在PHP 5.2或更早版本执行的其他脚本中使用此用户,则可能需要从my.cnf文件中删除旧密码标志

在phpMyAdmin中使用DBO用户登录时,我也尝试过这些查询:

SET SESSION old_passwords=0; 
[phpMyAdmin reloads to the home screen, but the value remains = 1]

SET GLOBAL old_passwords = 0;
#1227 - Access denied; you need the SUPER privilege for this operation

FLUSH PRIVILEGES;
#1227 - Access denied; you need the RELOAD privilege for this operation

这与用于设置DBO用户的webhost菜单中所述内容相矛盾:

  

数据库所有者
  创建新数据库时,需要指定数据库所有者(DBO)用户,该用户将具有
  完全管理员访问数据库。

这是我必须接受我的虚拟主机吗?或者可以由我的DBO用户解决?否则可以在PHP中绕过它? (因为它适用于PHP 5.2.17但不适用于PHP 5.4)

3 个答案:

答案 0 :(得分:32)

解决!

虽然SET SESSION old_passwords=0;在phpMyAdmin中无效。

我下载了MySQL GUI Tools并使用MySQL Query Browser在非DBO用户上执行相同的命令:

SET SESSION old_passwords = 0;

SELECT @@global.old_passwords, @@session.old_passwords, Length(PASSWORD('abc'));

现在返回:

1      0      41

所以我只是更改了密码:

SET PASSWORD = PASSWORD('my_old_password')

现在PHP 5.4 PDO与该用户连接到数据库!

答案 1 :(得分:3)

phpMyAdmin中,设置会话变量将起作用,但对密码功能的调用必须在同一会话/执行中进行。

例如,如果我执行:

SET SESSION old_passwords = 0;
SET PASSWORD = PASSWORD('notagoodpassword');

它会正确设置它。

答案 2 :(得分:-1)

此解决方案有效: SET SESSION old_passwords = 0;

BUT: 我不得不放弃“旧的”用户自动冻结表并创建它 - 然后它就像一个魅力。

相关问题