Ajouter juste un captcha

Eléphant du PHP | 188 Messages

21 nov. 2011, 23:42

- La requête, je l'effectue dans PhpMyAdmin ou c'est juste un exemple :?:
Non, la requette on l'a mettra après dans ton fichier .php
- Je place donc le code du nombre aléatoire et celui des paramètres à côté dans le fichier, ça ne gênera pas :?:
Pour l'instant ne met rien dans ta page, je sais c'est rageant mais on structera bien après quand on aura fini l'étape formulaire, ce qui est bientôt fini !
- En ce qui concerne le <img alt="captcha" src="<?php echo $adresse; ?>" />, je fais de cette sorte :
<label for="captcha">Recopiez les caractères de l'image:</label>  <img alt="captcha" src="<?php echo $adresse; ?>" /> <input type="text" name="captcha" id="captcha" />
:?:
Oui c'est parfait ! Mais encore une fois, ne met rien dans ta page car on va tout structuré plus tard.

--------------------------------------------------------------------------------

Donc on avait distingué 2 parties dans ta page :
- le formulaire (avec l'image captcha, la réponse captcha et surtout les autres champs de ton formulaire)
- le traitement de ton formulaire (pour l'instant avec ton envoi d'email, mais on y mettra tout notre futur boulot)

Pour terminé le formulaire, il ne manque plus qu'un champ hidden pour transmettre l'id du captcha.
Un champ hidden permet de transmettre une variable avec le formulaire sans que l'utilisateur n'ai a faire quelque chose pour cette variable, il ne le saur meme pas.
c'est très simple, voici la syntaxe :
<input type="hidden" name="nom_variable" value="valeur_variable" />
Dans notre cas, il nous faut transmettre la variable nommé id, qui a pour valeur l'id du captcha (généré avec le mt_rand)

ce qui donnera :
<input type="hidden" name="id" value="<?php echo $nombre_aleat; ?>" />
Voila, le formulaire est fini ! Enfin, y'a plus qu'a tout mettre dans l'ordre quoi ... :)

-----------------------------------------------------------------------------------------

Bon, j'ai relu ton premier script, et tu avais fait formulaire + traitement sur une seule page. C'est bien, c'est même très bien, mais c'est plus compliqué à gérer (notemment pour limiter les failles) donc je te conseil qu'on reparte sur une base de 2 pages:

formulaire.php (avec le formulaire)
traitement.php (qui analyse les infos envoyées)
(tu peux donner a ses fichiers le nom que tu veux du moment que tu fais gaffe après au liens :wink: )

Pour formulaire.php, c'est bon ! on va le créer :

Tu prends ta page normale (avec ton entête, et tout ce que tu as besoin genre : le menu, le pied de page, ect ...)
Tu y met ton formulaire que tu nous a fourni au début, le voici :
<form method="post" action="traitement.php">
                 <div><label for="name">Nom:</label> <input type="text" name="name" id="name" /></div>
             <div><label for="email">E-mail:</label> <input type="text" name="email" id="email" /></div>
             <div><label for="message">Message:</label> <textarea name="message" id="message" ></textarea></div>
             <div><input type="submit" value="Envoyer" class="send-form"/></div>
         </form>
(j'ai modifié la valeur de "action" car maintenant on bosse sur 2 pages)

A ce formulaire, on va y ajouter, en dessous du textarea "message" et juste au dessus du bouton submit, :

- la génération du nombre aléatoire
- la requette MySQL pour obtenir l'adresse
- l'affichage de l'image captcha (grace à l'adresse obtenue au dessus) + l'input pour demander la solution du captcha
- le champ hidden (cf début de mon message)

A toi l'honneur :)

Eléphant du PHP | 188 Messages

22 nov. 2011, 22:12

N'hesite pas à me dire si tu rencontre un problème, je te laisse le faire pour dire que tu manipule un maximum pour connaitre le code mais je suis là pour t'aider :)

Eléphanteau du PHP | 36 Messages

23 nov. 2011, 20:36

Hello,

Petit message pour dire que j'ai été assez occupé donc pas eu le temps de faire quoi que ce soit, je serais de retour demain 8-)

Eléphanteau du PHP | 36 Messages

24 nov. 2011, 19:37

Je vais plutôt prendre contact.php que formulaire.php :P

Bon, donc j'ai remedolé de sorte à ce qu'il n'y ai que le formulaire dans mon fichier, ce qui donne ceci pour contact.php :
<?php if(!defined('access') or !access) die('This file cannot be directly accessed.'); ?>
<?php include_theme_header(); ?>

<div id="content" class="pages page_contact">
<h1>Contactez nous</h1>
<hr /> <br />
<div class="content" style="font-size: 1em"> Bienvenue sur la page de contact, merci de remplir les champs ci-dessous afin de procéder à l'envoi de votre message. </div>
	
<form method="post" action="traitement.php">
<div><label for="name">Nom:</label> <input type="text" name="name" id="name" /></div>
<div><label for="email">E-mail:</label> <input type="text" name="email" id="email" /></div>
<div><label for="message">Message:</label> <textarea name="message" id="message" ></textarea></div>

<label for="captcha">Recopiez les caractères de l'image:</label>  <img alt="captcha" src="<?php echo $adresse; ?>" /> <input type="text" name="captcha" id="captcha" /> <input type="hidden" name="id" value="<?php echo $nombre_aleat; ?>" />

<div><input type="submit" value="Envoyer" class="send-form"/></div>

</form>

</div> </div>

<?php include_theme_footer(); ?>
Est-ce que cela te parait correct déjà :?:

Eléphant du PHP | 188 Messages

24 nov. 2011, 22:14

Tu as testé le script ? Je pense pas parce qu'il ne va pas fonctionner :( Tu mériterais 10 coups de batons ! :P Tu a complétement shinté le passage "nombre aléatoire" et "requette BDD", donc ton image ne s'affichera pas et le champ hidden ne marchera pas ... Il faut que tu rajoute, avant le formulaire ou alors juste avant l'affichage de ton image (peu importe) la création du nombre aléatoire + la requette BDD et le traitement de la réponse.
:)

Eléphanteau du PHP | 36 Messages

25 nov. 2011, 20:14

Hein ?? :mrgreen:

Mais j'ai pas compris, je croyais que je devais seulement mettre le formulaire (avec les différentes zones de saisies) et dans un autre fichier le code PHP :!:

Donc ça donne ça :?:
<?php if(!defined('access') or !access) die('This file cannot be directly accessed.'); ?>
<?php include_theme_header(); ?>

$sql = 'SELECT adresse FROM captcha WHERE id ='.$nombre_aleat;
$req = $connexion->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
$data = $req->fetch();
$adresse = $data->adresse;

<?php

//création d'un nombre aléatoire entre 1 et 8

$nb_min = 1;
$nb_max = 8;
$nombre = mt_rand($nb_min,$nb_max);

?>

<div id="content" class="pages page_contact">
<h1>Contactez nous</h1>
<hr /> <br />
<div class="content" style="font-size: 1em"> Bienvenue sur la page de contact, merci de remplir les champs ci-dessous afin de procéder à l'envoi de votre message. </div>
        
<form method="post" action="traitement.php">
<div><label for="name">Nom:</label> <input type="text" name="name" id="name" /></div>
<div><label for="email">E-mail:</label> <input type="text" name="email" id="email" /></div>
<div><label for="message">Message:</label> <textarea name="message" id="message" ></textarea></div>

<label for="captcha">Recopiez les caractères de l'image:</label>  <img alt="captcha" src="<?php echo $adresse; ?>" /> <input type="text" name="captcha" id="captcha" /> <input type="hidden" name="id" value="<?php echo $nombre_aleat; ?>" />

<div><input type="submit" value="Envoyer" class="send-form"/></div>

</form>

</div> </div>

<?php include_theme_footer(); ?>
Franchement désolé si je m’emmêle dans les différents bout de codes mais c'est pour ça que je voulais faire au fur et à mesure car après je sais plus trop ou va ou :P

Eléphant du PHP | 188 Messages

25 nov. 2011, 21:48

T'affole pas, c'est parfait ce que tu as mit :wink:
Juste, rajoute
$req->closeCursor();
Après le
$adresse = $data->adresse;
C'est pas important dans ton cas, mais si jamais tu modifie ta page après et y ajoute des requettes, sans cette ligne tu auras des problèmes, mieux vaux prévenir que guérir ! :p

----------------------------

On va donc passer à la deuxième partie : la reception du formulaire et le traitement.
On va d'abord repartir depuis le code que tu avais mit au début, la partie reception formulaire :
if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
                                 $result  = true;
                                 $name    = $_POST['name'];
                                 $email   = trim($_POST['email']);
                                 $message = $_POST['message'];
                                 
                                 $to = '[email protected]';
                                 $subject = 'Formulaire de contact';
                         
                                 $mailbody .= "Name: ".$name."\n";
                                 $mailbody .= "E-mail: ".$email."\n\n";
                                 
                                 $mailbody .= "Message: ".$message."\n\n";
                                                 
                                 $mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
                                 $mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
                                 
                                 $use_phpmailer = true; // true: uses php mailer | false: uses the default mail() function
                                 
                                 // We are going to check the fields...
                                 if(check_email_address($email) and check_value($name) and check_value($message)) {
                                         // Waht are we using?
                                         if($use_smtp) {
                                                 // Hail PHPMailer!
                                                 // require_once __CHV_PATH_CLASSES__ . 'class.phpmailer.php'; //PHP MAILER IS NOT INCLUDED BY DEFAULT. GET IT ON http://sourceforge.net/projects/phpmailer/
                                                 $mail = new phpmailer();
                                                 $mail->Mailer = "smtp";
                                                 $mail->Host = "smtp.gmail.com"; // SMTP host
                                                 $mail->SMTPAuth = true;
                                                 $mail->Username = "[email protected]";
                                                 $mail->Password = "mdp";
                                                 $mail->Timeout = 30;
                                                 $mail->From = $email; 
                                                 $mail->FromName = $name;
                                                 $mail->AddAddress($to);
                                                 $mail->Subject = $subject;
                                                 $mail->Body = $mailbody;
                                                 $success = $mail->Send();
                                         } else {
                                                 $success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
                                         }
                                         // Succes true...
                                         if($success) {
                                                 $output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
                                                 $contact_class = 'contact-ok';
                                         } else { // Oh no... errors.
                                                 $output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
                                                 $contact_class = 'contact-error';
                                         }
                                 } else { // Invalid values...
                                         $output = 'Merci de remplir les champs du formulaire correctement.';
                                         $contact_class = 'contact-error';
                                 }
                 }
