PHP - formulaire e-mail à corriger

[Résolu/Fermé]
Signaler
Messages postés
696
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
18 août 2021
-
Messages postés
696
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
18 août 2021
-
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> 

9 réponses

Messages postés
116
Date d'inscription
mardi 26 janvier 2010
Statut
Membre
Dernière intervention
19 janvier 2011
22
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
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 ;)
Messages postés
3019
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
19 juin 2013
122
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 !
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
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.

;)
Messages postés
3019
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
19 juin 2013
122
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 ;)
Messages postés
682
Date d'inscription
vendredi 1 août 2008
Statut
Membre
Dernière intervention
28 juin 2015
184
@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.

;)
Messages postés
3019
Date d'inscription
samedi 13 janvier 2007
Statut
Membre
Dernière intervention
19 juin 2013
122
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.
Messages postés
696
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
18 août 2021
64
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) ! (-;
Messages postés
696
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
18 août 2021
64
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 !! (-;