Ajouter juste un captcha

Eléphant du PHP | 188 Messages

09 déc. 2011, 17:43

Non l'utilisateur ne reste pas sur traitement.php, mais quand on aura réglé les problèmes on fera une redirection automatique.
L'erreur MySQL tu l'a corrigée avec les bonnes infos ?
L'erreur "erreur dans le chargement de la page ..." vient du fait que la page ne reçoit pas les infos par le POST et c'est normal vu que tu l'appelle sans passer par contact.php
Le problème reside dans contact.php, traitement.php fonctionne normalement.

ZePhYmA1
Invité n'ayant pas de compte PHPfrance

10 déc. 2011, 23:54

Aucune idée ? Allez, on est arrivé jusque là ce serait dommage d'abandonner. On pourrait pas tenter de tout mettre dans le même fichier si il y a aucune autre piste ?

Eléphanteau du PHP | 36 Messages

11 déc. 2011, 08:27

Mince je n'avait pas vu ta réponse :!:

Oui j'ai corrigé les informations de connexion et maintenant ça devrait être bon.

Donc pour contact, si le fichier ne trouve pas traitement ça pourrait être la cause de ce bug ? Par ce que en gros, rien ne s'affiche à part l'header. Juste pour voir j'ai essayé de déplacer le nombre aléatoire et la requête en bas du fichier (après le formulaire xHTML) et la page s'affiche mais pas le captcha.

J'ai pris soin de le placer juste avant le footer et bien évidemment il n’apparaît pas. Quelque chose dans le code fais que tout ce qui se trouve après ce code PHP ne s'affiche pas.

Sinon j'ai un doute, car je viens de voir que mon fichier php.ini n'est modifiable que par l'hébergeur, mais dans phpinfo j'ai ceci : [censuré] Tu peut me dire si d'après toi il est activé (Je vois "enabled" moi) :?:
Modifié en dernier par ZePhYmA le 14 déc. 2011, 21:34, modifié 1 fois.

Eléphant du PHP | 188 Messages

11 déc. 2011, 17:50

Oui ton PDO dans le .ini est bon ..
Bon vu les tests que tu as fait, tout porte à croire que le problème vient du code de captcha qu'on a rajouté depuis le début du topic. Je vais tester ta page en local et je te dirais quoi dés que possible.

Eléphanteau du PHP | 36 Messages

13 déc. 2011, 21:04

Bon écoutez, ça devient assez urgent car hier j'ai reçu un message de spam :!:

Donc peu importe le système, du moment qu'il est propre et fiable j'aimerais bien avoir de l'aide car visiblement cette méthode bien que très bien, ne semble pas fonctionner avec mon site. Sûrement une erreur de ma part mais bon on va pas ratisser chaque lignes, d'autant plus que les codes/placements sont corrects.

Une idée ? Il s'agit juste de rajouter un captcha à un formulaire c'est pas la mort quand même !!!! :lol:

Eléphant du PHP | 188 Messages

13 déc. 2011, 22:03

"ce n'est pas la mort" et c'est pour ça que l'erreur est surement toute bete. Je suis encore entrein de tester ton code et de l'examiner sous tous les angles, sans nouvelles mais je persiste. En attendant, si qqun d'autre à une idée c'est bienvenue, ou sinon cherche des tutos/codes tout faits sur internet.

Eléphanteau du PHP | 36 Messages

13 déc. 2011, 22:16

Mais de ton côté en faisant les mêmes manipulations sur ton formulaire sa fonctionne ?

Eléphant du PHP | 188 Messages

13 déc. 2011, 22:32

Bon j'ai testé ton projet chez moi, la multiplication de fonction propre a ton CMS créent de nombreux problèmes, et je pense que notre problème ici vient de là (et tu aurais ue surement beaucoup d'autres problèmes dés que tu voudrais modifier ton site) ... Je déconseille toujours de modifier un CMS quand on ne maitrise pas le language ...
Alors j'ai re-adapté ton code, en remplacant quelques fonctions par leur résultat qui, je crois, ne risque pas de changer (ex : une fonction affiché la langue de ton site, j'ai remplacé par "fr", de toute façon si tu veux changer de langue tu devras réecrire ton HTML donc sa revient au même)

Voici les 4 pages :

contact.php (page avec formulaire pour envoyer un mail) :
<?php include('header.php'); 
$PARAM_hote='localhost';      // le chemin vers le serveur
	$PARAM_port='3306';
	$PARAM_nom_bd='captcha';          // 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

		try
			{
			$connexion = new PDO('mysql:host='.$PARAM_hote.';port='.$PARAM_port.';dbname='.$PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
			$connexion -> query("SET NAMES 'utf8'");
			/* BDD connectee */
			}
 
		catch(Exception $e)
			{
			/* erreur connection */
			echo 'Une erreur est survenue !';
			echo 'Erreur : '.$e->getMessage().'<br />';
			echo 'N° : '.$e->getCode();
			die();
			}

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

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

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

 <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('footer.php'); ?>
traitement.php (page de traitement et envoi du mail) :
<?php include('header.php'); 

// 1 : connexion BDD

$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='captcha'; // 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&#058;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';
                                  }
                  }

include('footer.php'); 
?>
header.php (pour ton thème) :
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 </head>

 <body>

 <div id="wrap">
     <div id="top"><a href="contact.php"><img src="logo.png" alt="Heberg-pics" /></a></div>
