php - paso - No se puede conectar a MySQL 4.1+ usando autenticación antigua
pagina web con base de datos mysql (7)
Estoy intentando conectarme a una base de datos mySQL en http://bluesql.net , pero cuando intento conectarme, aparece este error:
Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication
He investigado esto y tiene que ver con algún viejo esquema de contraseñas usado antes de MySQL 4.1. Las versiones más nuevas tienen la opción de usar contraseñas antiguas, que he leído pueden causar este problema.
Estoy ejecutando php 5.3 y conectando con mySQLi (nuevo mysqli (...)). Espero poder hacer algo en el código para conectarme con el DB en bluesql.net, claramente no controlo cómo se configura su base de datos. La degradación de las versiones de php no es una opción.
¿Alguien tiene alguna idea?
Si no tienes control del servidor
Acabo de tener este problema y pude solucionarlo.
Primero, conéctese a la base de datos MySQL con un cliente anterior que no le importe las antiguas contraseñas. Conéctese usando el usuario que usará su script.
Ejecuta estas consultas:
SET SESSION old_passwords=FALSE;
SET PASSWORD = PASSWORD(''[your password]'');
En su script PHP, cambie su función mysql_connect para incluir el indicador de cliente 1:
define(''CLIENT_LONG_PASSWORD'', 1);
mysql_connect(''[your server]'', ''[your username]'', ''[your password]'', false, CLIENT_LONG_PASSWORD);
Esto me permitió conectarme exitosamente.
Editar: según el comentario de Garland Pope , puede que ya no sea necesario configurar CLIENT_LONG_PASSWORD en su código PHP a partir de PHP 5.4.
Editar: cortesía de Antonio Bonifati , un script PHP para ejecutar las consultas por usted:
<?php const DB = [ ''host'' => ''...'', # localhost may not work on some hosting
''user'' => ''...'',
''pwd'' => ''...'', ];
if (!mysql_connect(DB[''host''], DB[''user''], DB[''pwd''])) {
die(mysql_error());
} if (!mysql_query($query = ''SET SESSION old_passwords=FALSE'')) {
die($query);
} if (!mysql_query($query = "SET PASSWORD = PASSWORD(''" . DB[''pwd''] . "'')")) {
die($query);
}
echo "Excellent, mysqli will now work";
?>
En OSX, utilicé MacPorts para abordar el mismo problema al conectarme a mi base de datos del sitio. Siteground parece estar utilizando 5.0.77mm0.1-log, pero la creación de una nueva cuenta de usuario no solucionó el problema. Esto es lo que hizo
sudo port install php5-mysql -mysqlnd +mysql5
Esto degrada el controlador mysql que utilizará php.
SI,
- Está utilizando un alojamiento compartido y no tiene acceso de root.
- está recibiendo dicho error al conectarse a una base de datos remota, es decir: no localhost.
- y tu uso de Xampp.
- y el código está funcionando bien en el servidor en vivo, pero el problema es solo en su máquina de desarrollo que ejecuta xampp.
Entonces,
Se recomienda encarecidamente que instale xampp 1.7.0 . Enlace de descarga
Nota: Esta no es una solución al problema anterior, sino un FIX que le permitiría continuar con su desarrollo.
Si no tiene acceso de administrador a la configuración del servidor MySQL (es decir, está utilizando un servicio de alojamiento), entonces hay 2 opciones para que esto funcione:
1) Solicitar que la opción old_passwords se establezca como falsa en el servidor MySQL
2) Baja de PHP a 5.2.2 hasta que ocurra la opción 1.
De lo que he podido encontrar, el problema parece ser cómo se almacenan las contraseñas de la cuenta MySQL y si la configuración ''old_passwords'' se establece en verdadero. Esto provoca un problema de compatibilidad entre MySQL y las versiones más nuevas de PHP (5.3+) donde PHP intenta conectarse utilizando un hash de 41 caracteres, pero el servidor MySQL aún almacena contraseñas de cuenta con un hash de 16 caracteres.
Esta incompatibilidad fue provocada por el cambio del método de hashing usado en MySQL 4.1 que permite longitudes de hash cortas y largas (Escenario 2 en esta página desde el sitio de MySQL: http://dev.mysql.com/doc/refman/5.5/en/password-hashing.html ) y la inclusión del controlador nativo de MySQL en PHP 5.3 (problema de compatibilidad con versiones anteriores documentado en la viñeta 7 de esta página de la documentación de PHP: http://www.php.net/manual/en/migration53.incompatible.php ).
Tuve el mismo problema, pero la ejecución de las consultas por sí sola no ayudará. Para arreglar esto hice lo siguiente,
- Establecer old_passwords = 0 en el archivo my.cnf
- Reiniciar mysql
- Inicie sesión en mysql como usuario root
- Ejecutar PRIVILEGIOS DE ESCAPE;
editar: esto solo se aplica si tienes el control del servidor MySQL ... si no estás echando un vistazo al método hashing de contraseñas de Mysql viejo versus nuevo
Primero verifica con la consulta SQL
SHOW VARIABLES LIKE ''old_passwords''
(en el cliente de línea de comandos de MySQL, HeidiSQL o cualquier interfaz que desee) si el servidor está configurado para usar el esquema de contraseña anterior de forma predeterminada. Si esto devuelve old_passwords,Off
tiene entradas de contraseña antiguas en la tabla de user
. El servidor MySQL usará la rutina de autenticación anterior para estas cuentas. Simplemente puede establecer una nueva contraseña para la cuenta y se usará la nueva rutina.
Puede verificar qué rutina se utilizará echando un vistazo a la tabla mysql.user
(con una cuenta que tiene acceso a esa tabla)
SELECT `User`, `Host`, Length(`Password`) FROM mysql.user
Esto devolverá 16 para las cuentas con contraseñas antiguas y 41 para las cuentas con contraseñas nuevas (y 0 para las cuentas sin contraseña en absoluto, es posible que también quiera ocuparse de las mismas).
Utilice las herramientas de administración de usuarios de la interfaz de MySQL (si hay alguna) o
SET PASSWORD FOR ''User''@''Host''=PASSWORD(''yourpassword'');
FLUSH Privileges;
(reemplace el User
y el Host
con los valores que obtuvo de la consulta anterior). Luego, vuelva a verificar la longitud de la contraseña. Debería ser ahora 41 y su cliente (por ejemplo, mysqlnd) debería poder conectarse al servidor.
vea también la documentación de MySQL: * http://dev.mysql.com/doc/refman/5.0/en/old-client.html
* http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html
* http://dev.mysql.com/doc/refman/5.0/en/set-password.html
puedes hacer estas líneas en tu buscador de consultas mysql o algo
SET old_passwords = 0;
UPDATE mysql.user SET Password = PASSWORD(''testpass'') WHERE User = ''testuser'' limit 1;
SELECT LENGTH(Password) FROM mysql.user WHERE User = ''testuser'';
FLUSH PRIVILEGES;
nota: su nombre de usuario y contraseña
después de eso debería poder funcionar. Yo también resolví el mío