11

我知道有很多类似的问题,事实上我已经阅读了所有(9)个问题。

但是,它们都没有解决我的问题。

我有一个共享主机包(最低限度)。我的包中包含的是域名,以及托管 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 文件中删除 old-passwords 标志

在 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 用户的内容相矛盾:

数据库所有者
创建新数据库时,您需要指定一个数据库所有者 (DBO) 用户,该用户将拥有
对数据库的完全管理员访问权限。

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

4

3 回答 3

32

解决了!

虽然SET SESSION old_passwords=0;在 phpMyAdmin 中没有工作。

我下载了MySQL GUI 工具并使用 MySQL 查询浏览器对非 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 使用该用户连接到数据库!

于 2012-05-02T22:20:17.970 回答
3

phpMyAdmin中,设置会话变量将起作用,但对密码函数的调用必须发生在同一个会话/执行中。

例如,如果我执行:

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

它会正确设置它。

于 2015-03-12T02:49:53.657 回答
-1

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

但是:之后我不得不放弃“旧”的用户霜表并创建新的 - 然后它就像一个魅力。

于 2016-01-25T15:59:56.877 回答