8768 sujets

Développement web côté serveur, CMS

Bonjour à tous,

Je viens vers vous aujourd'hui car je bloque depuis plusieurs jours sur l'envoi de mon formulaire vers une adresse mail.
Je suis débutant en PHP, mais débrouillard. seulement là je coince...

Mon problème est le suivant :
Lorsque je remplis mon formulaire avec tous les champs et que je l'envoie, mon script PHP me répond le message d'erreur '$message_formulaire_invalide' soit que les champs soient bien remplis et l'email sans erreur.
Or, les champs sont bel et bien complété et l'adresse mais est valide du type (p.nom@domain.me).
L'erreur doit survenir au niveau de la vérification des champs vides, mais j'ai beau cherché, je ne vois absolument pas où elle se trouve.

Pouvez-vous m'aider ? Merci

Le code de mon formulaire en HTML :
<form method="post" action="form.php" id="contact">
					<h3>Formulaire de Contact</h3>
					<div class="form-group ">
						<label for="nom" class="sr-only">Nom</label>
						<input id="nom" name="nom" class="form-control" placeholder="Nom" type="text" required="">
					</div>
					<div class="form-group ">
						<label for="email" class="sr-only">Email</label>
						<input id="email" name="email" class="form-control" placeholder="Email" type="email" required="">
					</div>
					<div class="form-group ">
						<label for="objet" class="sr-only">Objet</label>
						<input id="objet" name="objet" class="form-control" placeholder="Objet" type="text" required="">
					</div>
					<div class="form-group ">
						<label for="message" class="sr-only">Message</label>
						<textarea name="" id="message" name="message" cols="30" rows="5" class="form-control" placeholder="Message" required=""></textarea>
					</div>
					<div class="form-group ">
						<input class="btn btn-primary btn-lg" name="envoi" value="Envoyer" type="submit">
					</div>
					</form>


Le code de mon fichier de traitement (form.php) :
<?php
/*
    ********************************************************************************************
    CONFIGURATION
    ********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule
$destinataire = 'contact@magelan.me';
 
// copie ? (envoie une copie au visiteur)
$copie = 'oui'; // 'oui' ou 'non'
 
// Messages de confirmation du mail
$message_envoye = "Votre message a bien été envoyé !";
$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP.";
 
// Messages d'erreur du formulaire
$message_erreur_formulaire = "Vous devez d'abord <a href=\"/#fh5co-contact\">envoyer le formulaire</a>.";
$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";
 
/*
    ********************************************************************************************
    FIN DE LA CONFIGURATION
    ********************************************************************************************
*/
 
// on teste si le formulaire a été soumis
if (!isset($_POST['envoi']))
{
    // formulaire non envoyé
    echo '<p>'.$message_erreur_formulaire.'</p>'."\n";
}
else
{
    /*
     * cette fonction sert à nettoyer et enregistrer un texte
     */
    function Rec($text)
    {
        $text = htmlspecialchars(trim($text), ENT_QUOTES);
        if (1 === get_magic_quotes_gpc())
        {
            $text = stripslashes($text);
        }
 
        $text = nl2br($text);
        return $text;
    };
 
    /*
     * Cette fonction sert à vérifier la syntaxe d'un email
     */
    function IsEmail($email)
    {
        $value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(? [decu]? [decu]?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(? [decu]?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
        return (($value === 0) || ($value === false)) ? false : true;
    }
 
    // formulaire envoyé, on récupère tous les champs.
    $nom     = (isset($_POST['nom']))     ? Rec($_POST['nom'])     : '';
    $email   = (isset($_POST['email']))   ? Rec($_POST['email'])   : '';
    $objet   = (isset($_POST['objet']))   ? Rec($_POST['objet'])   : '';
    $message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';
 
    // On va vérifier les variables et l'email ...
    $email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
 
    if (($nom != '') && ($email != '') && ($objet != '') && ($message != ''))
    {
        // les 4 variables sont remplies, on génère puis envoie le mail
        $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'From:'.$nom.' <'.$email.'>' . "\r\n" .
                'Reply-To:'.$email. "\r\n" .
                'Content-Type: text/plain; charset="utf-8"; DelSp="Yes"; format=flowed '."\r\n" .
                'Content-Disposition: inline'. "\r\n" .
                'Content-Transfer-Encoding: 7bit'." \r\n" .
                'X-Mailer:PHP/'.phpversion();
    
        // envoyer une copie au visiteur ?
        if ($copie == 'oui')
        {
            $cible = $destinataire.';'.$email;
        }
        else
        {
            $cible = $destinataire;
        };
 
        // Remplacement de certains caractères spéciaux
        $message = str_replace("&#039;","'",$message);
        $message = str_replace("&#8217;","'",$message);
        $message = str_replace("&quot;",'"',$message);
        $message = str_replace('<br>','',$message);
        $message = str_replace('<br />','',$message);
        $message = str_replace("&lt;","<",$message);
        $message = str_replace("&gt;",">",$message);
        $message = str_replace("&amp;","&",$message);
 
        // Envoi du mail
        $num_emails = 0;
        $tmp = explode(';', $cible);
        foreach($tmp as $email_destinataire)
        {
            if (mail($email_destinataire, $objet, $message, $headers))
                $num_emails++;
        }
 
        if ((($copie == 'oui') && ($num_emails == 2)) || (($copie == 'non') && ($num_emails == 1)))
        {
            echo '<p>'.$message_envoye.'</p>';
        }
        else
        {
            echo '<p>'.$message_non_envoye.'</p>';
        };
    }
    else
    {
        // une des 3 variables (ou plus) est vide ...
        echo '<p>'.$message_formulaire_invalide.' <a href="/#fh5co-contact">Retour au formulaire</a></p>'."\n";
    };
}; // fin du if (!isset($_POST['envoi']))
?>

Modifié par Mylo (05 Aug 2016 - 14:05)
Hello,

2 erreurs :

1 dans le HTML
le <textarea> contenant le message contient deux paramètres "name", dont le premier vide (name=""), du coup la variable $_POST['message'] est toujours vide. Supprimer ce name="" et tout rentre dans l'ordre

2 dans form.php


$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré


La fonction IsEmail ne fonctionne pas et renvoie "false", et non l'email saisi comme espéré, donc le test échoue toujours

Toujours intéressant d'insérer des

     echo 'message : ' . $message . '<br>';
     echo 'email : ' . $email . '<br>';

Pour vérifier les contenus des variables aux différents endroits du script, et soudain tout s'éclaire
Le script fonctionne bien, si on enlève le test IsEmail, les mails sont envoyés sans problème.