Afficher un message d'erreur sur formulaire php

Nouveau WRInaute
Bonjour,

voilà quelques temps que je m'arrache les cheveux avec mon 1er formulaire php.
Si tous les champs sont remplis, un mail m'est envoyé et je redirige vers une page html "merci.html".
jusque là pas de soucis. Sauf que j'aimerais que s'affiche un message type "Vous devez remplir tous les champs" sur mon formulaire lorsqu'un des champs n'est pas saisi.
N'y arrivant pas, en attendant de trouver une solution, je redirige vers une page "erreur.html" lorsque les champs ne sont pas tous remplis...

Une bonne âme pour me donner un coup de main ?

Merci d'avance.

Voilà le code de ma page de traitement "contact.php :

<?php

if(isset($_POST) && isset($_POST['nom']) && isset($_POST['email']) && isset($_POST['message']) && isset($_POST['sujet'])){
extract($_POST);
if(!empty($nom) && !empty($email) && !empty($message) && !empty($sujet)){
$message=str_replace("\'","'",$message);
$sujet=str_replace("\'","'",$sujet);
$destinataire="monadresse@mondomaine.com";
$msg="
Nom : $nom \n
Sujet : $sujet \n
Email : $email \n
Message : $message";
$entete="From: $nom \n Reply-To: $email";
mail($destinataire,$sujet,$msg,$entete);
Header("Location: http://mondomaine.com/merci.html");

}
else{
Header("Location: http://mondomaine.com/erreur1.html");
}
}
?>
 
WRInaute accro
déjà, extract($_POST); pose de gros problèmes de sécurité, car on peut y insérer les variables que l'on veut dans ton script, de cette façon
 
WRInaute accro
J'utilise un truc un peu particulier mais qui marche.

$erreur_nom="";
$erreur_prenom="";
if (ISSET($_POST['Envoi']))
{
$nom=ADDSLASHES($_POST['nom']))
$prenom=ADDSLASHES($_POST['prenom']))
$correct="O";
if ($nom=="")
{
$erreur= "Merci d'entrer votre nom";
$correct="N";
}
if ($prenom=="")
{
$erreur_prenom= "Merci d'entrer votre prenom";
$correct="N";
}
if ($correct=="O")
{
traitement base de donnée, mails, ... + sortie
}

// formulaire
<form METHOD=POST>
Nom <input type=text name=nom> <?echo $erreur_nom;?>
Prenom <input type=text name=prenom><?echo $erreur_prenom;?>
<input type=submit name=go value=Envoyer>
</form>

Vient de le taper de mémoire, peut-être quelques erreurs de syntaxe. En plus, via $correct, je fais d'autres trucs comme supprimer des messges avec des termes interdits comme médicaments ou autres. Tu a aussi une autre solution http://www.ybet.be/internet14/php-10-a/contact.phh (l'extension est bonne, c'est pour pouvoir le visualiser), avec comme explications -http://www.ybet.be/internet14/php-10-a.php
 
WRInaute accro
le mieux étant de faire une première vérification en js, puis la 2° en php. Comme ça, pour l'internaute classique, le message lui indiquera le problème avant de poster. Pour les spammeurs, le filtre php bloquera le reste
 
WRInaute accro
UsagiYojimbo a dit:
Perso je ne fais jamais de validation côté navigateur : toujours côté serveur.
faire les 2 est plus pratique : ça évite le "post" d'un formulaire incomplet, pour l'internaute "classique" (js activé et qui ne tente pas de spam ou hack)
 
WRInaute accro
En fait j'ai une classe de gestion de formulaire qui me génère les messages d'erreurs et recharge le formulaire si des erreurs sont présentes dans la saisie de celui-ci, donc ça ne me dérange pas :)
 
WRInaute accro
J'utilise le même principe que décrit plus haut.
Avant de récupérer les variables, j'ai un
$valid=1;

dès qu'une variable _post n'est pas ou mal renseignée, je passe en $valid=0;

a la fin, je vérifie, si $valid==1 je traite les résultats.
 
