Les Allergies
Alimentaires
Posez votre question Signaler

Intégrer un captcha dans un formulaire php [Résolu]

bg62 13339Messages postés 11 avril 2006Date d'inscription 20 mai 2012Dernière intervention - Dernière réponse le 14 juin 2010 à 11:18
Bonjour,
mon formulaire est terminé, bien comme je le voulais ....
( ajouter une info dans formulaire php#0 )
et maintenant j'aimerais intégrer une vérification avec un " captcha " mais je ne sais pas quelle commande insérer, ni où la mettre !!!
celui que j'ai trouvé est simple et sympa : question sur la place d'une lettre d'un mot généré au hasard (pas d'images) dont voici le code:
<?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]);
	}
}

?>

alors, encore une fois merci à l'avance pour toute aide que vous pourrez me donner
@mitiés
b g
Lire la suite 

Intégrer un captcha dans un formulaire php »

24 réponses
Réponse
+0
moins plus
re ...
personne pas le php ?
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
Bsr,

Ben je sais pas tout tu vois car j'ignorais ce qu'était un captcha : on fait j'ignorais que les systèmes de sécurité à base de séquence tirée au hasard portaient ce nom ... lol

J'ai pas été voir si ta classe captcha fonctionne car le problème n'est pas là.


Le problème c'est de vérifier que l'utilisateur à bien entré la bonne lettre : donc PHP doit en quelque sorte s'en souvenir d'un page à l'autre.

Voilà ce qui se passe
1 : l'utilisateur appelle ta page qui génère un nouveau captcha en php sur le serveur web à partir de ta classe captcha
2 : la page est retournée à l'utilisateur avec le captcha et s'affiche sur son navigateur : c'est ton formulaire en HTML
3 : l'utilisateur valide ce qui envoie les données vers une autre page ou la même peu importe au serveur PHP avec une des lettres du captcha saisie par l'utilisateur
4 : PHP doit vérifier que la lettre saisie correspond bien à celle du captcha précédemment généré ... pour cet utilisateur et pas un autre !!
Oui mais comment ?
En effet ne perd pas de vue que plusieurs utilisateurs peuvent accèder en même temps à ton formulaire, chacun avec un captcha différent naturellement.
Je te rappelle aussi qu'une fois la page web générée par le moteur PHP sur le serveur WEB, puis envoyée au client, toutes les variables PHP sont effaçées : il ne reste aucune trace ...
Il faut donc trouver un moyen de ne pas perdre l'environnement entre 2 appels à 2 pages PHP (ce peut être la même page) tout en identifiant de façon unique l'utilisateur.
Pour ce faire tu peux soit utiliser MySQL pour stocker les variables que tu ne veux pas perdre et attribuer un identifiant unique à chaque utilisateur, soit utiliser les sessions : c'est la solution la plus simple !

D'où ma question sais-tu utiliser/as-tu déjà utilisé les sessions en PHP ?

Ajouter un commentaire
Réponse
+0
moins plus
bonjour
ben dis donc, cen'est plus une réponse ... mais un cours !
ça a au moins le mérite d'être clair
mais je ne pensais pas aller si loin, utilise MySQL, non ...
quant aux sessions ... je ne pense pas que ce soit nécessaire
la classe captcha que j'ai mise ici est celle qui fonctionne là:
http://blog.unesourisetmoi.info/
et il ne me semble pas utiliser de sessions ...
c'est pour cela que je voudrais intégrer ce script ...
qu'en penses-tu ?
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
bjr

ben il semble déjà fonctionner ton captcha non ?

J'ai posté un truc dans "Mettez un 'favicon' sur votre site" (faudra que tu le supprimes lol)

Si je regarde le code de ton formulaire je trouve un champ caché nommé rep2 dont la valeur ressemble étrangement à un SID (session id) ou équivalent qui aurait été généré par la fct md5() en php : tu dois certainement t'en servir quelque part ailleurs non ?

Vérification anti-spam&nbsp;:<br />Quelle est la deuxième lettre du mot rtwe ?&nbsp;&nbsp;<input name="rep" type="text" size="10" /><br /><input name="rep2" type="hidden" value="2a89b66a60af2d98f9b5a29947c3a47f" />
	<br /><input type="submit" value="Envoyer" />
