Mysql
 sql >> Database >  >> RDS >> Mysql

I parametri forniti a Zend_Auth_Adapter_DbTable non sono riusciti a produrre un'istruzione sql valida

Dipende dalla versione di MySQL come descritto sopra. Seguendo la documentazione MySQL per la versione 5.5:

"Se un'applicazione memorizza valori da una funzione come MD5() o SHA1() che restituisce una stringa di cifre esadecimali, è possibile ottenere una memorizzazione e confronti più efficienti convertendo la rappresentazione esadecimale in binaria utilizzando UNHEX() e memorizzando il risultato in una colonna BINARY(N). Ogni coppia di cifre esadecimali richiede un byte in forma binaria, quindi il valore di N dipende dalla lunghezza della stringa esadecimale. N è 16 per un valore MD5() e 20 per un valore SHA1() ."

Quindi, invece di eseguire il downgrade della versione di MySQL, puoi procedere come segue:

  • modifica il tipo di colonna "password" da varchar(32) a binary(16)
  • aggiungi la funzione MySQL 'UNHEX()' alla tua query MySQL nel codice ZF, ad esempio:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

Funziona bene nel mio caso.

Modifica --Se anche la tua password salt è memorizzata in una colonna binaria (ad esempio se fosse anche una stringa esadecimale generata tramite la funzione SHA1), l'ultimo parametro di Zend_Auth_Adapter_DbTable dovrebbe essere:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))'Quindi, stiamo riconvertendo il salt in una stringa esadecimale minuscola prima di concatenarla con la password. HEX() restituisce il tuo salt in maiuscolo, quindi puoi semplicemente omettere la chiamata LOWER() se il tuo salt era originariamente maiuscolo prima di memorizzarlo usando UNHEX().