<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect2 id="zend.validate.Db">
    <title>Db_RecordExists et Db_NoRecordExists</title>

    <para>
        <classname>Zend_Validate_Db_RecordExists</classname> et
        <classname>Zend_Validate_Db_NoRecordExists</classname> permettent de vérifier si un enregistrement
        existe (ou pas) dans une table de base de données.
    </para>

    <sect3 id="zend.validate.set.db.options">
        <title>Options supportées par Zend_Validate_Db_*</title>

        <para>
            Les options suivantes sont supportées par
            <classname>Zend_Validate_Db_NoRecordExists</classname> et
            <classname>Zend_Validate_Db_RecordExists</classname>&#160;:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><property>adapter</property></emphasis>&#160;: l'adaptateur de base
                    de données qui sera utilisé pour la recherche.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>exclude</property></emphasis>&#160;: jeu d'enregistrements
                    qui seront exclus de la recherche.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>field</property></emphasis>&#160;: le champs dans la table
                    de la base de données dans lequel sera effectué la recherche.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>schema</property></emphasis>&#160;: le schéma utilisé
                    pour la recherche.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><property>table</property></emphasis>&#160;: la table qui sera
                    utilisée pour la recherche.
                </para>
            </listitem>
        </itemizedlist>
    </sect3>

    <sect3 id="zend.validate.db.basic-usage">
        <title>Utilisation de base</title>

        <para>
            Voici un exemple basique:
        </para>

        <programlisting language="php"><![CDATA[
//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";
    }
}
]]></programlisting>

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

        <programlisting language="php"><![CDATA[
//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";
    }
}
]]></programlisting>

        <para>
            Le code ci-dessus vérifie l'absence d'un nom d'utilisateur <varname>$username</varname>
            vis à vis d'un champ d'une table de base de données.
        </para>
    </sect3>

    <sect3 id="zend.validate.db.excluding-records">
        <title>Exclure des enregistrement</title>

        <para>
            <classname>Zend_Validate_Db_RecordExists</classname> et
            <classname>Zend_Validate_Db_NoRecordExists</classname> 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".
        </para>

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

        <programlisting language="php"><![CDATA[
// 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";
    }
}
]]></programlisting>

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

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

        <programlisting language="php"><![CDATA[
$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";
    }
}
]]></programlisting>

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

    <sect3 id="zend.validate.db.database-adapters">
        <title>Adaptateurs de base de données</title>

        <para>
            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:
        </para>

        <programlisting language="php"><![CDATA[
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table' => 'users',
        'field' => 'id',
        'adapter' => $dbAdapter
    )
);
]]></programlisting>
    </sect3>

    <sect3 id="zend.validate.db.database-schemas">
        <title>Nom des bases de données</title>

        <para>
            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
            <property>table</property> et <property>schema</property>. Voici un exemple&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table'  => 'users',
        'schema' => 'my',
        'field'  => 'id'
    )
);
]]></programlisting>
    </sect3>
</sect2>
