0

我的 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(:email) 中选择 *

进入这个:

从“LOWER(:电子邮件)”中选择 *

有人看到解决方法吗?

亲切的问候内森

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 回答