A ça (je te dirais après où on devra placer chaque chose) on va ajouter :
- récuperation de l'id du captcha et de ce qu'a entrée l'utilisateur
- recuperation (BDD) de la solution du captcha
- comparaison des deux
- si c'est bon : on envoie le mail,
- sinon : retour en indiquant l'erreur

Jusque là sa va ?

Eléphanteau du PHP | 36 Messages

26 nov. 2011, 13:26

Voilà, le bout de code a été ajouté.

Donc déjà je dois placer le bout de code suivant dans le fichier traitement.php :?:
<?php
$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
try
{
        $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
 
catch(Exception $e)
{
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}
?>

Eléphant du PHP | 188 Messages

26 nov. 2011, 14:56

Oui voila,
après ça, on va récupérer les infos sur le captcha (il nous fait l'ID plus la réponse) :
<?php
if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript:history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript:history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user

Après ça, il va falloir faire une requette BDD du meme type que la première, mais cette fois si pour récupérer la solution du captcha et non l'adresse, je te laisse le faire :wink: (indice : dans la requette, on ne SELECT pas "adresse" mais "solution" ...)

Eléphanteau du PHP | 36 Messages

28 nov. 2011, 22:31

Donc voilà, jusque là le code donne :
<?php
$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
try
{
        $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
 
catch(Exception $e)
{
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}
?>

<?php				
        	if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '[email protected]';
$subject = 'Formulaire de contact';
			
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
				
$mailbody .= "Message: ".$message."\n\n";
						
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
				
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
				
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
						// Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "[email protected]";
$mail->Password = "mdp";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
					
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
				}
        	}
?>

<?php
if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
?>		
En ce qui concerne le message d'erreur, j'aimerais qu'il soit mis dans la même forme que les autres, voir là =>
Autrement dit, il faut que j'utilise la classe contact-error pour afficher le message d'erreur pour le captcha :!:

Pour la requette, j'ai simplement remplacé les adresse par solution. Vais me faire taper je sens :mrgreen:
$sql = 'SELECT solution FROM captcha WHERE id ='.$nombre_aleat;
$req = $connexion->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
$data = $req->fetch();
$solution= $data->solution;
Modifié en dernier par ZePhYmA le 19 déc. 2011, 15:49, modifié 1 fois.

Eléphant du PHP | 188 Messages

28 nov. 2011, 23:17

Pour les messages d'erreur, je vais étudier ta class je te dirais quoi ;)

Pour le premier code, c'est niquel, mais il faut que le code de verification de captcha (ce que tu as déjà rajouté + se qu'on va bossé) sois avant l'envoi de l'e-mail, sinon l'e-mail s'enverra meme si le captcha est faux !
Pour la requette SQL, c'est bon sauf le "$nombre_altea", il n'est pas crée sur cette page, rapelle toi on le récupère via le champ hidden, et on le met dans la variable $id_captcha. Donc remplace (a la première ligne) $nombre_aleat par $id_captcha.
et aussi, rajoute
$req->closeCursor();
après la requette SQL, je sais je suis lourd avec ça mais c'est important :p

