Intégrer un captcha dans un formulaire php

Résolu/Fermé
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 - 27 sept. 2007 à 16:18
vegamax Messages postés 134 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 22 février 2017 - 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

21 réponses

bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
28 sept. 2007 à 08:03
re ...
personne pas le php ?
@+
b g
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
29 sept. 2007 à 09:43
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à:
https://longuetraine.fr/
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
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
29 sept. 2007 à 10:17
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" />
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
29 sept. 2007 à 10:45
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
1 oct. 2007 à 10:25
parti ?
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
1 oct. 2007 à 23:14
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.

0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
2 oct. 2007 à 10:15
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
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
4 oct. 2007 à 09:53
S.O.S. .... je cale et je vais craquer !
b g
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
5 oct. 2007 à 15:33
up ... en passant au cas ou quelqu'un pourrait me dépanner !
@+
b g
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
6 oct. 2007 à 12:49
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 !


0
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; ?>
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
6 oct. 2007 à 16:09
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
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
6 oct. 2007 à 22:07
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
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
8 oct. 2007 à 11:08
ok et grand grand grand merci
je vais essayer de tester cela au plus vite et je te dis quoi ,
@+
b g
0
Bonjour,

Voir aussi l'article sur phpsolutions: Défense anti-spam dans les formulaires web disponible sur http://phpsolmag.org/fr/phpsolmag/download.html
0
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
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
8 oct. 2007 à 15:14
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

0
ça ressemble étrangement au charset iso-8859-1 à un caractère manquant près ;)
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
8 oct. 2007 à 21:48
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 ...

0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
9 oct. 2007 à 09:29
ok je t'envoie le lien par 'mp'
@+
b g
0
bg62 Messages postés 23590 Date d'inscription samedi 22 octobre 2005 Statut Modérateur Dernière intervention 15 avril 2024 2 362
17 oct. 2007 à 11:49
résolu grâce à PHP
grand merci !
@+
0
Utilisateur anonyme
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."
0
vegamax Messages postés 134 Date d'inscription lundi 28 janvier 2008 Statut Membre Dernière intervention 22 février 2017 4
14 juin 2010 à 11:18
Bonjour !
J'ai la même question que "lecocq1" car je n'arrive pas, moi aussi, à intégrer le captcha à mon formulaire.
Donc si vous pouviez poster vos 2 fichiers finis, ce serait sympa ;-)

Moi j'ai posé ma question ici : https://forums.commentcamarche.net/forum/affich-18131765-ou-inserer-le-script-captcha-dans-mon-formula#p18131765

Bonne journée !
0