Nouveau WRInaute
Bon je vais peut être passer pour un attardé mental... ben tant pis :oops:

J'ai supprimé dans mon code les conditions :
if(!empty($nom) && !empty($prenom) && !empty($adresse) && !empty($email) && !empty($message) && !empty($sujet)){
pour les remplacer par le code (adapté à mes champs) de Ybet.
J'ai ajouté sur mon formulaire html les <?echo $erreur_nom;?> pour chacun de mes inputs.

Résultat : Parse error: syntax error, unexpected T_VARIABLE...

Si vous pouviez me la refaire en me parlant comme si j'avais 2 ans avant que je termine ma plaquette de Rénie, ça soulagerait mon début d'ulcère :? :lol:

Merci d'avance

Je vous remets mon code de départ :

<?php

if(isset($_POST) && isset($_POST['nom']) && isset($_POST['email']) && isset($_POST['message']) && isset($_POST['sujet'])){
extract($_POST);
if(!empty($nom) && !empty($email) && !empty($message) && !empty($sujet)){
$message=str_replace("\'","'",$message);
$sujet=str_replace("\'","'",$sujet);
$destinataire="mon adresse email";
$msg="
Nom : $nom \n
Sujet : $sujet \n
Email : $email \n
Message : $message";
$entete="From: $nom \n Reply-To: $email";
mail($destinataire,$sujet,$msg,$entete);
Header("Location: http://(...)/merci.html");

}
else{
Header("Location: http://(...)/erreur1.html");
}
}
?>
 
WRInaute impliqué
Leonick a dit:
RiPSO a dit:
Leonick a dit:
Pour les spammeurs, le filtre php bloquera le reste
Et les internautes qui ont le javascript désactivé ;)
ben pareil, ça sera bloqué, si besoin, par la partie php

Oui oui c'etait sous entendu que le javascript ne suffisait pas et qu'il fallait aussi une vérification coté serveur pour les spammeur comme tu as dis mais aussi pour ceux qui désactivent javascript :)
 
WRInaute accro
RiPSO a dit:
Oui oui c'etait sous entendu que le javascript ne suffisait pas et qu'il fallait aussi une vérification coté serveur pour les spammeur comme tu as dis mais aussi pour ceux qui désactivent javascript :)
parce que, en fait, la vérification côté serveur va bien au delà d'une simple vérification que champs vides ou non. Il faut aussi "nettoyer" le contenu, pour éviter l'injection de code, surtout si le formulaire est incomplet et qu'on le réaffiche. Car là, c'est le niveau basique du hacker
 
WRInaute impliqué
aaaaahh c'est ca les injections :d je viens de comprendre :d
c'est quelque chose que je gere sur mes sites et je ne savais même pas que ça s'appelait comme ça :lol:
 
WRInaute accro
Rhaaaa

bon alors fait à la va-vite :