Eléphanteau du PHP | 36 Messages

30 nov. 2011, 18:23

Cela donne donc ça :
<?php
$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
try
{
        $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
 
catch(Exception $e)
{
        echo 'Erreur : '.$e->getMessage().'<br />';
        echo 'N° : '.$e->getCode();
}
?>

$sql = 'SELECT solution FROM captcha WHERE id ='.$id_captcha;
$req = $connexion->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
$data = $req->fetch();
$solution= $data->solution;
$req->closeCursor();

<?php
if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
?>		

<?php				
        	if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '[email protected]';
$subject = 'Formulaire de contact';
			
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
				
$mailbody .= "Message: ".$message."\n\n";
						
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
				
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
				
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
						// Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "@gmail.com";
$mail->Password = "";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
					
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
				}
        	}
?>
Pour le message d'erreur de captcha, je pourrais toujours l'entourer des bonnes balises html pour faire comme les autres erreurs.

Eléphant du PHP | 188 Messages

30 nov. 2011, 21:44

C'est presque bon, sauf qu'il faut que tu récupère les valeurs pour le captcha avant de faire la requette BDD, sinon elle ne va pas fonctionner ($id_captcha utilisé dans la requette est crée après, si tu teste ce code tu auras une erreur "indefined index id_captcha" ...)

