Formulaire et php .. ou est l'erreur?

WRInaute passionné
Bonjour,

Je bloque sur un truc sans doute très con ... mais je bloque quand même!
Dans le formulaire ci-dessous, je vérifie que les champs ne sont pas vides avant de l'envoyer. Je bute sur le faite que si seul le champ 3 est remplie, le formulaire est envoyé 8O alors qu'il ne devrait pas! L'erreur est bien renvoyé mais le mail part quand même .. pourquoi ?
Code:
<?php

if(isset($_POST["Valider"]))
{
$lechamp1 = stripslashes($_POST["champ1"]);
$lechamp2= stripslashes($_POST["champ2"]);
$lechamp3= stripslashes($_POST["champ3"]);

if(empty($lechamp1)){
echo 'le champ1 est vide';
}
if(empty($lechamp2)){
echo 'le champ2 est vide';
}
if(empty($lechamp3)){
echo 'le champ3 est vide';
}
else
{

    $mon_email = "toto@free.fr";
    $mon_pseudo = "toto";
    $mon_url = "http://toto.free.fr";
    $son_email = ''.$lechamp3.'';


    // Envoie du mail
    $entete = "From: " . $mon_pseudo . " <" . $mon_email . ">\n";
    $entete .= "MIME-Version: 1.0";

    if (@mail($mon_email,$lechamp1,$lechamp2,$entete)){ 
        echo "Votre message a été envoyé.<br />\n"; 
        echo "<a href=\"" . $mon_url . "\">Retour</a>\n"; 
    }
    else { 
        echo "Un problème s'est produit lors de l'envoi du message.\n";
        echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a><\n";
    }
}
}
?>

<form action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
<fieldset>
<legend>Formulaire</legend>
<p>Objet de votre message</p>
<input name="champ1" size="40" maxlength="100" type="text"><br/>
<p>Votre message</p>
<textarea name="champ2" rows="3" cols="30"></textarea><br/>
<p>Votre email</p>
<input name="champ3" size="40" maxlength="100" type="text"><br/>
<input name="Valider" value="Valider" type="submit">
<input name="Effacer" value="Effacer" type="reset">
</fieldset>
</form>
Merci de m'orienter.
 
WRInaute passionné
et le champ 1 aussi :wink:

le "else" ne joue que sur le if qui le précède, pas sur les deux premiers :wink:
 
