我的webapp登录系统使用Zend auth适配器运行良好,但问题是我希望用户登录时电子邮件不区分大小写。我使用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()
一样,正在转变这样的查询:
从LOWER(:电子邮件)中选择*
进入这个:
从“LOWER(:email)”
中选择*
有人看到这个方法吗?
亲切的问候 森
答案 0 :(得分:1)
尝试这样的事情:
$authAdapter->setTableName('USER_TABLE')
->setIdentityColumn(new Zend_Db_Expr('LOWER(USERID)'))
->setCredentialColumn('PASSWORD');
问题是如果你将'LOWER(USERID)'作为一个简单的字符串传递,Zend会在它周围加上引号,导致它创建一个无效的查询。使用Zend_Db_Expr将阻止Zend执行此操作。