# Db_RecordExists et Db_NoRecordExists

`Zend_Validate_Db_RecordExists` et `Zend_Validate_Db_NoRecordExists` permettent de vérifier si un enregistrement existe (ou pas) dans une table de base de données.

## Options supportées par Zend_Validate_Db_*

Les options suivantes sont supportées par `Zend_Validate_Db_NoRecordExists` et `Zend_Validate_Db_RecordExists` :

- adapter : l'adaptateur de base de données qui sera utilisé pour la recherche.

- exclude : jeu d'enregistrements qui seront exclus de la recherche.

- field : le champs dans la table de la base de données dans lequel sera effectué la recherche.

- schema : le schéma utilisé pour la recherche.

- table : la table qui sera utilisée pour la recherche.

## Utilisation de base

Voici un exemple basique:

    //Vérifie que l'email existe bien dans la base de données
    $validator = new Zend_Validate_Db_RecordExists(
        array(
            'table' => 'users',
            'field' => 'emailaddress'
        )
    );

    if ($validator->isValid($emailaddress)) {
        // l'adresse email existe
    } else {
        // l'adresse email n'existe pas, affichons les messages d'erreur
        foreach ($validator->getMessages() as $message) {
            echo "$message\n";
        }
    }

Le code ci-dessus vérifie la présence d'une adresse email `$emailaddress` vis à vis d'un champ d'une table de base de données.

    //Vérifie que le nom d'utilisateur n'est pas présent dans la table
    $validator = new Zend_Validate_Db_NoRecordExists(
        array(
            'table' => 'users',
            'field' => 'username'
        )
    );
    if ($validator->isValid($username)) {
        // Le nom d'utilisateur semble absent de la table
    } else {
        // invalide : l'utilisateur est probablement présent dans la table
        $messages = $validator->getMessages();
        foreach ($messages as $message) {
            echo "$message\n";
        }
    }

Le code ci-dessus vérifie l'absence d'un nom d'utilisateur `$username` vis à vis d'un champ d'une table de base de données.

## Exclure des enregistrement

`Zend_Validate_Db_RecordExists` et `Zend_Validate_Db_NoRecordExists` proposent aussi un moyen de tester la base de données en excluant certaines parties de table, en passant une clause where ou un tableau de paires "champs" "valeur".

Lorsqu'un tableau est passé, l'opérateur != est utilisé et vous pouvez ainsi tester le reste de la table.

    // Vérifie qu'aucun autre utilisateur que celui dont l'id est spécifié,
    // ne possède ce nom
    $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)) {
        // OK
    } else {
        // KO
        $messages = $validator->getMessages();
        foreach ($messages as $message) {
            echo "$message\n";
        }
    }

L'exemple ci dessus va vérifier dans la table qu'aucun autre enregistrement que celui pour lequel `id = $user_id` ne contient la valeur `$username`.

La clause d'exclusion peut aussi être renseignée avec une chaine afin de pouvoir utiliser un opérateur autre que !=.

    $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)) {
        // OK
    } else {
        // KO
        $messages = $validator->getMessages();
        foreach ($messages as $message) {
            echo "$message\n";
        }
    }

L'exemple ci-dessus vérifie la table 'users' pour s'assurer qu'un seul enregistrement avec un nom `$username` et un email `$email` est valide.

## Adaptateurs de base de données

Un adaptateur spécifique peut être passé au validateur. Dans le cas contraire, il utilisera l'adaptateur déclaré comme étant celui par défaut:

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

## Nom des bases de données

Vous pouvez spécifier un nom de base de données (schéma) pour l'adaptateur PostgreSQL et DB/2 simplement grâce à un tableau possédant les clés table et schema. Voici un exemple :

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