# Db_RecordExists and Db_NoRecordExists

`Zend_Validate_Db_RecordExists` and `Zend_Validate_Db_NoRecordExists` provide a means to test whether a record exists in a given table of a database, with a given value.

## Supported options for Zend_Validate_Db_*

The following options are supported for `Zend_Validate_Db_NoRecordExists` and `Zend_Validate_Db_RecordExists`:

- adapter: The database adapter which will be used for the search.

- exclude: Sets records which will be excluded from the search.

- field: The database field within this table which will be searched for the record.

- schema: Sets the schema which will be used for the search.

- table: The table which will be searched for the record.

## Basic usage

An example of basic usage of the validators:

    //Check that the email address exists in the database
    $validator = new Zend_Validate_Db_RecordExists(
        array(
            'table' => 'users',
            'field' => 'emailaddress'
        )
    );

    if ($validator->isValid($emailaddress)) {
        // email address appears to be valid
    } else {
        // email address is invalid; print the reasons
        foreach ($validator->getMessages() as $message) {
            echo "$message\n";
        }
    }

The above will test that a given email address is in the database table. If no record is found containing the value of `$emailaddress` in the specified column, then an error message is displayed.

    //Check that the username is not present in the database
    $validator = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'users',
            'field' => 'username'
        )
    );
    if ($validator->isValid($username)) {
        // username appears to be valid
    } else {
        // username is invalid; print the reason
        $messages = $validator->getMessages();
        foreach ($messages as $message) {
            echo "$message\n";
        }
    }

The above will test that a given username is not in the database table. If a record is found containing the value of `$username` in the specified column, then an error message is displayed.

## Excluding records

`Zend_Validate_Db_RecordExists` and `Zend_Validate_Db_NoRecordExists` also provide a means to test the database, excluding a part of the table, either by providing a where clause as a string, or an array with the keys "field" and "value".

When providing an array for the exclude clause, the != operator is used, so you can check the rest of a table for a value before altering a record (for example on a user profile form)

    //Check no other users have the username
    $user_id   = $user->getId();
    $validator = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'users',
            'field' => 'username',
            'exclude' => array(
                'field' => 'id',
                'value' => $user_id
            )
        )
    );

    if ($validator->isValid($username)) {
        // username appears to be valid
    } else {
        // username is invalid; print the reason
        $messages = $validator->getMessages();
        foreach ($messages as $message) {
            echo "$message\n";
        }
    }

The above example will check the table to ensure no records other than the one where `id = $user_id` contains the value $username.

You can also provide a string to the exclude clause so you can use an operator other than !=. This can be useful for testing against composite keys.

    $email     = 'user@example.com';
    $clause    = $db->quoteInto('email = ?', $email);
    $validator = new Zend_Validate_Db_RecordExists(
        array(
            'table'   => 'users',
            'field'   => 'username',
            'exclude' => $clause
        )
    );

    if ($validator->isValid($username)) {
        // username appears to be valid
    } else {
        // username is invalid; print the reason
        $messages = $validator->getMessages();
        foreach ($messages as $message) {
            echo "$message\n";
        }
    }

The above example will check the 'users' table to ensure that only a record with both the username `$username` and with the email `$email` is valid.

## Database Adapters

You can also specify an adapter. This will allow you to work with applications using multiple database adapters, or where you have not set a default adapter. As in the example below:

    $validator = new Zend_Validate_Db_RecordExists(
        array(
            'table' => 'users',
            'field' => 'id',
            'adapter' => $dbAdapter
        )
    );

## Database Schemas

You can specify a schema within your database for adapters such as PostgreSQL and DB/2 by simply supplying an array with table and schema keys. As in the example below:

    $validator = new Zend_Validate_Db_RecordExists(
        array(
            'table'  => 'users',
            'schema' => 'my',
            'field'  => 'id'
        )
    );