He visto esto antes, donde un usuario de mysql inicia sesión a través de php y otro no. Algunas veces el usuario incluso trabaja desde la línea de comandos pero no desde php.
Siempre ha sido lo que Emil está refferiendo dos. Un usuario de mysql es realmente un par de usuario/host. por lo que el usuario megadots @ localhost y el usuario megadots @ mycoolhost se enumeran en la tabla mysql.user como dos registros independientes.
Si puede iniciar sesión desde la línea de comandos, ejecute esta consulta.
SELECT user, host FROM mysql.user
debería ver la lista completa de usuarios y sus anfitriones.
si reconoce el usuario de phpMyAdmin que está funcionando, mire la columna de host que probablemente sea el host que desea usar.
para restablecer el anfitrión ejecutar estas consultas (! Tener cuidado de hacer esto a su trabajo con la tabla de privilegios que para toda la instalación de MySQL)
update mysql.user set host = 'hostname'
where user = 'username' and host = 'oldhostname';
flush privileges;
Si ve un registro con el nombre de usuario y% como el anfitrión que tendrá prioridad sobre todo lo demás, si hay múltiples registros para el usuario y% como host para uno de ellos, es posible que el nombre de usuario con% como host tenga una contraseña incorrecta y no importa cuántas veces restablezca la contraseña de username @ localhost no es válido porque se comparará con el nombre de usuario @% al iniciar sesión.
¿Cómo otorgaste el privilegio? El problema en este caso no es el código php, sino el extremo mysql. La declaración de conexión es correcta. –