PHP - formulaire e-mail à corriger

Résolu/Fermé
Gizmil Messages postés 706 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 3 octobre 2022 - 15 nov. 2010 à 18:42
Gizmil Messages postés 706 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 3 octobre 2022 - 19 nov. 2010 à 00:08
Hello,

j'ai un petit souci avec un formulaire que j'ai généré avec un générateur puis légèrement modifié (je ne m'y connais malheureusement pas en php pour en faire un moi-même)!

Ai-je fais une erreur en le modifiant pour l'adapter à mes besoins ? Ca me paraît peu probable car j'ai fais assez attention mais c'est néanmoins possible! Je n'ai modifié que la partie HTML du bas...

Le souci avec ce formulaire est qu'il parvient à être envoyé même si les champs ne sont pas remplis, ce qui est gênant !! Pourriez-vous y jeter un oeil, ce serait super ?

Merci !


<?php

$email_dest = "monadresse@gmail.com";

if ($_POST['envoi']) {

$message_remerciement = "Merci pour votre message, celui-ci a bien été envoyé !";

// E-mail headers:
$headers ="MIME-Version: 1.0 \n";
$headers .="From: info@monsite.be \n";
$headers .="Content-Type: text/html; charset=iso-8859-1 \n";

$subject = "Message en provenance du formulaire du site ATTC";

$partie_entete = "<html><head>
<meta http-equiv=Content-Type content=text/html; charset=iso-8859-1>
</head>
<body bgcolor=#FFFFFF>";

for ($a=1; $a<= $_POST['nbre_champs_texte']; $a++) {
$partie_champs_texte .= "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_champ'.$a] . " = " . $_POST['champ'.$a] . "</font><br>";
}

if ($_POST['nbre_zone_email'] != 0) {
$partie_zone_email = "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_email'] . " = " . $_POST['zone_email'] . "</font><br>";
}

if ($_POST['nbre_zones_texte'] != 0) {
$partie_zone_texte = "<font face='Verdana' size='2' color='#003366'>" . $_POST['titre_zone'] . " = " . $_POST['zone_texte'] . "</font><br>";
$partie_zone_texte = stripslashes($partie_zone_texte);
}

$fin = "</body></html>";

$sortie = $partie_entete . $partie_champs_texte . $partie_zone_email . $partie_zone_texte . $fin;

// Send the e-mail
if (@!mail($email_dest,$subject,$sortie,$headers)) {
echo("Envoi du formulaire impossible");
} // Closing if !mail...

} // Closing if edit
?>
<html>
	<head>
		<title>Assistant d'envoi de formulaires</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
		<script language="JavaScript"><!-- Hide script from older browsers
		function verifSelection() {if (mail_form.champ1.value == "") {
		alert("Vous avez omis de nous indiquer votre nom ! ")
		return false
		} if (mail_form.champ2.value == "") {
		alert("Vous avez omis de nous indiquer votre numéro de téléphone ! ")
		return false
		} if (mail_form.zone_email.value == "") {
		alert("Vous avez omis de nous indiquer votre adresse e-mail ! ")
		return false
		}

		invalidChars = " /:,;'"

		for (i=0; i<invalidChars.length; i++) {	// does it contain any invalid characters?
		badChar = invalidChars.charAt(i)

		if (mail_form.zone_email.value.indexOf(badChar,0) > -1) {
		alert("Votre adresse e-mail contient des caractères invalides. Veuillez vérifier.")
		mail_form.zone_email.focus()
		return false
		}
		}

		atPos = mail_form.zone_email.value.indexOf("@",1)			// there must be one "@" symbol
		if (atPos == -1) {
		alert('Votre adresse e-mail ne contient pas le signe "@". Veuillez vérifier.')
		mail_form.zone_email.focus()
		return false
		}

		if (mail_form.zone_email.value.indexOf("@",atPos+1) != -1) {	// and only one "@" symbol
		alert('Il ne doit y avoir qu\'un signe "@". Veuillez vérifier.')
		mail_form.zone_email.focus()
		return false
		}

		periodPos = mail_form.zone_email.value.indexOf(".",atPos)

		if (periodPos == -1) {					// and at least one "." after the "@"
		alert('Vous avez oublié le point "." après le signe "@". Veuillez vérifier.')
		mail_form.zone_email.focus()
		return false
		}

		if (periodPos+3 > mail_form.zone_email.value.length)	{		// must be at least 2 characters after the 
		alert('Il doit y avoir au moins deux caractères après le signe ".". Veuillez vérifier.')
		mail_form.zone_email.focus()
		return false
		}if (mail_form.zone_texte.value == "") {
		alert("Vous devez écrire un message à nous transmettre dans le champ "Votre message" ! ")
		return false
		} } // Fin de la fonction
		</script>
		<link rel="stylesheet" type="text/css" href="style.css" />
	</head>
	<body id="bloc_formulaire">
		<form name="mail_form" method="post" action="<?=$PHP_SELF?>" onSubmit="return verifSelection()">
			<?php
				if ($message_remerciement) {
				echo("<div id='remerciement' class='taille4 bleufonce'>");
				echo(stripslashes($message_remerciement));
				echo("</div>");
				exit();
				}
			?>
			<h1 class="taille5 bleufonce gras centre">Formulaire de contact&nbsp;&nbsp;<span class="taille5 fuschia gras italique">Mon Site</span></h1>
			<div id="formulaire">
			<div class="champ taille2">
				<p>
					Nom :
				</p>
				<input name="champ1" type="text">
			</div>
			<div class="champ taille2">
				<p>
					Téléphone :
				</p>
				<input name="champ2" type="text">
			</div>
			<div class="champ taille2">
				<p>
					E-mail :
				</p>
				<input name="zone_email" type="text">
			</div>
			<p id="avertissement" class="taille1 fuschia gras centre">Soyez attentif à remplir tous les champs ci-dessus avant de nous envoyer votre message !</p>
			<div id="message" class="taille2">
				<p>
					Votre message :
				</p>
				<textarea name="zone_texte" cols="50" rows="10"></textarea>
			</div>
			<div id="boutons">
				<input name="nbre_champs_texte" type="hidden" id="nbre_champs_texte" value="2">
				<input name="nbre_zones_texte" type="hidden" value="1">
				<input name="nbre_zone_email" type="hidden" value="1">
				<input name="titre_champ1" type="hidden" value="Nom : ">
				<input name="titre_champ2" type="hidden" value="Téléphone :">
				<input name="titre_email" type="hidden" value="E-mail :">
				<input name="titre_zone" type="hidden" value="Votre message :">
				<div align="center">
					<input type="reset" name="Reset" value="Effacer">          
					<input type="submit" name="envoi" value="Envoyer">
				</div>
			</div>
		</form>
	</body>
</html> 
A voir également:

9 réponses

lalouviere84 Messages postés 116 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 19 janvier 2011 24
16 nov. 2010 à 19:02
Salut,

Je connais deux sites qui te proposent de générer des formulaires en ligne :
https://www.jotform.com/ (éditeur type wysiwyg)

http://www.ge-net.ch/page/rw-wfco-owb-0.html (éditeur en ligne)

ça t'aidera peut être ...
1
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
17 nov. 2010 à 19:08
Vade Retro, graphiste !

Pardon, je plaisante bien sûr. Je sais que ActionScript et JavaScript sont très proches ; il n'y pas d'expressions régulières en ActionScript ?

Je le redis, ce n'est que côté client que tu pourras empêcher la soumission du formulaire. Un script PHP (donc côté serveur) peut décider si les données sont correctes ou pas, mais pour ça, il faut qu'il ait déjà reçu les données.

J'espère que c'est plus clair ;)
1
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
15 nov. 2010 à 19:45
Salut,