WRInaute passionné
Je ne comprend pas!
Pourrais tu reprendre mon exemple en me montrant les erreurs stp (j'imprimerais plus vite :)?

Un truc comme sa ?
Code:
...
if(empty($lechamp1)){
echo 'le champ1 est vide';
}
elseif(empty($lechamp2)){
echo 'le champ2 est vide';
}
elseif(empty($lechamp3)){
echo 'le champ3 est vide';
}
else
{ 
...
Merci
 
WRInaute passionné
tryan a dit:
Je ne comprend pas!
Pourrais tu reprendre mon exemple en me montrant les erreurs stp (j'imprimerais plus vite :)?

Un truc comme sa ?
Code:
...
if(empty($lechamp1)){
echo 'le champ1 est vide';
}
elseif(empty($lechamp2)){
echo 'le champ2 est vide';
}
elseif(empty($lechamp3)){
echo 'le champ3 est vide';
}
else
{ 
...
Merci

oublie le message de mahdivitche, c'est n'importe quoi

oui là ton code marchera mais si il y a plusieurs erreurs l'internaute devra soumettre plusieurs fois.

Le mieux des de faire comme ça :

Code:
if(empty($lechamp1)) $alerte_champ1= 1;
if(empty($lechamp2)) $alerte_champ2= 1;
if(empty($lechamp3)) $alerte_champ3= 1;
if (!$alerte_champ1 AND !$alerte_champ2 AND !$alerte_champ3)
{ 
// envoi du mail
}
else
{
// on affiche le formulaire en réécrivant les erreurs

echo "<input name="champ1" size="40" maxlength="100" type="text">";
if ($alerte_champ1) echo "<span style="color: red">Champ requis</span>";

...
}

Compris ?
 
WRInaute passionné
Oui et non :D !
Oui je comprend ta façon de faire, sa c'est ok :wink: .
Ce que je veux savoir maintenant, c'est pourquoi la mienne ne fonctionne pas?

Pourtant j'utilise bien des conditions et les conditions sont censées stoppés l'envoie de l'email si elles ne sont pas remplies ... c'est cette partie que je ne pige pas.

ps: j'ai mis qu'une partie courte du formulaire, normalement j'ajoute le ré affichage du contenue des champs pour éviter la perte des données déjà remplies.
 
WRInaute accro
Code:
if(empty($lechamp1)){
echo 'le champ1 est vide';
}
if(empty($lechamp2)){
echo 'le champ2 est vide';
}
if(empty($lechamp3)){
echo 'le champ3 est vide';
}
else
{

Tu as écris la chose suivante :

Si la variable $lechamp1 est vide, affiche le message "le champ 1 est vide", sinon ne fait rien.
Si la variable $lechamp2 est vide, affiche le message "le champ 2 est vide", sinon ne fait rien.
Si la variable $lechamp3 est vide, affiche le message "le champ 1 est vide", sinon envoi le mail.

Donc il n'y a que ton champ 3 qui détermine l'envoi du mail.
 
WRInaute accro
Ton code marche pas parce que ton envoi de formulaire (else) n'est rattaché qu'à ta dernière clause IF. pas aux trois en même temps.

Donc si les champs 1 et/ou 2 sont vides mais que le champ 3 est rempli, ton formulaire part quand même.

Moi, je fonctionne comme ça :

Code:
$envoi_mail=1;
if(empty($lechamp1)){echo 'le champ1 est vide';$envoi_mail=0;}
if(empty($lechamp2)){echo 'le champ2 est vide';$envoi_mail=0;}
if(empty($lechamp3)){echo 'le champ3 est vide';$envoi_mail=0;}
if(empty($lechamp4)){echo 'le champ4 est vide';$envoi_mail=0;}
//etc... et a la fin:

if($envoi_mail==1){// envoi du mail }
else {//on réaffiche le formulaire (prérempli des infos saisies bien sur}
 
WRInaute accro
comme indiqué, et pour résumer en une ligne, tu utilise if au lieu de else if. tu le dis toi meme
if ()
{}
else if ()
{}
else if ()
{}
else
{}
 
WRInaute passionné
Ok ok :D .
Donc si je fais:
Code:
if(empty($lechamp1)){
echo 'Le champ1 est vide <br/>';
}
elseif(empty($lechamp2)){
echo 'Le champ2 est vide <br/>';
}
elseif(empty($lechamp3)){
echo 'Le champ3 est vide <br/>';
}
else
{
....
La c'est bon, les champs sont bien vérifiés et sa part que si les 3 sont ok... J'ai bon là ?

Pour éviter la perte des données si erreur, je fais:
Code:
<input name="champ1" size="40" maxlength="100" type="text" value="<?php
if (!empty($_POST["champ1"])) {
echo htmlspecialchars($_POST["champ1"],ENT_QUOTES);
}
?>">
Toujours bon ?
Merci
 
WRInaute passionné
Tu en est sure nickargall ? -> http://fr3.php.net/elseif .

Autre question lié au formulaire:
J'utilise une fonction qui permet de façon aléatoire d'associer 8 caractères (chiffres+lettres) pour générer une "sorte" de capcha afin d'éviter le spam par des robots ...
Cette façon de procéder va elle limiter le spam ?
Merci
 
WRInaute passionné
Ca fait la même chose, même si sémantiquement y'a une légère différence (un else if c'est un else qui execute la ligne en dessous donc en gros "else if(" équivaut à "else { if ( ..." et elseif c'est un else avec test.
 
Discussions similaires
Haut