Ajouter un commentaire
Réponse
+0
moins plus
oui j'ai vu (j'ai effacé ) là le captcha fonctionne, mais c'est maintenant avec le formulaire que tu m'as aidé à faire que je voudrais le faire fonctionner pour l'intégrer sur les autres sites
celui que tu as vu vient de pluxml qui est un blog sans BDD assez pratique et léger .... mais tout en php ! (tu vois ce que ça veut dire pour moi !)
donc en résumé, j'ai maintenant mon formulaire de contact (avec l'ajourt du téléphone) et je voudrais intégrer cette fonction de vérification (le script est là haut) telle qu'elle fonctionne sur le blog
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
parti ?
Ajouter un commentaire
Réponse
+0
moins plus
PhP is back again lol

Oui donc tu t'es contenté d'utiliser un script tout prêt pour ton blog . Et à mon avis dans le code si tu cherches ils doivent utiliser soit les sessions soit des fichiers bruts sur le serveur.

Bref tu ne peux pas te contenter d'utiliser simplement la classe captchat. Le plus simple est d'utiliser les sessions.

Je pourrais te retrouver un petit ex très simple pour te montrer comment fonctionne les sessions.

Ajouter un commentaire
Réponse
+0
moins plus
ok c'est comme tu veux ! car là ça se complique pour moi ... pas du niveau !
le script que je t'ai mis est super sympa et de plus clair et net , donc déjà au départ j'aimerais bien le même genre ... après ? les sessions ?
et ce script est intégré d'origine sur le blog (si tu veux regarder recherche sur 'pluxml')
@mitiés
b g
Ajouter un commentaire
Réponse
+0
moins plus
S.O.S. .... je cale et je vais craquer !
b g
Ajouter un commentaire
Réponse
+0
moins plus
up ... en passant au cas ou quelqu'un pourrait me dépanner !
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
Bjr

Voilà un petit exemple qui intègre ta classe capcha.

La page : form.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]);
	}
}

?>
<?php
if (!isset($_SESSION)) 
{
	session_start();  // Restaure la session précédente ou démarre ou nouvelle session 
}

// On sauvegarde l'heure de création de la session : juste pour info ne sert pas
if (!isset($_SESSION['generated']))
{
	$_SESSION['generated'] = time();
}


$capcha=new capcha(); // Création d'un nouvel objet (instance) de classe capcha

// Sauvegarde dans la session de la réponse attendue issue du capcha
$_SESSION['reponse'] = substr($capcha->word,$capcha->num-1,1);
?>
<html>
<body>
<pre>
<?php
echo "--- Debug début ---<br/>";
echo "Session démarrée le ".date('d-m-Y à H:i:s',$_SESSION['generated'])."<br/>";
echo "Réponse attendue : ".$_SESSION['reponse']."<br/>";
echo var_dump($capcha);
echo "--- Debug fin ---";?>
</pre>
<br/>
<br/>

<?php 
if (isset($msgerr)) echo "Erreur : ".$msgerr."<br/>";
?>

<form action="form_verif.php" method="post">
<?php echo $capcha->q();?>&nbsp;<input type="text" name="reponse" id="reponse" size="4">
<input type="submit" value="Envoyer">
</form>
</body>
</html>



La page : form_verif.php


<?php
// On restaure la session pour l'utilisateur
if (!isset($_SESSION)) 
{
	session_start();  // Restaure la session précédente ou démarre ou nouvelle session 
}


$reponse="";
// On regarde si la réponse a été postée par l'utilisateur
if (isset($_POST['reponse'])) $reponse=$_POST['reponse'];

// On teste si la réponse du capcha existe déjà dans la session
if (isset($_SESSION['reponse']))
{
	if ($_SESSION['reponse'] != $reponse) 
	{
		$msgerr="Mauvaise réponse.";
		include("form.php");
		exit;
	}
}
else
{
	// Si la réponse n'est pas déjà dans la session on suppose que la session a expiré
	// l'utilisateur doit recommencer
	$msgerr="Votre session a expiré.";
	include("form.php");
	exit;	
}
?>
<html>
<body>
<?php
echo "Session démarrée le ".date('d-m-Y à H:i:s',$_SESSION['generated'])."<br/>";
echo "Réponse attendue : ".$_SESSION['reponse']."<br/>";
echo "Réponse fournie : ".$reponse."<br/>";
echo "BRAVO : bonne réponse !";
?>