Donc le code correct est :
<?php

// 1 : connexion BDD

$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
 try
{
         $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
  
 catch(Exception $e)
{
         echo 'Erreur : '.$e->getMessage().'<br />';
         echo 'N° : '.$e->getCode();
}


// 2 : recuperation de ce qu'a dit l'utilisateur sur le captcha

if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
 


//3 : recuperation de la vrai solution du captcha

 $sql = 'SELECT solution FROM captcha WHERE id ='.$id_captcha;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $solution= $data->solution;
 $req->closeCursor();

           
// 5 : envoi de l'e-mail
                         
                 if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '[email protected]';
$subject = 'Formulaire de contact';
                         
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
                                 
$mailbody .= "Message: ".$message."\n\n";
                                                 
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
                                 
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
                                 
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
                                                 // Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "@gmail.com";
$mail->Password = "";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
                                         
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
                                 }
                 }
?>
Et il nous manque donc l'étape 4 qui est très simple et ... on aura fini !
Alors : 4 : comparaison reponse de l'user / solution de la BDD

une condition banale, je le fais moi-même pour ne pas perdre de temps, je suis sur que tu aurais su le faire tout seul ;)
<?php
//rappel  : $reponse_captcha contient la reponse de l'user
// et $solution contient la vrai solution (de la BDD)
if ($reponse_captcha != $solution)
{
die('Erreur dans la recopie du captcha ! <a href="javascript:history.go(-1)" alt="retour"> Retour. </a>');
}
?>

