2009-08-27 12 views
21

Ok, tal vez he pasado por alto algo muy simple aquí, pero parece que no puedo resolver esto.incompatibilidad PHP MySQL

Estoy ejecutando WAMP localmente, pero conectándome a una base de datos remota de MySQL. La versión local de PHP es la última versión 5.3.0.

Una de las bases de datos remotas, siendo la versión 5.0.45 funciona bien. Sin embargo, la otra base de datos remota que estoy tratando de conectar, que es la versión 5.0.22 lanza el siguiente error antes de morir:

Advertencia: mysql_connect() [function.mysql-connect]: OK paquete de 6 bytes más corto de lo esperado. PID = 5880 en ...

Advertencia: mysql_connect() [function.mysql a conectar]: mysqlnd no se puede conectar a MySQL 4.1+ mediante la autenticación de edad en ...

WTF?

ACTUALIZACIÓN:.

Volviendo a PHP 5.2 * es decir, cualquier cosa inferior a 5.3.0 resuelve el problema por completo. Mientras no ejecute 5.3.0 puedo conectarme a ambas bases de datos. No estoy seguro de cuál es la explicación para esta rareza.

+0

mysqlnd no es parte de 5.2, es decir, está utilizando otro conector/lib ahora que ha vuelto a php 5.2. – VolkerK

+0

entonces, ¿cuál sería el problema con 5.3 probablemente entonces? – Evernoob

Respuesta

41

La cuenta de MySQL que está utilizando probablemente tiene una antigua contraseña de 16 caracteres (hash).
Puede probarlo con un cliente MySQL (como HeidiSQL, el cliente de la consola MySQL o cualquier otro cliente) y una cuenta que tenga acceso al mysql. user tabla. Si el campo Contraseña contiene 16 caracteres, es una contraseña anterior y mysqlnd no puede usarlo para conectarse al servidor MySQL.
se puede establecer una nueva contraseña para ese usuario con

SET PASSWORD FOR 'username'@'hostmask' = PASSWORD('thepassword') 

ver dev_mysql_set_password

edición:
También debe comprobar si el servidor está configurado para use/create old passwords by default.

Edit2:
Por favor, ejecute la consulta

SELECT 
    Length(`Password`), 
    Substring(`Password`, 1, 1) 
FROM 
    `mysql`.`user` 
WHERE 
    `user`='username' 

en el servidor 5.0.22 (el que sea "no"). Reemplace username por la cuenta que está utilizando en mysql_connect().
¿Qué significa eso?

+0

no ambas autenticaciones son las mismas y no tan largas como eso. – Evernoob

+0

"no tan largo"? No me refiero a la contraseña simple sino al hash almacenado en la tabla de usuario ;-) El antiguo algoritmo usaba 16 caracteres, el nuevo ... uhm ... 40? – VolkerK

+0

sí ... todavía no funciona, lo siento. Este es un error extraño que me molesta. – Evernoob

1

Mi servidor web tiene configuradas diferentes versiones de PHP/MySQL y para usar una cierta necesito usar la extensión .php correcta - notablemente .php5 Puede ser algo tan simple como eso.

+0

Lo siento, no, tengo miedo. – Evernoob

4

Su servidor de base de datos está configurado para usar contraseñas antiguas de forma predeterminada. El mensaje de error que obtienes es mysqlnd al ver una base de datos que puede admitir la nueva (más segura) autenticación pero se niega a hacerlo. En tal caso, mysqlnd aborta la conexión y se niega a trabajar.

Asegúrese de que el my.cnf no tiene

old-passwords = 1 

Después de comentar que la configuración de mi.cnf (o eliminarlo de otro lugar) y reinicie su servidor, asegúrese de volver a configurar su contraseña utilizando el comando que describe VolkerK, de lo contrario no podrá iniciar sesión.

+0

No tengo ol-passwords = 1 en mi my.ini así que ¿cómo cambio el servidor de la base de datos para no usar contraseñas antiguas? – Sid

+1