Code:
<?php
	//par defaut le message est valide et l'alerte est vide//
	$valid=1;$alert="";
	/////////////////////////////////////////////////////////

	//test nom est rempli////////////////////////////////////
	if(isset($_POST['nom']) && !empty($_POST['nom']))
	{
		$nom=$_POST['nom'];
	}
	else
	{
		//nom pas rempli : le message n'est pas valide et on le renseigne dans l'alerte
		$nom="";$valid=0;$alert.="Merci de renseigner votre nom<br/>";
	}
	////////////////////////////////////////////////////////
	
	//test email est rempli
	if(isset($_POST['email']) && !empty($_POST['email']))
	{
		$email=$_POST['email'];
	}
	else
	{
		//email pas rempli : le message n'est pas valide et on le renseigne dans l'alerte
		$email="";$valid=0;$alert.="Merci de renseigner votre adresse Email<br/>";
	}
	////////////////////////////////////////////////////////
	
	//test message est rempli
	if(isset($_POST['message']) && !empty($_POST['message']))
	{
		$message=$_POST['message'];
	}
	else
	{
		//message pas rempli : le message n'est pas valide et on le renseigne dans l'alerte
		$message="";$valid=0;$alert.="Votre message est vide<br/>";
	}
	////////////////////////////////////////////////////////
	
	//test sujet est rempli
	if(isset($_POST['sujet']) && !empty($_POST['sujet']))
	{
	$sujet=$_POST['sujet']
	}
	else
	{
	//sujet pas rempli : le message n'est pas valide et on le renseigne dans l'alerte
	$sujet="";$valid=0;$alert.="merci de renseigner le sujet de votre message<br/>";
	}
	////////////////////////////////////////////////////////

	//test si le message est toujours valide:
	if($valid==1)
	{
		$message=str_replace("\'","'",$message);
		$sujet=str_replace("\'","'",$sujet);
		$destinataire="mon adresse email";
		$msg="
		Nom : $nom \n
		Sujet : $sujet \n
		Email : $email \n
		Message : $message";
		$entete="From: $nom \n Reply-To: $email";
		mail($destinataire,$sujet,$msg,$entete);
		Header("Location: http://(...)/merci.html");
	}
	else
	{echo "<p><strong>Votre message n'est pas correctement rempli :</strong></p>
		   <p>".$alert."</p>";
		   
		//////////////////////////////////////////////////////////////////////////////////////////////
		//Ici, fais ensuite ce que tu veux: une redirection (bof, faut tout ressaisir si on s'est gouré, et d'habitude on abandonne, ou alors une autre solution :
                //tu peux ici réafficher le formulaire en remplissant les champs avec les variables// ////////
		//celles qui ont été renseignées restent, les autres seront vides, ///////////////////////////
		//et on repart pour un tour tant que tout n'est pas rempli////////////////////////////////////
		//////////////////////////////////////////////////////////////////////////////////////////////
		
	}
?>
 
WRInaute accro
Bon maintenant que t'as un code qui semble marcher et qui est commenté, fais un effort, comprends-le, il est très simple :)
 
Nouveau WRInaute
Pour info, nickargall, le code que tu m'as donné ne donne pas ce que je voulais. Au lieu de mettre le message d'erreur dans le champ non rempli ou sur le formulaire lui-même, cela fait apparaitre une page blanche en haut de laquelle apparait le message d'alerte.

J'ai suivi ton conseil, j'ai acheté un bouquin sur le php et visité des dizaines de site pour essayer de comprendre le pourquoi du comment, mais sans résultat, malheureusement.

Je vais essayer de trouver une autre solution...

En tout cas merci beaucoup pour ton aide
 
WRInaute accro
Bien sur, le code que je t'ai donné ne peut pas fonctionner tel quel, il faut l'adapter à ton site ... même avec les commentaires que j'ai placé ca reste du chinois pour toi ?
 
Nouveau WRInaute
Non non ce n'est plus tout à fait du chinois. Comme je te l'ai dit j'ai pas mal bossé sur la question. A présent je comprends bien la logique du code et la syntaxe, le test sur les variables, le test sur les champs remplis ou vide, les conditions suivies des "else".
Seulement, mon problème de départ était de faire en sorte que les alertes ou les "echo" conséquence des "else" s'affichent sur mon formulaire, à coté ou dans les champs nom remplis.
Avant de poster mon problème ici, j'avais réussi en compilant des infos sur différents forums à pondre un code (beaucoup moins évolué que le tien), à base de "isset" et de "!empty" suivi d'un "echo". Cela me donnait en résultat mon "echo" sur une page blanche. C'est pour cela que j'ai demandé de l'aide, pour que l'echo ou le message d'alerte ne s'affiche plus sur une page blanche, mais dans mes champs non remplis.
Juste pour dire que je ne me suis pas tourné les pouces en attendant que quelqu'un fasse mon code. A force de chercher à résoudre la chose, j'ai appris bien plus que je n'avais besoin. Faire un chat, un livre d'or, sécuriser des pages avec mot de passe... mais toujours pas à régler mon problème initiale. Je finirai bien par trouver :wink:

En tout cas encore merci pour ton aide. Car même si je n'ai toujours pas ma solution, j'en ai beaucoup appris (à mon petit niveau :oops: )
 
Discussions similaires
Haut