Une fois que tu as compris comment ça marche c'est assez facile de l'intégrer à ton propre formulaire.
Mais dans un premier temps essai de comprendre comment fonctionne les sessions.
PHP stocke automatiquement dans un tableau superglobal toutes les variables envoyées aux pages PHP par le méthode POST :
ce tableau s'appelle $_POST;
Et bien de la même façon il est possible d'utiliser un autre tableau superglobal prédéfini $_SESSION pour stocker les valeurs des variables qu'on ne veut pas perdre entre 2 appels à 2 pages ou plus.
L'instruction session_start() force PHP à recharger le contenu du tableau $_SESSION : si aucun session n'avait été sauvegardée ou si la session est expirée alors ce tableau et vide. En effet par soucis de sécurité, une session n'est valide que pendant un certain délai défini lors de la compilation / l'installation du module PHP sur le serveur. Dès que tu recharges une page, si la session n'est pas expirée alors le compteur repart à zéro (du moins je crois). Donc si l'utilisateur n'attend pas des "plombes" devant son écran sans cliquer, il n'y a pas de problème.
Pour la sauvegarde tu n'as rien à faire : dès que tu places quelque chose dans le tableau $_SESSION, PHP le sauvegarde automatiquement. Cool !


Ajouter un commentaire
Réponse
+0
moins plus
grand merci ! mais malgré toutes tes explications, très claires ... je plante encore un peu ...
quand tu m'as parlé de session, j'ai cru que c'était comme certains scripts pour lesquels si l'on veut les faire fonctionner (chez free la plus part du temps) il faut créer un dossier sessions ....
et 2 - voici ce que j'ai actuellement dans un fichier appelé form1.php (celui que tu m'as aidé à faire)
<code><?php
$objet="";
$votretelephone="";
$Previsualiser='<p class="bt"><input type="submit" name="previsualiser" tabindex="3" value="Prévisualiser" /></p>';
$Envoi="\n".'<p class="bt"><input name="envoi" tabindex="4" value="Envoyer" type="submit" /></p>';
if (isset($_POST['message']))
{
// 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}$#';

$votretelephone=isset($_POST['votretelephone']) ? htmlentities($_POST['votretelephone']) : "";


//quelques remplacements pour les specialchars
$message=preg_replace('#(<|>)#', '-', $_POST['message']);
$message=str_replace('"', "'",$message);
$message=str_replace('&', 'et',$message);
$objet=preg_replace('#(<|>)#', '-', $_POST['objet']);
$objet=str_replace('"', "'",$objet);
$objet=str_replace('&', 'et',$objet);

// On assigne et/ou protège nos variables
$votremail=stripslashes(htmlentities($_POST['votremail']));
$message=stripslashes(htmlspecialchars($message));
$objet=stripslashes(htmlspecialchars($objet));

//input button envoi/previsualiser
// $envoi=htmlentities($_POST['envoi']);
$envoi=isset($_POST['envoi']) ? htmlentities($_POST['envoi']) : "";

// $previsualiser=htmlentities($_POST['previsualiser']);
$previsualiser=isset($_POST['previsualiser']) ? htmlentities($_POST['previsualiser']) : "";

//on enlève les espaces
$votremail=trim($votremail);
$message=trim($message);
$objet=trim($objet);
$apercu_resultat='<p>Aperçu du résultat :</p>';

/*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 (!preg_match($verif,$votremail)))
{
//les 3 champs sont vides
if(empty($votremail) and (empty($message)) and (empty($objet)))
{
echo '<p>Tous les champs sont vides.</p>';
$message='';$votremail='';$objet='';$apercu_resultat='';
}
//un des champs est vide
else
{
if(!preg_match($verif,$votremail))
{
echo'<p>Votre adresse e-mail n\'est pas valide.</p>';
}
else
{
echo'<p>Il faut remplir tous les champs !</p>';
if(empty($message)) { $apercu_resultat=''; }
}
}
}
//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)
{
echo'<p>Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.</p>';
}
elseif(!empty($previsualiser))
{
$apercu_resultat='<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".<br />Prévisualisation :</p>';
$Previsualiser='';
}
elseif(!empty($envoi))
{
$objet='[contact SITE JP] : '.$objet;
$headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i');
$destinataire='sas-jpb@hotmail.fr';
$message = $message."\nTéléphone : ".$votretelephone;
if(mail($destinataire,$objet,$message,$headers))
{
echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page d\'accueil</a></p>';
$Envoi='';
$Previsualiser='';
}
else
{
echo'<p>Un problème est survenu durant l\'envoi du mail.</p>';
}
}
else
{
echo'<p>Une condition innatendue est survenue lors de l\'exécution du script.</p>';
}
}
echo $apercu_resultat;
}
else
{
echo '<p>Toutes les lignes doivent être renseignées, merci.</p>';
$votremail='';$message='';

}
$bas_formulaire=$Previsualiser.$Envoi;
?>
<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; ?>
Ajouter un commentaire
Réponse
+0
moins plus
je recommence car je crois que c'est mal passé:
grand merci ! mais malgré toutes tes explications, très claires ... je plante encore un peu ...
quand tu m'as parlé de session, j'ai cru que c'était comme certains scripts pour lesquels si l'on veut les faire fonctionner (chez free la plus part du temps) il faut créer un dossier sessions ....
et 2 - voici ce que j'ai actuellement dans un fichier appelé form1.php (celui que tu m'as aidé à faire)
<?php 
$objet="";
$votretelephone="";
$Previsualiser='<p class="bt"><input type="submit" name="previsualiser" tabindex="3" value="Prévisualiser" /></p>'; 
$Envoi="\n".'<p class="bt"><input name="envoi" tabindex="4" value="Envoyer" type="submit" /></p>'; 
if (isset($_POST['message'])) 
{ 
	// 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}$#'; 

	$votretelephone=isset($_POST['votretelephone']) ? htmlentities($_POST['votretelephone']) : "";
	

	//quelques remplacements pour les specialchars 
	$message=preg_replace('#(<|>)#', '-', $_POST['message']); 
	$message=str_replace('"', "'",$message); 
	$message=str_replace('&', 'et',$message); 
	$objet=preg_replace('#(<|>)#', '-', $_POST['objet']); 
	$objet=str_replace('"', "'",$objet); 
	$objet=str_replace('&', 'et',$objet); 

	// On assigne et/ou protège nos variables 
	$votremail=stripslashes(htmlentities($_POST['votremail'])); 
	$message=stripslashes(htmlspecialchars($message)); 
	$objet=stripslashes(htmlspecialchars($objet)); 

	//input button envoi/previsualiser 
	// $envoi=htmlentities($_POST['envoi']); 
	$envoi=isset($_POST['envoi']) ? htmlentities($_POST['envoi']) : "";

	// $previsualiser=htmlentities($_POST['previsualiser']); 
	$previsualiser=isset($_POST['previsualiser']) ? htmlentities($_POST['previsualiser']) : "";

	//on enlève les espaces 
	$votremail=trim($votremail); 
	$message=trim($message); 
	$objet=trim($objet); 
	$apercu_resultat='<p>Aperçu du résultat :</p>'; 

	/*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 (!preg_match($verif,$votremail))) 
	{ 
		//les 3 champs sont vides 
		if(empty($votremail) and (empty($message)) and (empty($objet))) 
		{ 
			echo '<p>Tous les champs sont vides.</p>'; 
			$message='';$votremail='';$objet='';$apercu_resultat=''; 
		} 
		//un des champs est vide 
		else 
		{ 
			if(!preg_match($verif,$votremail)) 
			{
				echo'<p>Votre adresse e-mail n\'est pas valide.</p>'; 
			}
			else 
			{ 
				echo'<p>Il faut remplir tous les champs !</p>'; 
				if(empty($message)) { $apercu_resultat=''; }
			} 
		} 
	} 
	//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) 
		{
			echo'<p>Le nom de domaine de l\'adresse e-mail que vous avez donné n\'existe pas.</p>'; 
		}
		elseif(!empty($previsualiser)) 
		{ 
			$apercu_resultat='<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".<br />Prévisualisation :</p>'; 
			$Previsualiser=''; 
		} 
		elseif(!empty($envoi)) 
		{ 
			$objet='[contact SITE] : '.$objet; 
			$headers='From:'.$votremail."\r\n".'To:'.$mail."\r\n".'Subject:'.$objet."\r\n".'Content-type:text/plain;charset=is-8859-1'."\r\n".'Sent:'.date('l, F d, Y H:i'); 
			$destinataire='laurenti@monfail.fr
'; 
                                          $message = $message."\nTéléphone : ".$votretelephone;
			if(mail($destinataire,$objet,$message,$headers)) 
			{ 
				echo '<p>Votre message a bien été envoyé. Merci.</p><p><a href="/">Retour à la page d\'accueil</a></p>'; 
				$Envoi=''; 
				$Previsualiser=''; 
			} 
			else 
			{
				echo'<p>Un problème est survenu durant l\'envoi du mail.</p>'; 
			}
		} 
		else 
		{
			echo'<p>Une condition innatendue est survenue lors de l\'exécution du script.</p>'; 
		}
	} 
	echo $apercu_resultat; 
} 
else 
{ 
	echo '<p>Toutes les lignes doivent être renseignées, merci.</p>'; 
	$votremail='';$message=''; 
	
} 
$bas_formulaire=$Previsualiser.$Envoi; 
?> 
<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&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 echo $bas_formulaire;?> 
</form>  


il y aurait donc trois fichiers a utiliser ? form1.php form.php form_verif.php
c'est le premier qui serait appelé par un include dans la page où l'on veut voir apparaitre le formulaire
mais je ne vois pas trop comment se 'goupillent' les deux autres vis à vis de celui-là ...... !!
lourd le bg hein !
alors stpl encore un peu d'aide
@mitiés
b g
Ajouter un commentaire
Réponse
+0
moins plus
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&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

// 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().'&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;	
}
?>
</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
Ajouter un commentaire
Réponse
+0
moins plus
ok et grand grand grand merci
je vais essayer de tester cela au plus vite et je te dis quoi ,
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,

Voir aussi l'article sur phpsolutions: Défense anti-spam dans les formulaires web disponible sur http://phpsolmag.org/fr/phpsolmag/download.html
bg62 - 8 oct. 2007 à 12:11
Bonjour,
 Écrire votre adresse e-mail*:
* Si vous n'êtes pas encore sur la liste de diffusion - enregistrez-vous

.... merci mais je n'aime pas beaucoup les inscriptions forcées sans prévenir
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
salut je viens de tester ... tout semble fonctionner impec ... sauf que :
1 - j'ai ceci dans le haut du message:
859-1
Sent:Monday, October 08, 2007 15:08

pas génant ... mais à quoi sert le " 859-1 " ????
2 - j'ai fait des essais en répondant juste ou mal dans le captcha >>>>> ça passe à tous les coups !
>>> cherchez l'erreur .... encore du boulot pour toi car là je " p l a n e " !!
@+
b g

ViRUZ404 - 16 nov. 2009 à 00:54
ça ressemble étrangement au charset iso-8859-1 à un caractère manquant près ;)
Ajouter un commentaire
Réponse
+0
moins plus
Bsr

le texte dont tu parles correspond à une partie des headers que tu transmets à la fonction email(). A priori tes headers sont mal mis en forme.


Essai en remplaçant :

$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'); 


par :

$headers='From:'.$votremail."\r\n".
	'To:'.$mail."\r\n".
	'Subject:'.$objet."\r\n".
	'Content-type: text/plain; charset=ISO-8859-1'."\r\n".
	'Sent:'.date('l, F d, Y H:i'); 



Je ne suis pas un pro de la fonction email et encore moins des headers . Je ne sais pas si "Sent" constitue un header valide. Eventuellement supprime le et mets seulement :

$headers='From:'.$votremail."\r\n".
	'To:'.$mail."\r\n".
	'Subject:'.$objet."\r\n".
	'Content-type: text/plain; charset=ISO-8859-1'; 


Pour le captcha ben chez moi ça fonctionne alors je ne sais pas trop quoi te dire ...

Ajouter un commentaire
Réponse
+0
moins plus
ok je t'envoie le lien par 'mp'
@+
b g
Ajouter un commentaire
Réponse
+0
moins plus
résolu grâce à PHP
grand merci !
@+
lecocq1- 10 juin 2010 à 16:31
Bonjour
Vous serait-il possible de lister vos deux fichiers finis "captcha.php et form1.php" (ou peut-être trois) car votre problème résolu, après essai, il me répond en boucle : "Votre session a expirée ! Veuillez répondre de nouveau à la question puis valider."
Ajouter un commentaire
Ce document intitulé « intégrer un captcha dans un formulaire php » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?
intégrer un captcha dans un formulaire php - page 2