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)」から*を選択
誰でもこれを回避する方法を見ますか?
敬具ネイサン