sql >> Base de Datos >  >> RDS >> Mysql

Los parámetros proporcionados a Zend_Auth_Adapter_DbTable no pudieron producir una declaración SQL válida

Depende de la versión de MySQL como se describe anteriormente. Siguiente documentación de MySQL para la versión 5.5:

"Si una aplicación almacena valores de una función como MD5() o SHA1() que devuelve una cadena de dígitos hexadecimales, se pueden obtener un almacenamiento y comparaciones más eficientes convirtiendo la representación hexadecimal a binaria usando UNHEX() y almacenando el resultado en una columna BINARY(N). Cada par de dígitos hexadecimales requiere un byte en forma binaria, por lo que el valor de N depende de la longitud de la cadena hexadecimal. N es 16 para un valor MD5() y 20 para un valor SHA1() ."

Entonces, en lugar de degradar la versión de MySQL, puede hacer lo siguiente:

  • cambiar el tipo de columna 'contraseña' de varchar(32) a binary(16)
  • añada la función MySQL 'UNHEX()' a su consulta MySQL en código ZF, por ejemplo:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

Funciona bien en mi caso.

Editar:si su contraseña salt también se almacena en una columna binaria (por ejemplo, si también fue una cadena hexadecimal generada a través de la función SHA1), entonces el último parámetro de Zend_Auth_Adapter_DbTable debería ser:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))'Entonces, estamos convirtiendo la sal nuevamente a una cadena hexadecimal en minúsculas antes de concatenar con la contraseña. HEX() devuelve su sal en mayúsculas, por lo que puede omitir la llamada LOWER() si su sal originalmente estaba en mayúsculas antes de almacenarla usando UNHEX().