je n'ai regardé que la partie javaScript de ton code. En effet, seul le script côté client permet d'empêcher l'envoi du formulaire si besoin.

Dans un premier temps, Sais-tu qu'il y a moyen de vérifier que l'adresse email est correcte en une seule ligne de code ? Regarde par-là : Expressions régulières.
Un exemple concret :
/^\s*[\w.]+@[\w]+\.\w{2,5}\s*$/.test("mon_adresse.123@mon_site.com")


Ceci nous permet déjà d'éliminer près de 40 lignes de code, donc autant de chances de virer ce qui ne marche pas :P

La suite demain ;)
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
15 nov. 2010 à 20:04
Un moyen simple de voir si tous les champs ont été remplis dans ton formulaire est de créer une boucle en PHP :

$call = true;

foreach ($_POST as $key => $element) {
if (!isset($element) || $element == '')) {
$call = false;
}
}

if ($call) {
// Enclenche les opérations normales d'envoi de formulaire...
} else {
print 'Message d'erreur';
}


Ça ne te dira pas (dans la forme actuelle) quels champs n'ont pas été remplis ou lesquels ont été mal remplis, mais ça t'avertit si des champs sont restés vides.

Sinon, je seconde Groarh : va voir les expressions régulières. C'est difficile à se souvenir, mais une fois que tu connais, ça te sauve une infinité de temps et de misères !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
16 nov. 2010 à 10:52
Je rajouterais une chose que j'ai oubliée hier :
le JavaScript (côté client) permet de contrôler la validité des champs avant l'envoi du formulaire, mais seulement si l'utilisateur a activé JavaScript sur son navigateur, donc il faut faire un autre contrôle en PHP (côté serveur).

