3

我正在开发一个基于 Zend 框架的项目。在用户注册中,我必须检查唯一的电子邮件。当我第一次注册用户时,我的代码工作正常,但是当我尝试更新用户信息并按下更新按钮时,它会给出错误消息:

Email already taken 

请帮我解决这个问题。我的代码附在下面:

$this->addElement('text', 'email', array(
                'label'      => 'Your email address:',
                'required'   => true,
                'filters'    => array('StringTrim'),
                'validators' => array(
                        'EmailAddress',
                        array('Db_NoRecordExists', true, array(
                                'table' => 'users',
                                'field' => 'email',
                                'messages' => array(
                                        'recordFound' => 'Email already taken'
                                )
                        )
                        )
                )
        ));

我已将控制器更改为:

public function addAction()
    {
        $modelUsers = new Model_Users();
        $userId = $this->_getParam('userId');
        $form = $this->_getAddForm();

        if ($userId) {              
            $populateData = array();

            $user = $modelUsers->fetch($userId);

            if ($user instanceof Model_User) {
                $populateData = $user->toArray();
            }

            $form->populate($populateData);
        }

        $request = $this->getRequest();

        if ($request->isPost()) {
            $email = $this->getRequest()->getParam('email');
            if (strtolower(trim($email)) == $modelUsers->fetchByEmail($email)) {
                // change $this->_user->getAccount()->getEmail() to retrieve the user's current email address

                // remove validator from form
                $form->getElement('email')->removeValidator('Db_NoRecordExists');
            }

            $post = $request->getPost();

            if ($form->isValid($post)) {
                $values = $form->getValidValues($post);
                $data = array(
                    'firstName'     => $values['firstName'],
                    'userTypeId'    => 2,
                    'lastName'      => $values['lastName'],
                    'email'         => $values['email'],
                    'userName'      => $values['userName'],
                    'password'      => $values['password'],
                    'role'          => $values['role']
                );

                if ($userId) {
                    $user = $modelUsers->fetch($userId);
                    if ($user instanceof Model_User) {
                        $user->setFromArray($data);
                        $success = $user->save();
                        if ($success) {
                            echo Zend_Json::encode(array('status' => self::STATUS_SUCCESS, 'message' => 'Successfully updated the user!'));
                            exit;
                        }
                    }
                } else {
                    $user = $modelUsers->createRow($data);
                    $success = $user->save();
                    if ($success) {
                        echo Zend_Json::encode(array('status' => self::STATUS_SUCCESS, 'message' => 'Successfully added the user!'));
                        exit;
                    }

                }
                echo Zend_Json::encode(array('status' => self::STATUS_FAILED, 'message' => 'user not added'));
                exit;               
            } else {

                $errors = array();
                $errors = $form->errors();              

                echo Zend_Json::encode(array('status' => self::STATUS_ERROR, 'data' => $errors));
                exit;

            }
        }

        $this->view->form = $form;
        $this->_helper->layout->disableLayout();

    }

模型:

public function fetchByEmail($email)
{
    $email=fetchOne('SELECT email FROM users WHERE email = $email');
    //$select->where('email=?',$email) ;
    //$student = $this->fetchRow($select);
    return $email;
}

但这仍然行不通

4

2 回答 2

2

解决此问题的一种简单方法是在编辑表单时从该表单元素中删除验证器。如果他们试图更改他们的电子邮件地址,您可能还希望保留验证器,因为他们不应该能够将他们的电子邮件更改为数据库中已经存在的电子邮件。

将验证器留在您的Zend_Form类中,仅在编辑用户时添加此代码。

if ($this->getRequest->isPost()) {
    $email = $this->getRequest()->getParam('email'); // get email from form

    // if email address has not changed, remove validator from form
    if (strtolower(trim($email)) == $this->_user->getAccount()->getEmail()) {
       // change $this->_user->getAccount()->getEmail() to retrieve the user's current email address

       // remove validator from form
       $form->getElement('email')->removeValidator('Db_NoRecordExists');
    }

    // validate form
    if ($form->isValid($this->getRequest()->getPost()) {
        //...
    }
}

因此,您要做的Db_NoRecordExists是在编辑表单时从表单元素中删除验证器,并且只有在他们不尝试更改其电子邮件地址的情况下才允许这样做。

于 2012-09-15T07:31:40.447 回答
1

它总是会给你这个错误,因为你正在使用验证,该电子邮件是否存在于数据库表中。

但是电子邮件存在于数据库中,这就是它给出错误的原因。

删除此验证,它将对您有所帮助。

if(isset($_SESSION['session_id']))
{
     // code for update query
}
else
{
     // code for insert query
}
于 2012-09-15T06:03:34.103 回答