Re
Avec ton formulaire et le captcha ça donne :
Ex : la page qui appelle ton formulaire test_form1.php
<?php
if (!isset($_SESSION))
{
session_start(); // Restaure la session précédente ou démarre ou nouvelle session
}
?>
<?php
//Juste pour simuler la fonction :
function checkdnsrr($domain)
{
return true;
}
?>
<html>
<body>
<?php include("form1.php");?>
</body>
</html>
Ceci est juste un exemple.
Dans ta propre page tu dois juste inclure tout au début en premier avant tout autre code php :
<?php
if (!isset($_SESSION))
{
session_start(); // Restaure la session précédente ou démarre ou nouvelle session
}
?>
Et quelque part dans le body de ta page faire l'include :
<?php include("form1.php");?>
Nota : tu n'es pas obligé de scinder ton code en 2 pages distinctes. Tu peux très bien copier le code du formulaire directement dans la page principale.
Le formulaire : form1.php
<?php
define("ST_READY", 0); // La page a été appellée pour la 1ere fois (aucun bouton n'a donc pu être cliqué)
define("ST_OK", 1); // La page a été appellée avec le bouton [Envoyer] et l'envoi du mail s'est bien passé
define("ST_PREVIEW", 2); // La page a été avec le bouton [Prévisualiser]
define("ST_ERROR", 3); // Une erreur s'est produite lors de la vérification de la page
function remplacements_speciaux($txt)
{
$txt=preg_replace('#(<|>)#', '-', $txt);
$txt=str_replace('"', "'",$txt);
$txt=str_replace('&', 'et',$txt);
return $txt;
}
function mail_valide($mail)
{
// La variable $verif va nous permettre d'analyser si la sémantique de l'email est bonne
$verif='#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,5}$#';
return preg_match($verif,$mail);
}
$reponse="";
// On regarde si la réponse a été postée par l'utilisateur
if (isset($_POST['reponse'])) $reponse=$_POST['reponse'];
$message="";
$objet="";
$votretelephone="";
$votremail="";
// On suppose qu'il y a une erreur par défaut même si ce n'est pas le cas.
// Raisonnement par l'absurde en quelque sorte ...
$status=ST_ERROR;
//input button envoi/previsualiser
$envoi=isset($_POST['envoi']) ? htmlentities($_POST['envoi']) : "";
$previsualiser=isset($_POST['previsualiser']) ? htmlentities($_POST['previsualiser']) : "";
if (isset($_POST['message']))
{
//quelques remplacements pour les specialchars
$message=remplacements_speciaux($_POST['message']);
$objet=isset($_POST['objet']) ? remplacements_speciaux($_POST['objet']) : "";
// On assigne et/ou protège nos variables
$votremail=stripslashes(htmlentities($_POST['votremail']));
$message=stripslashes(htmlspecialchars($message));
$objet=stripslashes(htmlspecialchars($objet));
$votretelephone=isset($_POST['votretelephone']) ? htmlentities($_POST['votretelephone']) : "";
//on enlève les espaces
$votremail=trim($votremail);
$message=trim($message);
$objet=trim($objet);
/*On vérifie si l'e mail et le message sont pleins, et on agit en fonction.
(on affiche Apercu du resultat, tel ou tel champ est vide, etc...*/
//Si ca ne vas pas (mal rempli, mail non valide...)
if((empty($message)) or (empty($objet)) or (!mail_valide($votremail)))
{
//les 3 champs sont vides
if(empty($votremail) and (empty($message)) and (empty($objet)))
{
$msgerr='Tous les champs sont vides.';
}
//un des champs est vide
else
{
if(!mail_valide($votremail))
{
$msgerr='Votre adresse e-mail n\'est pas valide.';
}
else
{
$msgerr='Il faut remplir tous les champs !';
}
}
}
//Si les deux sont pleins et que l'adresse est valide, on envoie on on prévisualise sans envoi
else
{
$domaine=preg_replace('#[^@]+@(.+)#','$1',$votremail);
$DomaineMailExiste=checkdnsrr($domaine,'MX');
if(!$DomaineMailExiste)
{
$msgerr='Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.';
}
elseif(!empty($previsualiser))
{
$status=ST_PREVIEW;
}
elseif(!empty($envoi))
{
// Test si la réponse au captcha est correcte !
if (isset($_SESSION['reponse']))
{
if ($_SESSION['reponse'] != $reponse)
{
$msgerr="Mauvaise réponse à la question posée ! Réessayez.";
}
else
{
$objet='[contact SITE] : '.$objet;
$destinataire='laurenti@monfail.fr';
$mail=$destinataire;
$headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8
859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');
$message = $message."\nTéléphone : ".$votretelephone;
if(mail($destinataire,$objet,$message,$headers))
{
$status=ST_OK;
}
else
{
$msgerr='Un problème est survenu durant l\'envoi du mail.';
}
}
}
else
{
$msgerr="Votre session a expirée ! Veuillez répondre de nouveau à la
question puis valider.";
}
}
else
{
$msgerr='Une condition innatendue est survenue lors de l\'exécution du script.';
}
}
}
else
{
$status=ST_READY;
}
switch ($status)
{
case ST_READY :
echo '<p>Tous les champs doivent être renseignés, merci.</p>';
break;
case ST_OK :
echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page
d\'accueil</a></p>';
break;
case ST_PREVIEW :
echo '<p>Votre message et votre adresse e-mail sont valides et prêts à être envoyés.
<br />Vous n\'avez plus qu\'à cliquer sur le bouton "Envoyer" sans oublier de répondre à la question
posée.<br />Prévisualisation :</p>';
break;
case ST_ERROR :
if (isset($msgerr) && !empty($msgerr))
{
echo "<p>".$msgerr."</p>";
}
else
{
echo "<p>Erreur non prévue !</p>";
}
break;
}
?>
<form id='contact' method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"" enctype="multipart/form-data">
<p id='obj'>Pour contacter directement JEAN PIERRE</p>
<p>
<label for='objet'>Objet de votre message :<br />
<input type='text' name='objet' id='objet' tabindex='10' size='50' value='<?php echo $objet;?>' />
</label>
</p>
<p id="adr">
<label for="mail">Votre Adresse E-mail<br />
<input name="votremail" tabindex="20" size="40" type="text" id="mail" value="<?php echo $votremail; ?>" />
</label>
</p>
<p id="tel">
<label for="telephone">Votre téléphone(si vous désirez être contactés)<br />
<input name="votretelephone" tabindex="30" size="30" type="text" id="telephone" value="<?php echo
$votretelephone ?>" />
</label>
</p>
<p id="msg">
<label for="message">Votre message<br />
<textarea tabindex="40" rows="10" cols="50" name="message" id="message"><?php echo $message; ?></textarea>
</label>
</p>
<?php
include("captcha.php");
$captcha=new capcha(); // Création d'un nouvel objet (instance) de classe capcha
// Sauvegarde dans la session de la réponse attendue issue du captcha
$_SESSION['reponse'] = substr($captcha->word,$captcha->num-1,1);
$bouton_previsualiser='<p class="bt"><input type="submit" name="previsualiser" tabindex="3" value="Prévisualiser"
/></p>';
$bouton_envoi='<p class="bt">'.$captcha->q().' <input type="text" name="reponse" id="reponse" size="4"> '.
'<input name="envoi" tabindex="4" value="Envoyer" type="submit" /></p>';
switch ($status)
{
case ST_READY :
echo $bouton_previsualiser.$bouton_envoi;
break;
case ST_PREVIEW :
echo $bouton_envoi;
break;
case ST_ERROR :
echo $bouton_previsualiser.$bouton_envoi;
break;
}
?>
</form>
La page : captcha.php qui est appellé dans la page form1.php par
include("captcha.php");
<?php
class capcha{
var $min;
var $max;
var $alphabet;
var $word;
var $num;
var $numletter;
function capcha(){
$this->min = 4;
$this->max = 6;
$this->alphabet = 'abcdefghijklmnopqrstuvwxyz';
$this->grain_de_sel = '6tIb90ZAS11';
$this->word = $this->createWord();
$this->num = $this->chooseNum();
$this->numletter = $this->num2letter();
}
function q(){
return 'Quelle est la '.$this->numletter.' lettre du mot '.$this->word.' ?';
}
function createWord(){
$len = rand($this->min,$this->max);
for($i=0;$i<$len;$i++){
$word[$i] = $this->alphabet[rand(0,strlen($this->alphabet)-1)];
}
return implode('',$word);
}
function chooseNum(){
return rand(1,strlen($this->word));
}
function num2letter(){
if($this->num == strlen($this->word)){
return 'dernière';
}
$array = array('1' => 'première','2' => 'deuxième','3' => 'troisième','4' => 'quatrième','5' => 'cinquième','6' => 'sizième','7' => 'septième','8' => 'huitième','9' => 'neuvième','10' => 'dixième');
if(isset($array[$this->num])){
return $array[$this->num];
}else{
return $this->num.'.ème';
}
}
function r(){
return md5($this->grain_de_sel.$this->word[$this->num-1]);
}
}
?>
Tu noteras que j'ai pas mal modifié le code de ton formulaire. J'ai notemment introduit le notion de status ce qui améliore la lisibilité du code. Au moins on sait où on en est !
Voilà j'ai pas tout testé ...ça c'est ton taf ! lol