On peut aussi tomber sur un développeur web qui a des outils comme Firebug ou la Webdev Toolbar, et qui, par malveillance ou juste curiosité (et ce n'est pas si rare qu'on le croit !), modifie la valeur des champs hidden, par exemple, ou alors supprime un attribut readonly... Il peut également être capable d'intervenir directement sur les paramètres de la requête, aussi bien en POST qu'en GET.

Le double contrôle est un réflexe à acquérir : ne jamais faire confiance à ce qui provient de la machine du client.

;)
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
16 nov. 2010 à 14:54
Je viens de remarquer quelque chose...
Je vois des input qui ont l'attribut value="Votre Message :"...
C'est une très mauvaise idée de mettre des caractères comme le ":" dans un attribut HTML. Déjà que c'est une mauvaise idée de mettre des caractères accentués à cet endroit... Ça peut faire planter ton script assez facilement.
Mes deux cennes en passant ;)
0
Groarh Messages postés 682 Date d'inscription vendredi 1 août 2008 Statut Membre Dernière intervention 28 juin 2015 185
16 nov. 2010 à 17:08
@coeus>
Aucun problème tant qu'on sait dans quel encodage on travaille. En l'occurence il s'agit de ISO-8859-1, donc le caractère € est interdit, mais les accents ne poseront pas de soucis, et le ":" encore moins. Quant à JavaScript, il traite les attributs HTML comme des chaînes.

;)
0
coeus Messages postés 3019 Date d'inscription samedi 13 janvier 2007 Statut Membre Dernière intervention 19 juin 2013 119
16 nov. 2010 à 18:13
C'est sûr qu'il y a toujours des moyens de prévenir les problèmes. Personnellement j'aime mieux m'abstenir, j'essaie de faire en sorte que tout marche dans un maximum de cas possibles, par exemple en faisant en sorte de pouvoir changer mon encodage sans rien faire planter. J'imagine que ça ne m'arrivera jamais d'avoir besoin de faire une telle chose, mais...
En bref, je suis d'accord à toute fin pratique avec ce que tu dis. C'est juste que je me suis développpé une éthique personnelle qui me l'interdit ;-)
Et je susi d'accord que des caractères comme le ":" n'a que très peu d'incidence ultimement. Mais par principe je le classe dans la même catégorie que tous les caractères illégaux. Même chose pour les espaces et le reste de la ponctuation en général.
0
Gizmil Messages postés 706 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 3 octobre 2022 65
Modifié par Gizmil le 16/11/2010 à 23:08
Hello, me revoilà !

Bon, les petits gars, je vous aime beaucoup... :-P ...mais je n'y connais rien en PHP donc je ne dirais pas que vous me parlez chinois car je touche un peu à la programmation ActionScript mais je suis graphiste avant d'être informaticien et, là, je dois dire que je vais avoir un peu de mal à appliquer vos conseils ! En fait, j'ai peu de temps à consacrer à la recherche car mon client attend son petit formulaire en état de marche !

Puisque la "réparation" de ce formulaire semble plus complexe que je le pensais, est-ce que vous ne pourriez pas me guider vers un générateur de formulaire plus compétent que celui que j'ai utilisé ?

Merci beaucoup néanmoins pour vos efforts concernant mon script (faut vraiment que je prenne des cours de PHP) ! (-;
0
Gizmil Messages postés 706 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 3 octobre 2022 65
19 nov. 2010 à 00:08
Vi vi, c'est plus clair !! Ca ne m'aide pas mais c'est plus clair ! mdr

Non, non, moi aussi, je plaisante ! XD

En effet, je devrais peut-être m'intéresser au javascript (oui, aussi) !

En passant, merci à La Louvière84, le deuxième lien proposé m'a apporté entière satisfaction !! (-;
0