Recaptcha dans le fichier validation.php

Bonjour,

Je ne suis pas informaticien...

Il y a quelques années, grâce entre autre à ce forum, j'avais réalisé un formulaire de contact en html et sa validation en php.
Ce système fonctionnerait très bien s'il n'était pas l'objet d'attaque par des spams (jusqu'à 200 par jour).

Je pense donc lui ajouter le recaptcha de Google.

J'ai suivi ce que préconise Google:

  • pas de problème pour mettre la clé publique dans formulaire.html
  • pas de problème non plus pour vérifier la clé privée avec validation.php

Les choses se compliquent pour moi si je veux que validation.php continue à vérifier les champs ("Vous n'avez pas rempli ce champ") tout en vérifiant si le recaptcha a bien été coché ("Vous n'avez pas coché le recaptcha"). Je veux que l'envoi du formulaire ne se fasse que si les champs obligatoires ont bien été remplis ET QUE la case du recaptcha a bien été cochée. Seulement à ce moment là le message "Votre formulaire à bien ete transmis" doit apparaitre.

Voici donc ce que j'ai ajouté à mon formulaire formulaire.html

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Contacter</title>
<script src='https://www.google.com/recaptcha/api.js'></script>

</head>

<body>

            <form name="formulaire" action="validation.php" method="post">

                    <div class="g-recaptcha" data-sitekey="6LcQ_3sUAAAAAEKRH6mB8ICwS2zC8oAuRmTHUG0R"></div>                 
                    <input type="submit" name="enregistrer" value="Valider" style="font-weight: 700" />
                    <input type="reset" name="annuler" value="Annuler" style="font-weight: 700" />

</form>

</body>

</html>

Voici ma page validation php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Validation du formulaire PHP</title>

</head>

<body>

<?php

/*On extrait les $_POST de tous les champs et seulement des champs*/
//&& : obligatoire
//OR : facultatif
//Ici il y a de l'obligatoire && et du facultatif OR

//La fonction prédéfinie isset() permet de déterminer si une variable a bien été créée et si elle contient une valeur.
//Récupération des variables envoyées par la méthode POST, $_POST étant aussi une variable
//Simplification des variables par la fonction EXTRACT qui extrait les variables
if(isset($_POST) OR isset($_POST["civilite"]) && isset($_POST["nom"]) OR isset($_POST["prenom"]) OR isset($_POST["adresse"]) OR isset($_POST["codepostal"]) OR isset($_POST["ville"]) && isset($_POST["email"]) OR isset($_POST["fixe"]) OR isset($_POST["portable"]) OR isset($_POST["personnes"]) OR isset($_POST["jour"]) OR isset($_POST["mois"]) OR isset($_POST["annee"])  OR isset($_POST["formule"]) OR isset($_POST["connu"]) OR isset($_POST["autre"]) && isset($_POST["message"]))
extract($_POST);

/*On vérifie un par un les champs, les cases à choix simple, les cases à choix multiple, les menus déroulants. Tout doit être rempli, coché ou sélectionné. Rien ne doit rester vide.*/ 

//On vérifie si les variables ne sont pas vides
//! signifie NON : !empty signifie NON vide
    if(isset($_POST["nom"]) && !empty($nom)){
        if(isset($_POST["email"]) && !empty($email)){

/*On vérifie qu'on a bien rentré une adresse e-mail valide.
#^[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]{2,}\.[a-zA-Z]{2,4}$#
Explications rapides : c'est ce qu'on appelle une EXPRESSION REGULIERE
#^ Commencement
$# Fin
[a-zA-Z0-9-_.] Doit commencer par une chaine alphanumérique avec ou sans majuscules (autorisant aussi les caractères -_ et .)
+@ Puis le signe @
[a-zA-Z0-9-_.]{2,} Puis de nouveau une chaine alphanumérique avec ou sans majuscules (autorisant aussi les caractères -_ et .) Cette chaine est composée d'un minimum de 2 caractères sans maximum fixé
\.[a-zA-Z]{2,4} Et enfin un '.' suivi de 2 à 4 lettres [.fr, .com, .info, ...et même .FR, .COM, .INFO]*/            
            if (preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-zA-Z]{2,4}$#", $_POST['email'])){ 

                if(isset($_POST["message"]) && !empty($message)){

//La fonction srt_replace signifie qu'on remplace \' par ' dans la variable $message
                                            $message=str_replace("\'","'",$message);
                                            $destinataire="igloos@gmail.com";
                                            $sujet="Message depuis le formulaire LES IGLOOS DU QUEYRAS";

/*Attention au changement de variable
Ici les choix multiples sont nommés "connu"
Ils sont renommés "connus" par la formule magique suivante*/
                                            $connus = '';
                                            foreach($connu as $c => $v){
                                            $connus .= $v.' - ';
                                            }
                                            $msg="Un nouveau message est arrive \n
                                            Civilite: $civilite \n
                                            Nom: $nom \n
                                            Prenom: $prenom \n
                                            Adresse: $adresse \n
                                            Code postal: $codepostal \n
                                            Ville: $ville \n
                                            Email: $email \n
                                            Telephone fixe: $fixe \n
                                            Telephone portable: $portable \n
                                            Nombre de personnes: $personnes \n
                                            Date de la nuit souhaitee: $jour $mois $annee \n
                                            Formule souhaitee: $formule \n
                                            Connu grace a: $connus \n
                                            Autre: $autre \n
                                            Message: $message";

/*Si plusieurs destinataires:
                Les headers se présentent ainsi:
                Le .= concatène une chaine et stocke le résultat dans une variable
                $headers  = "From: $email" . "\r\n";
                $headers .= "Cc: toiencopie@exemple.fr" . "\r\n";
                $headers .= "Bcc: luiencache@exemple.fr" . "\r\n";*/
                                            $headers  = "From: $email" . "\r\n";
                                            $headers .= "Bcc: serge@orange.fr" . "\r\n";
                                            $headers .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n"; 
                                            $headers .= "Content-Transfer-Encoding: 8bit"."\n"; 
                                            $headers .= "Disposition-Notification-To: $email";

/*Les champs de la fonction mail() sont toujours dans l'ordre:
destinataire, sujet, corps du message, entete*/                                                                                     
                                            mail($destinataire, $sujet, $msg, $headers);

                echo("<h2><center>Votre message a bien été envoyé.<br>
                LES IGLOOS DU QUEYRAS vous répondront dans les plus brefs délais.</center></h2>");
            }

            else{
                echo("<h2><center>Vous n'avez pas rempli le champ Message!<br>
                Votre formulaire n'a pas été transmis.<br>
                Merci de bien vouloir renseigner le champ Message.</center></h2>");
            }
        }
        else{
            echo("<h2><center>L'adresse e-mail que vous avez saisie n'est pas valide!<br>
            Votre formulaire n'a pas été transmis.<br>
            Merci de bien vouloir saisir une adresse e-mail valide.</center></h2>");
        }
    }
    else{
        echo("<h2><center>Vous n'avez pas écrit votre adresse e-mail!<br>
        Votre formulaire n'a pas été transmis.<br>
        Merci de bien vouloir saisir votre adresse e-mail.</center></h2>");
    }
}   
else{
    echo("<h2><center>Vous n'avez pas rempli le champ Nom!<br>
    Votre formulaire n'a pas été transmis.<br>
    Merci de bien vouloir renseigner le champ Nom.</center></h2>");
}

?>

Et voici le code php, que j'ai testé (et qui fonctionne bien en test) et que je dois placer sur validation.php (oui mais comment??)

    // Ma clé privée
    $secret = "ma_cle_secrete_a_moi";
    // Paramètre renvoyé par le recaptcha
    $response = $_POST['g-recaptcha-response'];
    // On récupère l'IP de l'utilisateur
    $remoteip = $_SERVER['REMOTE_ADDR'];

    $api_url = "https://www.google.com/recaptcha/api/siteverify?secret=" 
        . $secret
        . "&response=" . $response
        . "&remoteip=" . $remoteip ;

    $decode = json_decode(file_get_contents($api_url), true);

    // C'est un humain
    if ($decode['success'] == true) {
        echo("<h2><center>OK</center></h2>");
    }

    // C'est un robot ou le code de vérification est incorrect
    else {      
        echo("<h2><center>NON</center></h2>");
    }

Votre aide serait vraiment la bienvenue, j'ai passé toute la nuit là dessus, mais ma compétence est très limitée.
Merci à vous.
Albert

11 réponses


albert
Auteur
Réponse acceptée

Ca marche Lartak!!!!
Je n'y croyais pas!
Ca marche même bien, j'ai tous mes textes de vérification du formulaire. Ce dernier n'est envoyé que si tout est bon. (cad si le recaptdha est aussi coché)
Merci vraiment beaucoup Lartak.
Celà fait 38 heures que je n'ai pas dormi, je vais me coucher l'esprit tranquille.
Encore merci!!!

Bonjour.
D'après le code que vous montrez, si je récapitule, vous avez un formulaire qui contient seulement le ReCaptcha sur une page, puis un second formulaire qui serait sur une autre page et vous voudriez pouvoir faire la validation des deux formulaires en même temps.
Si c'est bien ça, ce n'est pas possible.

albert
Auteur

Bonjour Lartak,

Merci de bien vouloir me répondre.
Non, je n'ai qu'un seul formulaire que j'ai nommé formulaire.html (ci-dessus).
J'y ai mis la partie du recaptcha "formulaire" (JavaScript + clé publique).
La validation se faire sur la page validation.php.
Je veux valider les champs et aussi le recaptcha coché....mais je ne sais pas faire....
Merci de votre aide

Je veux valider les champs et aussi le recaptcha coché....mais je ne sais pas faire....

De quels champs parlez vous ?
Dans le formulaire que vous montrez dans le premier bloc de code (formulaire.html), il n'y a que le ReCaptcha, l'input de type submit et l'input de type reset.
Je n'y vois aucun autre champs.

albert
Auteur

Pour simplifier la page au maximum, je n'ai laissé que ce qui concerne le recaptcha.
Voici l'integralité du formulaire.
page formulaire.html

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>Contacter les igloos du Queyras à Molines (Hautes-Alpes): nuit insolite</title>

<script src='https://www.google.com/recaptcha/api.js'></script>

</head>

<body background="photos/20050202.jpg" style="background-attachment: fixed; background-size:cover;" text="#0000FF" link="#0000FF">

<STYLE>  
<!--a:hover{color: white;background: #0000FF;}-->
</STYLE>

<div align="center">

<table border="0" width="78%" cellpadding="10" id="table12" bgcolor="#A0D1EF">
    <tr>
        <td width="100%" style="border: 3px ridge white">

            <form name="formulaire" action="validation.php" method="post">

            <fieldset color="#0000FF"> 

                <br />    

                <legend><b><font color="#0000FF" style="font-size: 16pt">Vos coordonnées</font></b></legend>

                <br />

                <table border="0" id="table13">

                    <tr>

                        <td><font color="#0000FF">
                        <input type="radio" name="civilite" value="monsieur" style="font-weight: 700" /></font></td>

                        <td><b>Monsieur</b></td>

                        <td><font color="#0000FF">
                        <input type="radio" name="civilite" value="madame" style="font-weight: 700" /></font></td>

                        <td><b>Madame</b></td>

                        <td><font color="#0000FF">
                        <input type="radio" name="civilite" value="mademoidelle" style="font-weight: 700" /></font></td>

                        <td><b>Mademoiselle</b></td>

                    </tr>

                </table>

                <table border="0" id="table14">

                    <tr>

                        <td align="left"><b>Nom<font color="#0000FF"> </font>
                        <font color="#FF0000" style="font-size: 9pt">(champ 
                        obligatoire)</font></b></td>

                        <td><font color="#0000FF">
                        <input name="nom" size="35" style="font-weight: 700"></font></td>

                    </tr>

                    <tr>
                        <td align="left"><b>Pr&eacute;nom</b></td>

                        <td><input type="text" name="prenom" size="35"></td>

                    </tr>

                    <tr>
                        <td align="left"><b>Adresse</b></td>

                        <td><textarea name="adresse" rows="3" cols="33"></textarea></td>

                    </tr>

                    <tr>

                        <td align="left"><b>Code postal</b></td>

                        <td><input type="text" name="codepostal" size="10"></td>

                    </tr>

                    <tr>

                        <td align="left"><b>Ville</b></td>

                        <td><input type="text" name="ville" size="35"></td>

                    </tr>

                    <tr>

                        <td align="left"><b>E-Mail<font color="#0000FF"> </font>
                        <font style="FONT-SIZE: 9pt" color="#ff0000">(champ 
                        obligatoire)</font></b></td>

                        <td><input type="text" name="email" size="35"></td>

                    </tr>

                    <tr>

                        <td align="left"><b>Téléphone fixe</b></td>

                        <td><input type="text" name="fixe" size="17"></td>

                    </tr>

                    <tr>

                        <td align="left"><b>Téléphone portable</b></td>

                        <td><input type="text" name="portable" size="17"></td>

                    </tr>

                    </table>

            </fieldset>

            <hr size="3" noshade="noshade" />               

            <fieldset>

               <br />

                <legend><b><font color="#0000FF" style="font-size: 16pt">Vos souhaits pour votre 
                nuit en igloo</font></b></legend>

                <br />

                <table border="0" id="table15">

                    <tr>

                        <td align="left"><b>Nombre de 
                        personnes</b></td>

                        <td>

                            <font color="#0000FF">
                            <select name="personnes" style="font-weight: 700">
                                <option></option>
                                <option>2</option>
                                <option>3</option>
                                <option>4</option>
                                <option>5</option>
                                <option>6</option>
                                <option>7</option>
                                <option>8</option>
                                <option>9</option>
                                <option>10</option>
                                <option>11</option>
                                <option>12</option>
                                <option>plus?</option>
                            </select></font>

                        </td>

                    </tr>

                    <tr>

                        <td align="left"><b>Date de la nuit souhaitée </b></td>

                        <td>

                            <font color="#0000FF">
                            <select name="jour" style="font-weight: 700">
                                <option></option>
                                <option>01</option>
                                <option>02</option>
                                <option>03</option>
                                <option>04</option>
                                <option>05</option>
                                <option>06</option>
                                <option>07</option>
                                <option>08</option>
                                <option>09</option>
                                <option>10</option>
                                <option>11</option>
                                <option>12</option>
                                <option>13</option>
                                <option>14</option>
                                <option>15</option>
                                <option>16</option>
                                <option>17</option>
                                <option>18</option>
                                <option>19</option>
                                <option>20</option>
                                <option>21</option>
                                <option>22</option>
                                <option>23</option>
                                <option>24</option>
                                <option>25</option>
                                <option>26</option>
                                <option>27</option>
                                <option>28</option>
                                <option>29</option>
                                <option>30</option>
                                <option>31</option>
                            </select></font>

                            <font color="#0000FF">

                            <select name="mois" style="font-weight: 700">
                                <option></option>
                                <option>01</option>
                                <option>02</option>
                                <option>03</option>
                                <option>04</option>
                                <option>05</option>
                                <option>06</option>
                                <option>07</option>
                                <option>08</option>
                                <option>09</option>
                                <option>10</option>
                                <option>11</option>
                                <option>12</option>
                            </select>

                            <select name="annee" style="font-weight: 700">
                                <option></option>
                                <option>2016</option>
                                <option>2017</option>
                                <option>2018</option>
                                <option>2019</option>
                                <option>2020</option>
                                <option>2021</option>
                                <option>2022</option>
                                <option>2023</option>
                                <option>2024</option>
                                <option>2025</option>
                                <option>2026</option>
                                <option>2027</option>
                                <option>2028</option>
                                <option>2029</option>
                                <option>2030</option>
                                <option>2031</option>
                                <option>2032</option>
                                <option>2033</option>
                                <option>2034</option>
                                <option>2035</option>
                                <option>2036</option>
                                <option>2037</option>
                                <option>2038</option>
                                <option>2038</option>
                                <option>2040</option>
                                <option>2041</option>
                                <option>2042</option>
                                <option>2043</option>
                                <option>2044</option>
                                <option>2045</option>
                                <option>2046</option>
                                <option>2047</option>
                                <option>2048</option>
                                <option>2049</option>
                                <option>2050</option>
                                <option>2051</option>
                                <option>2052</option>
                                <option>2053</option>
                                <option>2054</option>
                                <option>2055</option>
                                <option>2056</option>
                                <option>2057</option>
                                <option>2058</option>
                                <option>2059</option>
                                <option>2060</option>
                                <option>2061</option>
                                <option>2062</option>
                                <option>2063</option>
                                <option>2064</option>
                                <option>2065</option>
                                <option>2066</option>
                                <option>2067</option>
                                <option>2068</option>
                                <option>2069</option>
                                <option>2070</option>
                                <option>2071</option>
                                <option>2072</option>
                                <option>2073</option>
                                <option>2074</option>
                                <option>2075</option>
                                <option>2076</option>
                                <option>2077</option>
                                <option>2078</option>
                                <option>2079</option>
                                <option>2080</option>
                                <option>2081</option>
                                <option>2082</option>
                                <option>2083</option>
                                <option>2084</option>
                                <option>2085</option>
                                <option>2086</option>
                                <option>2087</option>
                                <option>2088</option>
                                <option>2089</option>
                                <option>2090</option>
                                <option>2091</option>
                                <option>2092</option>
                                <option>2093</option>
                                <option>2094</option>
                                <option>2095</option>
                                <option>2096</option>
                                <option>2097</option>
                                <option>2098</option>
                                <option>2099</option>
                                <option>2100</option>
                            </select>                           

                            </font>

                        </td>

                    </tr>

                    <tr>

                        <td align="left"><b>Formule</b></td>

                        <td>
                        <table border="0" id="table16">

                    <tr>

                        <td><font color="#0000FF">
                        <input type="radio" name="formule" value="Nuit insolite" style="font-weight: 700" /></font></td>

                        <td><b>Nuit insolite (hors pack)</b></td>

                    </tr>

                    </table>
                    </td>

                    </tr>

                    <tr>

                        <td align="left">&nbsp;</td>

                        <td>
                        <table border="0" id="table17">

                    <tr>

                        <td><font color="#0000FF">
                        <input type="radio" name="formule" value="Pack_Randonnee_nocturne_Restaurant_Nuit_insolite" style="font-weight: 700" /></font></td>

                        <td><b>PACK : Randonnée nocturne / Restaurant / Nuit insolite</b></td>

                    </tr>

                    </table>
                    </td>

                    </tr>

<!--                    <tr>

                        <td align="left">&nbsp;</td>

                        <td>
                        <table border="0" id="table18">

                    <tr>

                        <td><font color="#0000FF">
                        <input type="radio" name="formule" value="Pack_Randonnee_canine_nocturne_Restaurant_Nuit_insolite" style="font-weight: 700" /></font></td>

                        <td><b>PACK : Randonnée canine nocturne / Restaurant / Nuit insolite</b></td>

                    </tr>

                    </table>
                    </td>

                    </tr>
-->                 

                </table>

                </fieldset>

            <hr size="3" noshade="noshade" />

                <fieldset>

                <br />

                <legend><b><font color="#0000FF" style="font-size: 16pt">Comment avez-vous connu LES IGLOOS DU QUEYRAS ?</font><font style="FONT-SIZE: 9pt" color="#0000FF">&nbsp;( Facultatif, MERCI 
                ! )</font><br>
                <font style="FONT-SIZE: 9pt" color="#0000FF">(Vous pouvez cocher plusieurs réponses)</font></legend>
                <br />

                <table border="0" id="table13">

                    <tr><td><input type="checkbox" name="connu[]" value="Ce site web" style="font-weight: 700" /><b>&nbsp;Ce site web</b></td></tr> 

                    <tr><td><input type="checkbox" name="connu[]" value="Office de tourisme" style="font-weight: 700" /><b>&nbsp;Office de tourisme</b></td></tr>

                    <tr><td><input type="checkbox" name="connu[]" value="Facebook" style="font-weight: 700" /><b>&nbsp;Facebook</b></td></tr>

                    <tr><td><input type="checkbox" name="connu[]" value="Bouche à oreille" style="font-weight: 700" /><b>&nbsp;Bouche à oreille</b></td></tr>

                    <tr><td><input type="checkbox" name="connu[]" value="Autres" style="font-weight: 700" /><b>&nbsp;Autres</b></td></tr>

                    <tr><td><textarea name="autre" rows="3" cols="33" style="font-weight: 700" /></textarea></td></tr>

                    <!--                    
                    <tr><td><input type="checkbox" name="connu[]" value="" /><b>&nbsp;</b></td></tr>                    
                    <tr><td><input type="checkbox" name="connu[]" value="" /><b>&nbsp;</b></td></tr>
                    <tr><td><input type="checkbox" name="connu[]" value="" /><b>&nbsp;</b></td></tr>
                    <tr><td><input type="checkbox" name="connu[]" value="" /><b>&nbsp;</b></td></tr>
                    -->

                </table>

                </b>

                </fieldset>

            <hr size="3" noshade="noshade" />

                <fieldset>              

                <br />

                <legend><b><font color="#0000FF" style="font-size: 16pt">Votre message </font><font style="FONT-SIZE: 9pt" color="#ff0000">(champ 
                obligatoire)</font></b></legend>

                <br />                

                    <textarea name="message" rows="10" cols="70" style="font-weight: 700"></textarea>

                </fieldset>

            <hr size="3" noshade="noshade" />

                <br />

                <div align="center">

<font color="#0000FF">

                    <div class="g-recaptcha" data-sitekey="6LcQ_3sUAAAAAEKRH6mB8ICwS2zC8oAuRmTHUG0R"></div>                 
                    <input type="submit" name="enregistrer" value="Valider" style="font-weight: 700" />
                    <input type="reset" name="annuler" value="Annuler" style="font-weight: 700" />
</font>                
</div>          

</form>
</td>
</tr>
</table>

</body>
</html>

D'accord, je comprends mieux.
Pour commencer, concernant le formulaire, vous avez un problème important concernant les options des select, il ne suffit pas juste de créer des balises option, il faut leur assigner les valeurs dans l'attribut value, soit par exemple :

<select name="mois" style="font-weight: 700">
    <option value=""></option>
    <option value="01">01</option>
    <option value="02">02</option>
    <option value="03">03</option>
    <option value="04">04</option>
    <option value="05">05</option>
    <option value="06">06</option>
    <option value="07">07</option>
    <option value="08">08</option>
    <option value="09">09</option>
    <option value="10">10</option>
    <option value="11">11</option>
    <option value="12">12</option>
</select>

Sinon vous ne pourrez jamais récupérer la valeur de l'option qui aura été sélectionné par l'utilisateur pour le select.
Ensuite, toujours pour le formulaire, vous pouvez profiter de la pré-validation de certains types d'input par le navigateur, comme par exemple pour l'email, en définissant le type d'input en tant que email, le navigateur vérifiera que le format saisi est valide lorsque l'utilisateur essaiera de soumettre le formulaire et empèchera la soumission du formulaire le cas échéant en lui indiquant au niveau de l'input qu'il doit modifier la valeur et autre chose aussi, pour les inputs qui doivent obligatoirement être remplis, ajouter l'attribut required, celà permettra au navigateur d'empécher la soumission du formulaire si les inputs qui ont cet attribut de défini dans le cas ou leur valeur n'est pas saisie par l'utilisateur, soit par exemple : <input type="text" name="portable" size="17" required>, si l'utilisateur ne rempli pas le champ, au moment de la soumission du formulaire le navigateur lui indiquera au niveau du champ que le champ est requis et qu'il doit le remplir.
Sinon pour en revenir à votre problème principal, il est vrai que votre code concernant la vérification des champs du formulaire complique le processus, je vous recommenderais plutôt, qu'au lieu de vouloir afficher directement les erreurs à chaque condition de chaque champ, de remplir une variable sous forme de tableau avec les messages d'erreurs et de les afficher à la fin, vous auriez par exemple quelque chose comme :

if (isset($_POST) {
    $errors = [];
    if (empty($_POST["nom"]) {
    $errors[] = "<h2><center>Vous n'avez pas rempli le champ Nom!<br>Votre formulaire n'a pas été transmis.<br>Merci de bien vouloir renseigner le champ Nom.</center></h2>"
    }
    if (...) {
        $errors[] = "...";
    }
    // etc...
    if (empty($errors)) { // Si le tableau d'erreurs est vide
        // Vérification du ReCaptcha
        if (ok) {
            // Préparation de l'email et envoi
        } else {
            $errors[] = "Message pour le ReCaptcha ...";
            // Affichage des messages d'erreurs avec une boucle
            foreach ($errors as $error) {
                echo $error . "\n";
            }
        }
    }
}

Car actuellement, vu votre code il n'est pas spécialement évident d'y placer la vérification du ReCaptcha, dans tous les cas, il faut bien sur faire la vérification de celui-ci avant d'envoyer le mail et ce serait dommage de faire une requête à l'API si d'autres erreurs ont pu être rencontrées avant, donc l'idéal est je pense de faire la vérification après toutes celles concernant le formulaire et avant d'envoyer ou non le mail et bien sur de ne faire saa vérification que si d'autres erreurs n'ont pas été trouvées avant.

albert
Auteur

Merci Lartak pour votre réponse détaillée.
Je me doute bien que mon formulaire (et son envoi) est loin d'être parfait, mais il fonctionne très bien: je récupère toutes les valeurs jours, mois, années, etc.
Vu mon très faible niveau en php, n'est il vraiment pas possible d'intégrer le code suivant au code de la page validation.php?
Merci de votre réponse

    // Ma clé privée
    $secret = "ma_cle_secrete_a_moi";
    // Paramètre renvoyé par le recaptcha
    $response = $_POST['g-recaptcha-response'];
    // On récupère l'IP de l'utilisateur
    $remoteip = $_SERVER['REMOTE_ADDR'];

    $api_url = "https://www.google.com/recaptcha/api/siteverify?secret=" 
        . $secret
        . "&response=" . $response
        . "&remoteip=" . $remoteip ;

    $decode = json_decode(file_get_contents($api_url), true);

    // C'est un humain
    if ($decode['success'] == true) {
        echo("<h2><center>OK</center></h2>");
    }

    // C'est un robot ou le code de vérification est incorrect
    else {      
        echo("<h2><center>NON</center></h2>");
    }

Vu mon très faible niveau en php, n'est il vraiment pas possible d'intégrer le code suivant au code de la page validation.php?

Je n'ai jamais dit le contraire, il vous suffit de l'ajouter avant la préparation et envoi de l'email.
Donc placer votre code du ReCaptcha juste avant la préparation de l'email et placer votre code de préparation/envoi d'email à la place de echo("<h2><center>OK</center></h2>"); dans la condition if ($decode['success'] == true) {.

albert
Auteur

Merci Lartak, je vais essayer

De rien.
Juste pour information, tu peux facilement remplacer la boucle foreach par ceci : $connus = implode(' - ', array_values($connu));.
Soit :

$connus = implode(' - ', array_values($connu));

À la place de :

$connus = '';
foreach($connu as $c => $v){
    $connus .= $v.' - ';
}

La différence entre les deux, c'est qu'avec la fonction implode tu évites d'avoir un - à la fin d'inutile.

albert
Auteur

Bonjour Lartak,

Merci pour ton complément de réponse.
Le remplacement de la boucle foreach par la fonction implode ne fonctionne pas. Mais foreach fonctionne très bien. Pas de soucis pour moi, je continue avec foreach.
Bonne journée
Albert