PHP 的“数据过早结束”错误

"Premature end of data" error with PHP

提问人: 提问时间:5/23/2011 更新时间:10/16/2016 访问量:20754

问:

我刚刚开始将 WAMP 用于 PHP 项目,并收到与此代码行相关的下一个错误:

$link=mysql_connect("localhost","myuser","mypas");

我读到我不得不使用旧密码再次执行 SET PASSWORD,但在重新启动所有服务后它仍然不起作用。我正在使用 PHP 5.3.4 和 MySQL 5.1.53 有什么帮助吗?谢谢

Warning: mysql_connect() [function.mysql-connect]: Premature end of data (mysqlnd_wireprotocol.c:554) in C:\wamp\www\CDE\includes\baseDatos.php on line 5 
Call Stack 
1 0.0002 667312 {main}( ) ..\index.php:0 
2 0.0008 682416 include( 'C:\wamp\www\CDE\includes\seguridad.php' ) ..\index.php:2 
3 0.0010 690984 include( 'C:\wamp\www\CDE\includes\baseDatos.php' ) ..\seguridad.php:2 
4 0.0014 692368 mysql_connect ( ) ..\baseDatos.php:5 

( ! ) Warning: mysql_connect() [function.mysql-connect]: OK packet 1 bytes shorter than expected in C:\wamp\www\CDE\includes\baseDatos.php on line 5 
Call Stack 
1 0.0002 667312 {main}( ) ..\index.php:0 
2 0.0008 682416 include( 'C:\wamp\www\CDE\includes\seguridad.php' ) ..\index.php:2 
3 0.0010 690984 include( 'C:\wamp\www\CDE\includes\baseDatos.php' ) ..\seguridad.php:2 
4 0.0014 692368 mysql_connect ( ) ..\baseDatos.php:5 

( ! ) Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password'). This will store a new, and more secure, hash value in mysql.user. If this user is used in other scripts executed by PHP 5.2 or earlier you might need to remove the old-passwords flag from your my.cnf file in C:\wamp\www\CDE\includes\baseDatos.php on line 5 
Call Stack 
1 0.0002 667312 {main}( ) ..\index.php:0 
2 0.0008 682416 include( 'C:\wamp\www\CDE\includes\seguridad.php' ) ..\index.php:2 
3 0.0010 690984 include( 'C:\wamp\www\CDE\includes\baseDatos.php' ) ..\seguridad.php:2 
4 0.0014 692368 mysql_connect ( ) ..\baseDatos.php:5 
php mysql apache wamp wamp 服务器

评论

0赞 xkeshav 5/23/2011
请粘贴 on ideone.com' 的代码并在此处链接。baseDatos.php
0赞 Brad Christie 5/23/2011
也许还可以查看Windows 7 PHP MySQL连接问题
0赞 5/24/2011
baseDatos.php只是一个包含以下信息的“包含文件”:ideone.com/pOvt9。如果有帮助,从 mysql.user 执行 SELECT 密码,我会得到一个 16 字节的密码,而不是原来的“mypas”。
1赞 CodeAngry 7/24/2013
数据过早结束也称为过早最终确定(对不起,忍不住了)

答:

4赞 Nicola Peluchetti 5/23/2011 #1

我遇到了同样的问题,并使用如下所示的UPDATE查询修复了它:

UPDATE mysql.user SET Password = PASSWORD('newpwd') WHERE Host = 'some_host' AND User = 'some_user';

不知道为什么,但SET密码不起作用。

为了确保问题是我认为您应该对mysql数据库进行此查询的问题:

SELECT
`user`.`Password`
FROM
`user`
WHERE
`user`.`User` = 'youruser' AND
`user`.`Host` = 'yourhost'

如果密码不以 * 开头,则问题是您仍然使用旧的编码

编辑 _ 这是一个为 MYSQL 创建有效密码的 php 函数(取自此处):

function mysql_41_password($in)
{
$p=sha1($in,true);
$p=sha1($p);
return "*".strtoupper($p);
}

然后,您可以手动设置密码:

//newpwd is the passowr dgenerated in php
UPDATE mysql.user SET Password = 'newpwd' WHERE Host = 'some_host' AND User = 'some_user';
FLUSH PRIVILEGES;

评论

0赞 5/23/2011
我这样做了,我的密码是038872231aa1b123。如何更改为新加密?谢谢
0赞 Nicola Peluchetti 5/24/2011
您确定您的ini文件中没有类似old-passwords的东西吗?
1赞 Nicola Peluchetti 5/24/2011
好吧,您可以在 php 中生成一个有效的密码并使用更新查询对其进行设置,然后我更新了我的答案以展示如何做到这一点。希望对您有所帮助
0赞 Sankar Subburaj 1/4/2012
我正在使用远程服务器,使用上述方法解决此类型的问题需要服务器的root访问权限(SSH)。大多数客户没有提供这些安全细节。否则,这是解决重置密码问题的非常简单快捷的方法。
0赞 symcbean 5/23/2011 #2

您正在连接到 localhost 表明您可能没有网络问题。

在 Google 中首次点击列出了 2 个可能的原因/补救措施。

当使用 PHP 5.3 时会出现此消息...与 MySQL 数据库一起用于 PHP 5.2...我注意到,当我换成另一个 统一服务器的版本。

如果您无法访问数据库并且主要使用这种远程连接进行开发(像我一样),那么解决方案是同时配置两个PHP版本(目前最新的Uniform Server与PHP 5.2...似乎是5.6b-Nano与PHP 5.2.13)。

评论

2赞 5/24/2011
我试过了,但我没有“my.cnf”文件。只是一个“my.ini”,它没有任何“old_passwords”行。
5赞 Sankar Subburaj 1/4/2012 #3

出现上述问题是由于PHP和MySQL之间的版本不兼容。大多数情况下,它可能发生在数据库的远程访问期间。

请检查您的PHP和MySQL版本。

我的版本是PHP-5.3.6(本地计算机)和MySQL 5.1.56(实时数据库)。

我的MySQL被放置在实时域中,我将PHP文件保存在本地计算机中。我遇到了同样的密码休息问题。

然后我用旧版本替换我的 XAMPP,它将我的 PHP 版本更改为 5.3.0。现在上述问题已经解决,我能够从本地访问实时数据库。

0赞 user3411795 3/13/2014 #4

如果使用 MySQL 4.1 + 试试这个

在 MySQL 命令行中

mysql> set old_passwords = 0; mysql> set password for 'user'@'some.host.domain' = PASSWORD('new_pass'); mysql> set old_passwords = 1;