Et ce code on le place entre 3 et 5 (et oui), donc pour la page traitement.php, on a donc le code complet :
<?php

// 1 : connexion BDD

$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
 try
{
         $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
  
 catch(Exception $e)
{
         echo 'Erreur : '.$e->getMessage().'<br />';
         echo 'N° : '.$e->getCode();
}


// 2 : recuperation de ce qu'a dit l'utilisateur sur le captcha

if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
 


//3 : recuperation de la vrai solution du captcha

 $sql = 'SELECT solution FROM captcha WHERE id ='.$id_captcha;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $solution= $data->solution;
 $req->closeCursor();

        
//4 : comparaison solution/reponse user

//rappel  : $reponse_captcha contient la reponse de l'user
// et $solution contient la vrai solution (de la BDD)
if ($reponse_captcha != $solution)
{
die('Erreur dans la recopie du captcha ! <a href="javascript:history.go(-1)" alt="retour"> Retour. </a>');
}

   
// 5 : envoi de l'e-mail
                         
                 if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '[email protected]';
$subject = 'Formulaire de contact';
                         
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
                                 
$mailbody .= "Message: ".$message."\n\n";
                                                 
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
                                 
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
                                 
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
                                                 // Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "@gmail.com";
$mail->Password = "";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
                                         
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
                                 }
                 }
?>

Pour les essages d'erreur relatifs au captcha, tout passe par les "die(' ... ');", donc si tu veux modifer tu modifie le texte qu'il y a dedans :).
Voili voulou ! test et dit moi s'il y a des erreurs :)

Eléphant du PHP | 188 Messages

30 nov. 2011, 22:24

C'est presque bon, sauf qu'il faut que tu récupère les valeurs pour le captcha avant de faire la requette BDD, sinon elle ne va pas fonctionner ($id_captcha utilisé dans la requette est crée après, si tu teste ce code tu auras une erreur "indefined index id_captcha" ...)

Donc le code correct est :
<?php

// 1 : connexion BDD

$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
 try
{
         $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
  
 catch(Exception $e)
{
         echo 'Erreur : '.$e->getMessage().'<br />';
         echo 'N° : '.$e->getCode();
}


// 2 : recuperation de ce qu'a dit l'utilisateur sur le captcha

if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
 


//3 : recuperation de la vrai solution du captcha

 $sql = 'SELECT solution FROM captcha WHERE id ='.$id_captcha;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $solution= $data->solution;
 $req->closeCursor();

           
// 5 : envoi de l'e-mail
                         
                 if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '[email protected]';
$subject = 'Formulaire de contact';
                         
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
                                 
$mailbody .= "Message: ".$message."\n\n";
                                                 
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
                                 
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
                                 
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
                                                 // Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "@gmail.com";
$mail->Password = "";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
                                         
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
                                 }
                 }
?>
Et il nous manque donc l'étape 4 qui est très simple et ... on aura fini !
Alors : 4 : comparaison reponse de l'user / solution de la BDD

une condition banale, je le fais moi-même pour ne pas perdre de temps, je suis sur que tu aurais su le faire tout seul ;)
<?php
//rappel  : $reponse_captcha contient la reponse de l'user
// et $solution contient la vrai solution (de la BDD)
if ($reponse_captcha != $solution)
{
die('Erreur dans la recopie du captcha ! <a href="javascript:history.go(-1)" alt="retour"> Retour. </a>');
}
?>

Et ce code on le place entre 3 et 5 (et oui), donc pour la page traitement.php, on a donc le code complet :
<?php

// 1 : connexion BDD

