Mon formulaire affiche un message d'erreur

Répondre
Fedora78
le 31/05/2010 à 18:45
Fedora78
Bonjour, j'ai créé un formulaire simple afin de permettre aux visiteurs de mon site de me contacter.


Me formulaire d'envoi :

<?php <?php

$destinataire= 'contact@guillaume-reze.com';

$copie= 'OUI';
$message_envoye = "Votre message est parti. D'avance merci. Guillaume.";
$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 envoyer le commentaire.";
$message_formulaire_invalide = "VÈrifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";


if (!isset($_POST['envoi']))
{
// formulaire non envoyé
echo '<p>'.$message_erreur_formulaire.'</p>'."\n";
}
else
{

function Rec($text)
{
$text = trim($text); // delete white spaces after & before text
if (1 === get_magic_quotes_gpc())
{
$stripslashes = create_function('$txt', 'return stripslashes($txt);');
}
else
{
$stripslashes = create_function('$txt', 'return $txt;');
}

// magic quotes ?
$text = $stripslashes($text);
$text = htmlspecialchars($text, ENT_QUOTES); // converts to string with " and ' as well
$text = nl2br($text);
return $text;
};


function IsEmail($mail)
{
$pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$";
return (eregi($pattern,$mail)) ? true : false;
};

$nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : '';
$prenom = (isset($_POST['prénom'])) ? Rec($_POST['prenom']) : '';
$mail = (isset($_POST['mail'])) ? Rec($_POST['mail']) : '';
$entreprise = (isset($_POST['entreprise'])) ? Rec($_POST['entreprise']) : '';
$commentaire = (isset($_POST['commentaire'])) ? Rec($_POST['commentaire']) : '';


$mail = (IsEmail($mail)) ? $mail : '';

if (($nom != '') && ($prenom != '') && ($mail != '') && ($entreprise != '') && ($commentaire != ''))
{
$headers = 'From: '.$nom.' <'.$mail.'>' . "\r\n";

// envoyer une copie au visiteur ?
if ($copie == 'oui')
{
$cible = $destinataire.','.$mail;
}
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
if (mail($cible, $objet, $message, $headers))
{
echo '<p>'.$message_envoye.'</p>'."\n";
}
else
{
echo '<p>'.$message_non_envoye.'</p>'."\n";
};
}
else
{
// une des 3 variables (ou plus) est vide ...
echo '<p>'.$message_formulaire_invalide.' <a href="contact.html">Retour au formulaire</a></p>'."\n";
};
}; // fin du if (!isset($_POST['envoi']))
?>
php ?>



Problème : J'ai tout essayé, et je tombe toujours sur le message "vous devez d'abord envoyer votre formulaire".

D'après vous, ca pourrait venir d'ou ?
Guillaume
dark_nemo
le 31/05/2010 à 20:27
dark_nemo
C'est parce que lors du premier chargement de ta page ta variable
if (!isset($_POST['envoi'])) ne doit pas exister donc le message d'erreur s'affiche.
Remplaces
<?php
if (!isset($_POST['envoi']))
{
// formulaire non envoyé
echo '<p>'.$message_erreur_formulaire.'</p>'."\n";
}
else
{
?>

par

<?php
if (isset($_POST['envoi']))
{
?>
LupusMic
le 01/06/2010 à 09:02
LupusMic
Plusieurs remarques pour améliorer ton code.

Je n'aime pas la concaténation.
echo '<p>'.$message_erreur_formulaire.'</p>'."\n";

Je lui préfère ceci, en corrigeant un éventuel problème :
printf("<p>%s</p>\n", htmlspecialchars($message_erreur_formulaire)) ;


$text = trim($text); // delete white spaces after & before text

Pourquoi ? Ça ne sert strictement à rien.

Ensuite tu créés une fonction à la volée. Je ne vois pas bien l'intérêt. Tu devrais plutôt faire cette opération une fois pour toute en début de script, pour corriger le comportement de cette ignominie qu'est magic quotes, avec quelque chose dans ce goût là :

<?php
if(get_magic_quotes_gpc())
foreach(array(&$GLOBAL, &$_POST, &$_GET) as $gpc)
array_walk($gpc, 'stripslashes') ;


Ta Regex est fausse :
<?php

$pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$";


Il faut lui préférer l'usage de filter_var et associés. Précisons aussi que les fonctions ereg sont lentes, déconseillées, et seront supprimées dans les prochaines versions de PHP.

<?php
$nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : '';

Pourquoi tant de parenthèses ? Il ne faut en mettre que là où c'est nécessaire. Quel est l'intérêt d'entourer l'expression isset(...) de parenthèses ?

Que veut dire Rec ? Des noms de fonctions courtes peuvent être pratiques. Mais leur usage doit être limité au strict minimum. En règle générale, un nom de fonction doit être explicite pour tout ceux qui devront maintenir ton code. Et pas que toi.

On peut faire les mêmes commentaires sur les parenthèses à propos de :
<?php
if (($nom != '') && ($prenom != '') && ($mail != '') && ($entreprise != '') && ($commentaire != ''))


Un fumet de trou de sécurité que tout bon spameur apprécie avec délectation :
<?php $headers = 'From: '.$nom.' <'.$mail.'>' . "\r\n";

En gros, tu devrais écrire quelque chose comme ça :
<?php $headers = sprintf("From: %s <%s>\r\n", mailescape($nom), mailescape($email)) ;

Avec la fonction mailescape à définir, qui échappe correctement les variables pour éviter le détournement du formulaire.

<?php          $message = str_replace('<br>','',$message);

Pourquoi avoir utilisé nl2br ?
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Fedora78
le 01/06/2010 à 09:40
Fedora78
Et bien, j'ai encore du boulot avant d'avoir un code efficace !

Merci beaucoup pour tous ces conseils je m'y mets dès cet après-midi et je reviendrai te donner les résultats.
Guillaume
Fedora78
le 01/06/2010 à 10:26
Fedora78
J'ai appliqué tes modifications, je te remercie.

Peux tu m'en dire plus sur ta fonction mailescape et sur sa configuration ? Je suis dans le flou à ce niveau là...
Guillaume
dark_nemo
le 01/06/2010 à 11:14
dark_nemo
Une autre modif que tu peux faire c'est remplacer "\n" par la constante PHP_EOL qui permet d'avoir un saut de ligne LF \n pour unix et CRLF \n\r pour windows
dark_nemo
le 01/06/2010 à 13:00
dark_nemo
Une autre chose, l'utilisation de plusieurs str_replace entraine une perte de performance.

Tu peux utiliser des tableaux avec cette fonction.

Par exemple :
<?php
$rechercher = array('chien','chat','poule');
$remplacer = array('chiens','chats','poules');
$msg = str_replace($rechercher,$remplacer,$msg);
?>
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours