8791 sujets

Développement web côté serveur, CMS

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:
<?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&eacute;sirez &ecirc;tre contact&eacute;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().'&nbsp;<input type="text" name="reponse" id="reponse" size="4">&nbsp;'.
	'<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