0

Zend認証アダプターを使用してうまく機能するWebアプリケーションのログインシステムがありますが、問題は、ユーザーがログインするときに電子メールの大文字と小文字を区別しないようにすることです。バックエンドDBとしてOracleを使用しており、通常はLOWER(EMAIL)=LOWER(:email)メソッドを使用します. setIdentityColumn() でその Oracle 関数を渡そうとしましたが、エラーが発生しました。

Zend_Auth_Adapter_DbTable に指定されたパラメータは、有効な SQL ステートメントを生成できませんでした。テーブル名とカラム名が有効かどうかを確認してください。

protected function _getAuthAdapter()
{
    //$dbAdapter = Zend_Db_Table::getDefaultAdapter();
    $db = Zend_Registry::get('db');
    $authAdapter = new Zend_Auth_Adapter_DbTable($db);
    $authAdapter->setTableName('USER_TABLE')
        ->setIdentityColumn('LOWER(EMAIL)') //Tried to pass LOWER()
        ->setCredentialColumn('ENCODED_PW')
        ->setCredentialColumn('PASSWORD');
    return $authAdapter;
}

_authenticateCreateSelect()エラーは、Zend_Auth_Adapter_DbTableクラス内の関数から発生しています。問題は、スクリプトのこの部分です。

$dbSelect->from($this->_tableName, array('*', $credentialExpression))
             ->where($this->_zendDb->quoteIdentifier($this->_identityColumn, true) . '   = ?', $this->_identity);

quoteIdentifier()メソッドは PHP に似ており、次のquote()ようなクエリを実行しています。

select * from LOWER(:email)

これに:

「LOWER(:email)」から*を選択

誰でもこれを回避する方法を見ますか?

敬具ネイサン

4

1 に答える 1

1

次のようなことを試してください:

$authAdapter->setTableName('USER_TABLE')
            ->setIdentityColumn(new Zend_Db_Expr('LOWER(USERID)'))
             ->setCredentialColumn('PASSWORD');

問題は、'LOWER(USERID)' を単純な文字列として渡すと、Zend が引用符で囲み、無効なクエリが作成されることです。Zend_Db_Expr を使用すると、Zend がこれを実行しなくなります。

于 2013-02-28T09:54:14.263 に答える