@sid: MySQL puede cargar múltiples archivos de configuración, y usted necesita asegurarse de que ninguno de ellos tenga contraseñas habilitadas Otra posibilidad es que tenga la variable global 'old_passwords' establecida en 1. Para verificar, ejecute' SELECT @@ global.old_passwords; ' – Guss

7

Tengo estado tratando de encontrar una solución simple para este problema. Prueba este enfoque. En MySQL tipo

SELECT Host, User, Password FROM mysql.user; 

Si la contraseña es dieciséis caracteres, esto se debe a que ha usado OLD_PASSWORD en su usuario de o ha estado usando una versión antigua de MySQL. Para actualizar escriba en

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

intercambiando root, localhost y newpass para su usuario, host y pase, respectivamente. Ahora cuando vuelva a escribir

SELECT Host, User, Password FROM mysql.user; 

Su contraseña debería haber cambiado. Esto me lo arregló.

+1

¡Arreglo simple! Actualizar la contraseña a la misma contraseña anterior (Contraseña = CONTRASEÑA ('anterior)') también funciona igual. – kehers

+1

Si el servidor aún crea contraseñas de 16 caracteres de manera predeterminada, puede arreglar esto aún: cree el hash de 41 caracteres en su equipo local con 'SELECT PASSWORD ('yourpass');', luego copie el hash impreso en un comando como esto y ejecutarlo en la máquina del servidor: 'UPDATE mysql.user SET Password = 'yourhash' WHERE Usuario = 'root'; FLUSH PRIVILEGES; '. – tanius

2

A medida que el usuario Evernoob por encima de dicho:

"Volviendo a PHP 5.2 * es decir, cualquier cosa inferior a 5.3.0 resuelve el problema por completo Mientras yo no postulo 5.3.0 puedo conectar a ambos.. No estoy seguro de cuál es la explicación para esta rareza "

En el caso de conectarse a una manguera compartida (en nuestro caso DreamHost), que está utilizando la opción oldpassword, no pudimos modificar la tabla de usuarios . Estas opciones sugeridas funcionarán en otros escenarios, pero no con el alojamiento web compartido.

De nota, estamos ejecutando WAMP.

1

Volviendo a PHP 5.2. * Hizo el truco! ¡GRACIAS!

Si está utilizando WAMP ... queda WAMP clic> PHP> Versión> obtener más>

seleccione la versión que desee y descarga.

instale/ejecute el archivo EXE

izquierda haga clic en WAMP> PHP> Versión> PHP 5.2. *

que fija este problema. No pude ejecutar ninguno de estos comandos SQL sin obtener un error de "comando denegado al usuario 'XXX' @ 'localhost'". Se ve bien tratando de iniciar sesión como SU 'Root'. Tal vez en un servidor personal, pero no va a suceder en un servidor real.

3

Una solución más simple es eliminar el usuario de la base de datos y crear uno nuevo con el mismo nombre de usuario y contraseña.

+0

Esto me pasó cuando decidí actualizar mi 'ppa: ondrej/php'. También tuve que actualizar mi servicio apache2. En resumen, este problema de mysql me pasó a mí. Solo quería decir que esta solución funcionó para mí, y ni siquiera tuve que pasar por la molestia de crear un nuevo usuario. Simplemente tuve que actualizar la contraseña de mi usuario actual. Espero que esto ayude a alguien más en el camino. Gracias por su breve solución de trabajo. –

1

Acabo de tener este problema con un sitio de Wordpress que de repente dejó de funcionar y se muestra este error.

Encontré una GUI en el Panel de control del sitio web que me permitió cambiar la contraseña para el usuario de la base de datos. Traté de cambiarlo a la contraseña actual y esto no fue permitido porque la contraseña actual no era lo suficientemente fuerte.

Cambié la contraseña de la base de datos a una contraseña nueva y más fuerte y edité mi archivo wp-config.php para tener la nueva contraseña.

Esto funcionó!

Así que supongo que el proveedor de alojamiento actualizó algo, tal vez MySQL, a una versión que requiere contraseñas más fuertes. La solución para mí fue usar la GUI de cpanel para cambiar la contraseña del usuario de la base de datos y actualizar wp-config.php para que coincida.