Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Os parâmetros fornecidos para Zend_Auth_Adapter_DbTable falharam ao produzir uma instrução sql válida


Depende da versão do MySQL, conforme descrito acima. A seguir as documentações do MySQL para a versão 5.5:

"Se um aplicativo armazena valores de uma função como MD5() ou SHA1() que retorna uma string de dígitos hexadecimais, armazenamento e comparações mais eficientes podem ser obtidos convertendo a representação hexadecimal em binário usando UNHEX() e armazenando o resultado em uma coluna BINARY(N). Cada par de dígitos hexadecimais requer um byte em formato binário, portanto, o valor de N depende do comprimento da string hexadecimal. N é 16 para um valor MD5() e 20 para um valor SHA1() ."

Então, em vez de fazer o downgrade da versão do MySQL, você pode fazer o seguinte:
  • alterar o tipo da coluna 'senha' de varchar(32) para binary(16)
  • adicione a função MySQL 'UNHEX()' à sua consulta MySQL no código ZF, por exemplo:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

Funciona bem no meu caso.

Edit --Se o seu sal de senha também estiver armazenado em uma coluna binária (por exemplo, se também for uma string hexadecimal gerada através da função SHA1), o último parâmetro do Zend_Auth_Adapter_DbTable deve ser:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(sal)))))'Então, estamos convertendo o sal de volta para uma string hexadecimal minúscula antes de concatenar com a senha. HEX() retorna seu salt em letras maiúsculas para que você possa omitir a chamada LOWER() se seu salt era originalmente em letras maiúsculas antes de você armazená-lo usando UNHEX().