rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut :

Intégrer un captcha dans un formulaire php

Posté par bg62, le jeudi 27 septembre 2007 à 16:18:12
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
le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Configuration: Windows XP
Firefox 2.0.0.4
Répondre à bg62  Signaler ce message aux modérateurs Aller au dernier message

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le vendredi 28 septembre 2007 à 08:03:24
re ...
personne pas le php ?
@+
b g le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
PhP, le vendredi 28 septembre 2007 à 18:16:41
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 ?

PhP  
Il y a 10 types de personnes dans le monde : ceux qui compre­nnent le binaire et les autres ...
Répondre à PhP

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le samedi 29 septembre 2007 à 09:43:15
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 le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
PhP, le samedi 29 septembre 2007 à 10:17:58
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" />
PhP  
Il y a 10 types de personnes dans le monde : ceux qui compre­nnent le binaire et les autres ...
Répondre à PhP

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le samedi 29 septembre 2007 à 10:45:19
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 le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le lundi 1 octobre 2007 à 10:25:58
parti ? le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
PhP, le lundi 1 octobre 2007 à 23:14:30
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.

PhP  
Il y a 10 types de personnes dans le monde : ceux qui compre­nnent le binaire et les autres ...
Répondre à PhP

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le mardi 2 octobre 2007 à 10:15:23
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 le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le jeudi 4 octobre 2007 à 09:53:00
S.O.S. .... je cale et je vais craquer !
b g le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le vendredi 5 octobre 2007 à 15:33:16
up ... en passant au cas ou quelqu'un pourrait me dépanner !
@+
b g le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
PhP, le samedi 6 octobre 2007 à 12:49:52
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 !


PhP  
Il y a 10 types de personnes dans le monde : ceux qui compre­nnent le binaire et les autres ...
Répondre à PhP


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le samedi 6 octobre 2007 à 16:00:40
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; ?>
Répondre à bg62

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le samedi 6 octobre 2007 à 16:09:57
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 le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
PhP, le samedi 6 octobre 2007 à 22:07:27
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.&qu­ot;\r\n".'Subject:'.$objet."\r\n".'Content-ty­pe: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;<in­put 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
PhP  
Il y a 10 types de personnes dans le monde : ceux qui compre­nnent le binaire et les autres ...
Répondre à PhP

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le lundi 8 octobre 2007 à 11:08:05
ok et grand grand grand merci
je vais essayer de tester cela au plus vite et je te dis quoi ,
@+
b g le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
phpsol, le lundi 8 octobre 2007 à 11:29:05
Bonjour,

Voir aussi l'article sur phpsolutions: Défense anti-spam dans les formulaires web disponible sur http://phpsolmag.org/fr/phpsolmag/download.html
Répondre à phpsol

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le lundi 8 octobre 2007 à 12:11:33
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
Répondre à bg62

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
bg62, le lundi 8 octobre 2007 à 15:14:47
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

le 'www' est fait aussi pour communiquer, partager et échanger, non ?
Répondre à bg62

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
PhP, le lundi 8 octobre 2007 à 21:48:21
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.&qu­ot;\r\n".'Subject:'.$objet."\r\n".'Content-ty­pe: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 ...

PhP  
Il y a 10 types de personnes dans le monde : ceux qui compre­nnent le binaire et les autres ...
Répondre à PhP

20


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs