Code snippet to check if form typed email is
present in Database with Zend Framework / substitute for
Db_NoRecordExists (Db_RecordExists)
I'm writting a registration form and in Zend Framework (ZF) and I
came to the point where the input email form address had to be
stored in database if it's not already there.
Thus I needed a way to complete the task. Firstly I tried using
Db_NoRecordExists and Db_RecordExists which is the "proper" way to
complete this task in Zend Framework.
I tried to apply a code to my Zend Form similar to:
$email = new Zend_Form_SubForm();
$email->addElements(array(
$email_addr = new Zend_Form_Element_Text('email'),
));
$email_addr->setRequired(true)
->setLabel('Email:')
->setValue('email (Gmail, Yahoo, etc.)')
->addFilter('StringTrim')
->addFilter('StripTags')
->addValidator('EmailAddress', false)
->addValidator('Db_NoRecordExists', false, array('table' =>
'my_table_name','field' => 'email'))
->setAttribs(array('minlength' => '5', 'maxlength' =>
'40'));
Nevertheless I couldn't make the above code to work out, thus I
eventually ended up writting my own function in order to check if
the form input email is not already stored in database and if it's
stored to render again my Zend Registration input form.
Herein I present the code with a hope that somebody else that is a
juniour with PHP Zend Framework just I am will benefit out of
it.
1. First here is what is in my form controller
application/controller/RegistrationForm.php:
// pick up the email entered earlier from Zend Form
$this->email_address = $email_address =
$formData['email']['email'];
// if query_result = 1 then registrar has already an existant email
in db
$check_if_email_in_db = new Model_DbTable_Registration();
$query_result =
$check_if_email_in_db->checkUserisNotRegistered($this->email_address);
if($query_result == '1') {
$this-view->errorMsg =' Your email address is
already taken! Please type another one. ';
$this->form;
return;
}
In order to be able to use the above code you will also have to
have existing
application/models/DbTable/Registration.php or
whatever name you'd like to choose.
Within that file place code like:
class Model_DbTable_Registration extends
Zend_Db_Table_Abstract
{
// set database name
protected $_name = 'database.my_table_name';
public function checkUserisNotRegistered($email_address) {
if(empty($email_address))
throw new Exception('empty parameter passed.');
$where = $this->_db->quoteIdentifier('email') . ' =
"'.$email_address.'"';
$this->fetchAll($this->select()->where($where));
$result = $this->fetchAll($this->select()
->where($where));
$query_result = $result['0']['email'];
if($query_result == NULL) {
$query_result = '0';
} else {
$query_result = '1';
}
return $query_result;
}
}
Of course change the
database.my_table_name with whatever
your database and table name is, also assure $email_address which
is defined by the above code
$this->email_address =
$email_address = $formData['email']['email']; has to be
properly tuned in your
application/controller/RegistrationController.php or
whatever it is called. In my case I use the
$formData data
array to store my
email variable earlier taken by the
Zend Form I use the following code to check if my request is
properly posted by the Zend_Form:
if ($this->getRequest()->isPost()) {
$formData = $this->_request->getPost();
....
}
As you can see I use $formData to get Zend_Form posted conteny, if
you use another modify the above code to math up with it.
Hope that's helpful to somebody out there!
Feedback as always is very welcome.
}