bonjour
j'ai un formulaire (appelant un captcha) qui fonctionne cahin-caha ... et pas partout ! Plus que novice en php, si quelqu'un pouvait me trouver l'erreur,ce serait super !
voici les codes:
le formulaire:
la class captcha appelée:
grand merci à l'avance
@mitiés
b g
j'ai un formulaire (appelant un captcha) qui fonctionne cahin-caha ... et pas partout ! Plus que novice en php, si quelqu'un pouvait me trouver l'erreur,ce serait super !
voici les codes:
le formulaire:
<?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['solution']))
{
if ($_SESSION['solution'] != $reponse)
{
$msgerr="Mauvaise réponse à la question posée ! Réessayez.";
}
else
{
$objet='[contact SITE info] : '.$objet;
$destinataire='monmail@monfai.info';
$mail=$destinataire;
$headers='From:'.$votremail."\r\n".
'Subject:'.$objet."\r\n".
'Content-type: text/plain; charset=ISO-8859-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'>Utilisez ce formulaire et je vous réponds au plus vite, merci</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(facultatif, 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
$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;
}
if (isset($_SESSION))
{
session_destroy();
}
session_start(); // Restaure la session précédente ou démarre ou nouvelle session
// Sauvegarde dans la session de la réponse attendue issue du captcha
$_SESSION['solution'] = substr($captcha->word,$captcha->num-1,1);
?>
</form>
la class captcha appelée:
<?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]);
}
}
?>
grand merci à l'avance
@mitiés
b g