Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die bereitgestellten Parameter für Zend_Auth_Adapter_DbTable konnten keine gültige SQL-Anweisung erzeugen

Es hängt von der MySQL-Version ab, wie oben beschrieben. Folgende MySQL-Dokumentationen für Version 5.5:

„Wenn eine Anwendung Werte von einer Funktion wie MD5() oder SHA1() speichert, die eine Zeichenfolge aus Hexadezimalziffern zurückgibt, können effizientere Speicherung und Vergleiche erzielt werden, indem die Hexadezimaldarstellung mit UNHEX() in eine Binärdatei konvertiert und das Ergebnis in gespeichert wird eine BINARY(N)-Spalte.Jedes Paar Hexadezimalziffern erfordert ein Byte in Binärform, daher hängt der Wert von N von der Länge der Hexadezimalzeichenfolge ab.N ist 16 für einen MD5()-Wert und 20 für einen SHA1()-Wert ."

Anstatt die MySQL-Version herunterzustufen, können Sie also wie folgt vorgehen:

  • Ändern Sie den Typ der Spalte „Passwort“ von varchar(32) in binary(16)
  • Fügen Sie die MySQL-Funktion 'UNHEX()' zu Ihrer MySQL-Abfrage in ZF-Code hinzu, zum Beispiel:
$adapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'user',
    'login',
    'password',
    'UNHEX(MD5(CONCAT(?, passwordSalt)))'
);

In meinem Fall funktioniert es gut.

Bearbeiten --Wenn Ihr Passwort-Salt auch in einer binären Spalte gespeichert ist (z. B. wenn es auch ein Hex-String war, der durch die SHA1-Funktion generiert wurde), dann sollte der letzte Parameter der Zend_Auth_Adapter_DbTable sein:'UNHEX(SHA1(CONCAT(?, LOWER( HEX(salt)))))'Also wandeln wir das Salt zurück in einen Hex-String in Kleinbuchstaben, bevor wir es mit dem Passwort verketten. HEX() gibt Ihr Salt in Großbuchstaben zurück, sodass Sie den LOWER()-Aufruf einfach weglassen können, wenn Ihr Salt ursprünglich in Großbuchstaben geschrieben war, bevor Sie es mit UNHEX() gespeichert haben.