Zend排除没有Zend Auth的列

时间:2012-08-10 08:56:20

标签: php zend-framework

我正在编写一个函数来填充来自db的用户详细信息的会话。我需要排除密码和盐列,以便全局会话不会被填充。

使用以下方法可以轻松完成此操作:

$zendAuth->getResultRowObject(null, array("password", "salt"));

但是我需要在不使用$ zendAuth的情况下在其他地方执行此操作。

我有以下内容:

$usersTable = new Application_Model_DbTable_Users();

$zendSession = new Zend_Session_Namespace();

$zendSession->userData = $usersTable->fetchRow(
    $usersTable->select()
    ->from("users", array('id', 'first_name', 'last_name', 'email', 'status'))
    ->where("id = ?", $userInsertQuery)->setIntegrityCheck(false));

我必须将integrityCheck设置为false,因为我遇到了无法加入select语句的错误。

必须有一种更简单的方法可以使用$ usersTable

从数据库中获取某些列名

1 个答案:

答案 0 :(得分:0)

通常,您只需在DbTable模型或mapper类中添加一个方法即可为您获取此数据。对于您当前的问题,请尝试:

$usersTable = new Application_Model_DbTable_Users();

$zendSession = new Zend_Session_Namespace();
$select  = $usersTable->select();
$select->from($usersTable,array('id', 'first_name', 'last_name', 'email', 'status'))
       ->where("id = ?", $userInsertQuery);
$zendSession->userData = $usersTable->fetchRow($select);

Zend_Db_Select似乎认为你试图访问多个表,因为你使用了两种不同的方法(将一个对象作为tablename传递,一个字符串作为tablename )来访问同一个查询中的同一个表。 / p>

DbTable中的方法可能如下所示:

public function getUserData($id)
    {
        $select = $this->select();
        $select->from($this, array('id', 'first_name', 'last_name', 'email', 'status'));
        $select->where('id = ?', $id);

        $result = $this->fetchRow($select);
        return $result;
    }

然后在你的控制器中:

$usersTable = new Application_Model_DbTable_Users();
$user = $usersTable->getUserData($userInsertQuery);
$zendSession->userData = $user;

在所有这些之后,您可以使用Zend_Auth_Storage_Session存储您想要的信息,如下所示:

 if ($result->isValid()) {
     //store the username, first and last names of the user
      $auth = Zend_Auth::getInstance();
      $storage = $auth->getStorage();
      $storage->write($authAdapter->getResultRowObject(array(
                            'username', 'first_name', 'last_name'
       )));
      //or to save all except
      $storage->write($authAdapter->getResultRowObject(null, array('password', 'salt')); 
  } 

之后您可以通过调用以下方式调用该信息:

$auth = Zend_Auth::getInstance();
       $storage = $auth->getStorage();
       $strorage->read();

或者您可以使用Zend_Auth命名空间直接从Zend_Session_Namespace访问相同的信息:

$session = new Zend_Session_Namespace('Zend_Auth');
$member = $session->storage; //'storage' is the default. However the namespace and key can be changed.