$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='sdz'; // le nom de votre base de données
$PARAM_utilisateur='root'; // nom d'utilisateur pour se connecter
$PARAM_mot_passe=''; // mot de passe de l'utilisateur pour se connecter
$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
 try
{
         $connexion = new PDO('mysql:host='.$PARAM_hote.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
}
  
 catch(Exception $e)
{
         echo 'Erreur : '.$e->getMessage().'<br />';
         echo 'N° : '.$e->getCode();
}


// 2 : recuperation de ce qu'a dit l'utilisateur sur le captcha

if ((isset($_POST['id'])) AND (!empty($_POST['id'])))
{
$id_captcha = $_POST['id'];
if ((isset($_POST['captcha'])) AND (!empty($_POST['captcha'])))
{
$reponse_captcha = $_POST['captcha'];
}
else  //si l'utilisateur na pas répondu au captcha
{
die('Veuillez remplir le captcha. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
}
else  //si on a pas reçu l'id via hidden
{
die('Erreur lors du chargement de la page. <a href="javascript&#058;history.go(-1)" alt="retour" /> Retour. </a>');
}
//si on arrive ici c'est qu'on possède l'id du captcha et la solution entrée par l'user
 


//3 : recuperation de la vrai solution du captcha

 $sql = 'SELECT solution FROM captcha WHERE id ='.$id_captcha;
 $req = $connexion->query($sql);
 $req->setFetchMode(PDO::FETCH_OBJ);
 $data = $req->fetch();
 $solution= $data->solution;
 $req->closeCursor();

        
//4 : comparaison solution/reponse user

//rappel  : $reponse_captcha contient la reponse de l'user
// et $solution contient la vrai solution (de la BDD)
if ($reponse_captcha != $solution)
{
die('Erreur dans la recopie du captcha ! <a href="javascript:history.go(-1)" alt="retour"> Retour. </a>');
}

   
// 5 : envoi de l'e-mail
                         
                 if ($_POST['name'] and $_POST['email'] and $_POST['message']) {
$result  = true;
$name    = $_POST['name'];
$email   = trim($_POST['email']);
$message = $_POST['message'];

$to = '[email protected]';
$subject = 'Formulaire de contact';
                         
$mailbody .= "Name: ".$name."\n";
$mailbody .= "E-mail: ".$email."\n\n";
                                 
$mailbody .= "Message: ".$message."\n\n";
                                                 
$mailbody .= "IP: ".getenv("REMOTE_ADDR")."\n";
$mailbody .= "Browser: ".getenv("HTTP_USER_AGENT")."\n\n";
                                 
$use_phpmailer = true; // Activer/Désactiver l'utilisation de la fonction ()mail
                                 
// We are going to check the fields...
if(check_email_address($email) and check_value($name) and check_value($message)) {

// Paramètres SMTP
if($use_smtp) {
                                                 // Hail PHPMailer!
$mail = new phpmailer();
$mail->Mailer = "smtp";
$mail->Host = "smtp.gmail.com"; // SMTP host
$mail->SMTPAuth = true;
$mail->Username = "@gmail.com";
$mail->Password = "";
$mail->Timeout = 30;
$mail->From = $email; 
$mail->FromName = $name;
$mail->AddAddress($to);
$mail->Subject = $subject;
$mail->Body = $mailbody;
$success = $mail->Send();
} else {
$success = mail($to, $subject, $mailbody); // $to, $subject, $mailbody
}
                                         
// Succès / Erreur

if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
} else { // Ho non ! Erreur
$output = 'Il y a eu une erreur à l\'envoie de votre message, réessayez plus-tard.';
$contact_class = 'contact-error';
}
} else { // Valeurs invalides !
$output = 'Merci de remplir les champs du formulaire correctement.';
$contact_class = 'contact-error';
                                 }
                 }
?>

Pour les essages d'erreur relatifs au captcha, tout passe par les "die(' ... ');", donc si tu veux modifer tu modifie le texte qu'il y a dedans :).
Voili voulou ! test et dit moi s'il y a des erreurs :)

Eléphant du PHP | 188 Messages

30 nov. 2011, 22:35

Désolé pour le doublon, mon réseau a planté :?