2013-02-28 20 views
0

我有一個使用Zend auth適配器運行良好的webapp登錄系統,但問題是我希望電子郵件在用戶登錄時不區分大小寫。我使用Oracle作爲後端數據庫通常我會使用LOWER(EMAIL)=LOWER(:email)方法。我試圖通過甲骨文的功能在setIdentityColumn(),但我得到的錯誤:Zend DbTable不區分大小寫

The supplied parameters to Zend_Auth_Adapter_DbTable failed to produce a valid sql statement, please check table and column names for validity.

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)

成這樣:

select * from "LOWER(:email)"

任何人看解決這個問題的方法?

親切的問候 彌敦道

回答

1

嘗試這樣的:

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

的問題是,如果你通過「LOWER(USERID)」作爲一個簡單的字符串,Zend公司就會把周圍的引號,造成它創建一個無效的查詢。使用Zend_Db_Expr將停止Zend執行此操作。