Zend DbTable不区分大小写

时间:2013-02-28 09:47:47

标签: oracle zend-framework zend-db zend-auth

我的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)”

中选择*

有人看到这个方法吗?

亲切的问候 森

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

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

问题是如果你将'LOWER(USERID)'作为一个简单的字符串传递,Zend会在它周围加上引号,导致它创建一个无效的查询。使用Zend_Db_Expr将阻止Zend执行此操作。