PHP的“数据提前结束”错误

时间:2011-05-23 15:33:36

标签: php mysql apache wamp wampserver

我刚刚开始在一个PHP项目中使用WAMP,我得到了与这行代码相关的下一个错误:

$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 

4 个答案:

答案 0 :(得分:5)

我遇到了同样的问题并使用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函数(取自here):

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;

答案 1 :(得分:4)

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

请检查您的PHP和MySQL版本。

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

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

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

答案 2 :(得分:0)

您连接到localhost表示您可能没有网络问题。

First hit in Google列出了2个可能的原因/补救措施。

  

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

     

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

答案 3 :(得分:0)

如果使用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;