footer.php (ton thème aussi) :
 </div><!-- wrap -->

 <div id="foot">
         <div id="in-foot">
         <div id="foot-content">
                 <ul>
 <li><a href="apropos">A propos</a></li><li><a href="cgu">Conditions</a></li><li><a href="dons">Dons</a></li><li><a href="news">Actualité</a></li><li><a href="partenaires">Partenaires</a></li><li><a href="contact">Contact</a></li>
                 
             </ul>
                         <p><?php
// Add number of uploaded images. smed79
// $files to liste *.* in "./images" ex: (.jpg, .png, etc...)
$files = glob("images/*.*");
// Variable $compteur counting files lister ($files) in "./images"
$compteur = count($files);
echo "Nous avons <font color=#FF0000>$compteur</font>";
if ($compteur > 1) { echo " images hébergées jusqu'à maintenant"; }
else { echo " images hébergées jusqu'à maintenant"; }
?></p>
         </div>
                 <a href="http://www.heberg-pics.com" target="_blank" id="powered">&copy; 2011 Heberg-pics - Tous droits réservés</a>
     </div>
 </div>
 </body>

 </html>
Voila essaye ça (fait attention de bien nommé les fichiers comme je l'ai fait au dessus de chaque code) et dit moi quoi.

Eléphanteau du PHP | 36 Messages

13 déc. 2011, 23:10

Bon alors j'ai essayé.

J'ai pris les fichiers header/footer de ton message puis mis dans le même dossier que ma page. J'ai remplis correctement les informations de connexions/SMTP.

Quand on ne remplis pas correctement le captcha, cela nous affiche le message d'erreur sur traitement.php mais le footer n’apparaît pas.
Quand on remplis correctement le captcha sans rentrer les autres informations comme l'email, nom ou message cela donne une page ou le footer/header son présent mais rien entre eux. En remplissant le formulaire complètement même erreur.

Et on vois : SELECT adresse FROM captcha WHERE id =
Modifié en dernier par ZePhYmA le 18 déc. 2011, 20:26, modifié 1 fois.

Eléphant du PHP | 188 Messages

14 déc. 2011, 14:34

Oui j'ai laissé une ligne de debogage, retire :
echo $sql;
dans contact.php, après la création de la chaine $sql et juste avant la requette BDD (vers le début)

Pour traitement.php :

quand les infos sont ok rien ne s'affiche ? Normal, on a oublié de faire un message de succés #-o Donc à la fin du code, juste après l'envoi de l'e-mail, rajoute un message de succés, par exemble :
echo 'E-mail envoyé avec succés, Merci ! <a href="http://www.heberg-pics.com/" alt="acceuil"> Retour à l'acceuil </a>';
Ensuite, quand il y a une faute dans le formulaire, l'utilisateur en est avertit via un "die();" qui permet d'arreter le chargement de la page : donc d'empecher l'envoi de mail s'il y a une erreur, et aussi d'empecher l'affichage du footer. Donc si tu vois que l'on voi quand meme le footer, rajoute le :
include('footer.php');
Juste avant chaque die();

Eléphanteau du PHP | 36 Messages

14 déc. 2011, 18:09

Alors.
  • Je n'ai pas compris cette histoire de ()die !
  • Le message d'erreur du captcha est comme ceci sans la page et le footer.

Eléphant du PHP | 188 Messages

15 déc. 2011, 14:23

Pour afficher un message de succés (c'est pour ça que traitement.php est vide quand tu remplit tout bien) :
rajoute le texte que tu veux après l'envoi de mail dans traitement.php

Je te remet tout traitement.php avec un message de succés à la fin, que tu peux adapter à ta sauce :
<?php include('header.php'); 

// 1 : connexion BDD

$PARAM_hote='localhost'; // le chemin vers le serveur
$PARAM_port='3306';
$PARAM_nom_bd='captcha'; // 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&#058;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';
                                   }
                   }

echo 'E-mail envoyé avec succés, Merci ! <a href="http://www.heberg-pics.com/" alt="acceuil"> Retour à l'acceuil </a>';

pour afficher le footer meme quand il y a une erreur :
cherche dans traitement.php toutes les fois où on utilise la fonction " die ".
Et justa avant ces lignes, tu met :
include('footer.php');

Eléphanteau du PHP | 36 Messages

15 déc. 2011, 21:39

Donc on a deux messages de succès, un fais par mon cms :
if($success) {
$output = 'Message envoyé, nous traiterons votre demande dans les plus bref délais.';
$contact_class = 'contact-ok';
Un fais par toi :P

Sinon ça donne ça :(

Eléphant du PHP | 188 Messages

15 déc. 2011, 22:35

Pour le premier problème :
Oui c'est ce que je me suis dit, mais le message de ton CMS ne s'affiche pas donc je voulais tenter ça ... tu obtient quoi quand tu remplit tout correctement ?

Pour le deuxième :
eh oui faute d'inattention de me part, au lieu de mettre le include avant les die, il faut mettre :
echo 'Veuillez remplir le captcha<br /><br />';
include('footer.php');
die();
En remplacant le texte dans le echo par le message d'erreur qui été dans le die( ).

Eléphanteau du PHP | 36 Messages

15 déc. 2011, 23:56

Corrigé pour les die(); !

J'avais pensé pour les messages d'erreurs, on aurait pas pu mettre en forme comme ceux par défaut du CMS ?
Et en remplissant tout correctement j'obtiens ton message de succès. Mais bon, j'aurais préféré garder ceux du CMS qui font moins brute :cry:

Tu penses que c'est possible :?: Actuellement, la mise en page est celle-ci :(