sql >> Databáze >  >> RDS >> Mysql

Zadané parametry do Zend_Auth_Adapter_DbTable se nepodařilo vytvořit platný příkaz SQL

Záleží na verzi MySQL, jak je popsáno výše. Následující dokumentace MySQL pro verzi 5.5:

"Pokud aplikace ukládá hodnoty z funkce, jako je MD5() nebo SHA1(), která vrací řetězec hexadecimálních číslic, efektivnějšího ukládání a porovnávání lze dosáhnout převodem hexadecimální reprezentace na binární pomocí UNHEX() a uložením výsledku do sloupec BINARY(N). Každý pár hexadecimálních číslic vyžaduje jeden bajt v binárním tvaru, takže hodnota N závisí na délce hexadecimálního řetězce. N je 16 pro hodnotu MD5() a 20 pro hodnotu SHA1() ."

Takže místo downgradu verze MySQL můžete udělat následující:

  • změňte typ sloupce 'heslo' z varchar(32) na binární(16)
  • přidejte funkci MySQL 'UNHEX()' do svého dotazu MySQL v kódu ZF, například:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

V mém případě to funguje dobře.

Upravit --Pokud je vaše sůl hesla také uložena v binárním sloupci (např. pokud to byl také hexadecimální řetězec generovaný funkcí SHA1), pak by poslední parametr Zend_Auth_Adapter_DbTable měl být:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))'Takže převádíme sůl zpět na malý hexadecimální řetězec před zřetězením s heslem. HEX() vrací vaši sůl velkými písmeny, takže můžete vynechat volání LOWER(), pokud byla vaše sůl původně velká, než jste ji uložili pomocí UNHEX().



  1. vytvoření uživatele v mysql pomocí Java

  2. Kdy mám ve svých dotazech použít transakce?

  3. MariaDB DATABASE() Vysvětleno

  4. Jak aktualizovat sloupec na základě filtru jiného sloupce