数据库中不存在zend表单检查记录

I have a form that check if email exists in the database within 2 tables.

I'm using Zend_Validate_Db_NoRecordExists for both validate, but it only check the second one.

Any idea why it's not working?

class Application_Form_ReferUser extends Zend_Form
{
public $email, $freeDownload, $buyNow;

public function init()
{
    $this->setName('referUser');

    $EmailExists = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'referrals',
            'field' => 'email'
        )
    );

    $EmailExists2 = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'users',
            'field' => 'email'
        )
    );

    $EmailExists->setMessage('This e-mail is already taken');
    $EmailExists2->setMessage('This e-mail is already taken');

    $this->email = $this->createElement('text', 'email')
                     ->setLabel('Email')
                     ->addValidator($EmailExists)
                     ->addValidator($EmailExists2)
                     ->addValidator('EmailAddress')
                     ->setRequired(true);

    $this->freeDownload = $this->createElement('button', 'btn_free_download')
                            ->setLabel('Free Download')
                            ->setAttrib('type', 'submit');

    $this->buyNow = $this->createElement('button', 'btn_buy_now')
                            ->setLabel('Buy Now')
                            ->setAttrib('type', 'submit');

    $this->addElements(array($this->email, $this->freeDownload, $this->buyNow));

    $elementDecorators = array(
        'ViewHelper'
    );
    $this->setElementDecorators($elementDecorators);
}
}

I don't think you add same validator multiple times on an element. Check class Zend_Form_Element addValidator() line 1153. According to the code $this->_validators[$name] = $validator; when we add same validator to an element multiple times the former will be overridden.

I think you have to create a custom form validator or use isValid() separately on the element and validate it.

uses this:

addValidators (array $ validators, $ files = null)

ejem:

$this->addValidators(array($EmailExists,$EmailExists2,'EmailAddress'));

I work myself

$this ->addElement($email = new Zend_Form_Element_Text('email'));   

$email->setLabel('E-mail')
      ->addValidator('Db_NoRecordExists', false, array('table' => 'table1', 'field' => 'email'))
      ->addValidator('Db_NoRecordExists', false, array('table' => 'table2', 'field' => 'email'))
      ->addValidator('EmailAddress', false);

Try some thing like below (untested one),

$emailNotEmpty = new Zend_Validate_NotEmpty();
        $emailNotEmpty->setMessage('You must enter a email address.');
        $emailFormat = new Zend_Validate_Regex('/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/');
        $emailFormat->setMessage('You must enter a valid email address.');
        $emailUnique1 = new Zend_Validate_Db_NoRecordExists('referrals', 'email');
        $emailUnique1->setMessage('This email address is already registered.');
        $emailUnique2 = new Zend_Validate_Db_NoRecordExists('users', 'email');
        $emailUnique2->setMessage('This email address is already registered.');
        $email = new Zend_Form_Element_Text('email', array(
          'label' => 'Email Address:',
          'class' => 'text-size text hastip',
          'title' => $qtips_messages['key_email'],
          'tabindex' => '2',
          'required' => true,
          'value'=> '',
          'filters' => array('StringTrim'),
          'validators' => array(
            array($emailNotEmpty, true),
            array($emailFormat, true),
            array($emailUnique1,true),
            array($emailUnique2,true),
          ),
      'decorators' => $this->requiredElementDecorators,
      'description' => '<img src="../../images/star.png" alt="required" />',
        ));
        $this->addElement($email);