MySQL PHP不兼容

Eve*_*oob 23 php mysql

我在本地运行WAMP,但连接到远程MySQL数据库.PHP的本地版本是最新的5.3.0.

其中一个远程数据库,版本5.0.45工作正常.但是,我正在尝试连接的另一个远程数据库,即版本5.0.22在死亡之前抛出以下错误:

警告:mysql_connect()[function.mysql-connect]:OK数据包比预期的短6个字节.PID = 5880 in ...

警告:mysql_connect()[function.mysql-connect]:mysqlnd无法使用旧身份验证连接到MySQL 4.1+ ...

WTF?

更新:

恢复到PHP 5.2.*即低于5.3.0的任何内容都可以完全解决问题.只要我没有运行5.3.0,我就可以连接到两个数据库.我不确定这种奇怪的解释是什么.

Vol*_*erK 45

您正在使用的MySQL帐户可能有一个旧的16个字符长的密码(哈希).
您可以使用MySQL客户端(如HeidiSQL,MySQL控制台客户端或任何其他客户端)以及可以访问的客户端进行测试mysql.user表.如果密码字段包含16个字符,则它是旧密码,而mysqlnd不能使用它来连接MySQL服务器.
您可以为该用户设置新密码

SET PASSWORD FOR 'username'@'hostmask' = PASSWORD('thepassword')
Run Code Online (Sandbox Code Playgroud)

请参阅dev_mysql_set_password

编辑:
您还应该检查服务器是否设置为默认使用/创建旧密码.

edit2:
请运行查询

SELECT
  Length(`Password`),
  Substring(`Password`, 1, 1)
FROM
  `mysql`.`user`
WHERE
  `user`='username'
Run Code Online (Sandbox Code Playgroud)

在5.0.22服务器上(那个"失败").替换username为您在mysql_connect()中使用的帐户.
那回报是什么?


小智 7

我一直试图找到解决这个问题的简单方法.试试这种方法.在MySQL类型中

SELECT Host, User, Password FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)

如果您的密码是十六个字符,这是因为您在用户上使用过OLD_PASSWORD或者一直在运行旧版本的MySQL.要更新类型

UPDATE mysql.user SET Password=PASSWORD('newpass')
  WHERE User='root' AND Host='localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

分别为您的用户,主机和传递交换root,localhost和newpass.现在当你重新打字

SELECT Host, User, Password FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)

您的密码应该已更改.这为我修好了.

  • 如果服务器仍然默认创建 16 个字符的密码,你仍然可以解决这个问题:在你的本地机器上用 `SELECT PASSWORD('yourpass');` 创建 41 个字符的散列,然后将打印的散列复制到这样的命令中并在服务器机器上执行:`UPDATE mysql.user SET Password='yourhash' WHERE User='root'; 刷新特权;`. (2认同)