Form et traitement : passage de variables

Résolu
Bonjour,



J'essaie de compléter un script avec un captcha "à ma façon".

Le form affiche donc une question (Produit de 2 nb aléatoires générés par un petit bout de php ainsi que $produit)
J'ai placé un input pour récupérer la réponse (name= "captcha1")
mais je ne parviens pas à comparer cette réponse à $produit dans la partie traitement .
Voici l'état des travaux (enfin, les parties concernées) Merci pour un coup de main !


 if ($_SERVER['REQUEST_METHOD']=='POST') {
     
      // (1) Code PHP pour traiter l'envoi de l'email
     
      // Récupération des variables et sécurisation des données
      $nom     = htmlentities($_POST['nom']); // htmlentities() convertit des caractères "spéciaux" en équivalent HTML
      $email   = htmlentities($_POST['email']);
      $message = htmlentities($_POST['message']);
      $captcha1= $_POST['captcha1'];
..............................................................
 if (!isset($_POST['captcha1'])) {
        $nombreErreur++;
        $erreur6 = '<p>Il y a un problème avec la variable "captcha1".</p>';
      } else {
        if ($_POST['captcha1']!= $produit) {
          // Vérifier que le résultat de l'équation est égal à 4
          $nombreErreur++;
          $erreur7 = '<p>Désolé, le captcha1 anti-spam est erroné.</p>';
        }
      }
.............................................................

 <form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
          <p>Votre nom et prénom: <input type="text" name="nom" size="30" /></p>
          <p>Votre email: <span style="color:#ff0000;">*</span>: <input type="text" name="email" size="30" /></p>
          <p>Message <span style="color:#ff0000;">*</span>:</p>
          <textarea name="message" cols="60" rows="10"></textarea> <br>
    <!-- essai de captcha variable -->
    <? $a=rand(2,9);
    $b=rand(2,9);
    $produit=$a*$b;
    echo"Combien font $a x $b ?";
    /*echo "$produit"; */
    ?>
    <input type="text" name="captcha1" />
    <!-- fin essai captcha-->
          <p><input type="submit" name="submit" value="Envoyer" /></p>
        </form>



EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici :ICI

Merci d'y penser dans tes prochains messages.

7 réponses

  1. Modérateur
    Bonjour,

    Déjà.... On récupère "PROPREMENT" les variables AVANT de les utiliser
    Ensuite.... $produit n'existe pas lorsque tu "submit" ton formulaire... il faut donc le passer aussi lors du submit
    (dans un champ hidden par exemple)
    <?php
    
     if ($_SERVER['REQUEST_METHOD']=='POST') {
         
          // (1) Code PHP pour traiter l'envoi de l'email
         
          // Récupération des variables et sécurisation des données
          $nom     =  isset($_POST['nom']) ? htmlentities($_POST['nom']) : ''; // htmlentities() convertit des caractères "spéciaux" en équivalent HTML
          $email   =  isset($_POST['email']) ? htmlentities($_POST['email']) : '';
          $message =  isset($_POST['message']) ? htmlentities($_POST['message']) : '';
          $captcha1= !empty($_POST['captcha1']) ? $_POST['captcha1'] : NULL;
       $produit = !empty($_POST['produit']) ? $_POST['produit'] : NULL;
    
     if (!$captcha1) {
        $nombreErreur++;
        $erreur6 = '<p>Il y a un problème avec la variable "captcha1".</p>';
     }else{
        if ($captcha1!= $produit) {
         // Vérifier que le résultat de l'équation est égal à 4
         $nombreErreur++;
         $erreur7 = '<p>Désolé, le captcha1 anti-spam est erroné.</p>';
        }
     }
    ?>
    
     <form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
      <p>Votre nom et prénom: <input type="text" name="nom" size="30" /></p>
      <p>Votre email: <span style="color:#ff0000;">*</span>: <input type="text" name="email" size="30" /></p>
      <p>Message <span style="color:#ff0000;">*</span>:</p>
      <textarea name="message" cols="60" rows="10"></textarea> <br>
      <!-- essai de captcha variable -->
      <?php 
        $a=rand(2,9);
        $b=rand(2,9);
        $produit=$a*$b;
        echo"Combien font $a x $b ?";
        /*echo "$produit"; */
      ?>
      <input type='hidden' value ="<?php echo $produit;?>" name='produit'>
      <input type="text" name="captcha1" />
      <!-- fin essai captcha-->
      <p><input type="submit" name="submit" value="Envoyer" /></p>
     </form>
    
    


    Cordialement, 
    Jordane                                                                 
    0
    1. Merci. J'ai essayé en local et ça semblait marcher... Le fichier envoyé sur site, le form n'affiche plus la question "combien font $a x $b ?"
      j'ai essayé de modifier le form mais pas moyen de retrouver l'affichage de la question alors qu'elle s'affiche en local (wamp):


      <form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
      <p>Votre nom et prénom: <input type="text" name="nom" size="30" /></p>
      <p>Votre email: <span style="color:#ff0000;">*</span>: <input type="text" name="email" size="30" /></p>
      <p>Message <span style="color:#ff0000;">*</span>:</p>
      <textarea name="message" cols="60" rows="10"></textarea><br>

      <!-- essai de captcha variable -->
      <? $a=rand(2,9);
      $b=rand(2,9);
      $produit=$a*$b;
      /* echo "Combien font $a x $b ?"; */
      /*echo "$produit"; */
      ?>
      <p>Combien font <?php echo "$a" ?> x <?php echo "$b" ?> ? </p>
      <input type='hidden' value ="<?php echo $produit;?>" name='produit'>
      <input type="text" name="captcha1" />
      <!-- fin essai captcha-->
      <p><input type="submit" name="submit" value="Envoyer" /></p>
      </form>

      0
      1. Modérateur
        Tu as vu que certaines de tes lignes sont en "commentaire" ??
         /* echo "Combien font $a x $b ?"; */
        		  /*echo "$produit"; */
        

        Normal que ça ne s'affiche pas non ?
        0
      2. @jordane45Bonjour et merci encore pour ton aide.
        Effectivement, la ligne en question (dans le bout de php) est en com car elle n'affichait rien et j'ai essayé de la remplacer par

        <p>Combien font <?php echo "$a" ?> x <?php echo "$b" ?> ? </p>


        mais cela ne va pas mieux.
        Je ne comprends pas qu'elle soit interprétée en local (aperçu de la page depuis Dreamweaver avec wamp) et oubiée lorsque je passe par le serveur distant : http://autourdalos.fr/Bobyvonne2015/formcomplet2.php
        Sur ce dernier, j'ai vérifié le code: le bout de php déterminant $a,$b, et posant la question est bien visible.
        0
      3. Modérateur
        @jarailetQuel est exactement le code présent sur ton serveur ?
        0
    2. C'est le même code sur mon PC et sur le serveur de SFR.
      J'ai essayé en local puis distant :


      <!-- essai de captcha variable -->
      <? $a=rand(2,9);
      $b=rand(2,9);
      $produit=$a*$b;
      ?>
      <p>Combien font <?php echo "$a" ?> x <?php echo "$b" ?> ? </p>


      puis, encore en local et distant :


      <!-- essai de captcha variable -->
      <? $a=rand(2,9);
      $b=rand(2,9);
      $produit=$a*$b;
      echo "Combien font $a x $b ?";
      ?>


      Dans les deux cas, seul l'essai en local affiche la question.

      Je ne sais pas si le problème peut venir d'une autre partie du fichier mais je peux évidemment tout envoyer si tu le juges utile.
      0
      1. Modérateur
        Tu peux ajouter la ligne suivante :
         error_reporting(E_ALL);
        

        au début de tes pages php ?

        Cela permettra d'afficher les éventuelles erreurs de code php.
        0
    3. Le fichier est transféré ici pour essai :

      http://autourdalos.fr/Essais/formcomplet2.php

      J'ai ajouté au début la ligne que tu proposes : pas d'erreur ?

      Finalement, j'envoie toute la page (smiley "confus" !)


      <!DOCTYPE html>
      <html>
      <head>
      <title>Titre de la page</title>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
      </head>
      <body>
      <h1>Contacter le webmaster</h1>
      <!-- Ceci est un commentaire HTML. Le code PHP devra remplacé cette ligne -->
      <?php
      error_reporting(E_ALL);
      // S'il y des données de postées
      if ($_SERVER['REQUEST_METHOD']=='POST') {

      // (1) Code PHP pour traiter l'envoi de l'email

      // Récupération des variables et sécurisation des données
      $nom = isset($_POST['nom']) ? htmlentities($_POST['nom']) : ''; // htmlentities() convertit des caractères "spéciaux" en équivalent HTML
      $email = isset($_POST['email']) ? htmlentities($_POST['email']) : '';
      $message = isset($_POST['message']) ? htmlentities($_POST['message']) : '';
      $captcha1= !empty($_POST['captcha1']) ? $_POST['captcha1'] : NULL;
      $produit = !empty($_POST['produit']) ? $_POST['produit'] : NULL;
      // Variables concernant l'email

      $destinataire = 'jarailet.sites@club-internet.fr'; // Adresse email du webmaster (à personnaliser)
      $sujet = 'Titre du message'; // Titre de l'email
      $contenu = '<html><head><title>Titre du message</title></head><body>';
      $contenu .= '<p>Bonjour, vous avez reçu un message à partir de votre site web.</p>';
      $contenu .= '<p><strong>Nom</strong>: '.$nom.'</p>';
      $contenu .= '<p><strong>Email</strong>: '.$email.'</p>';
      $contenu .= '<p><strong>Message</strong>: '.$message.'</p>';
      $contenu .= '</body></html>'; // Contenu du message de l'email (en XHTML)

      // Pour envoyer un email HTML, l'en-tête Content-type doit être défini
      $headers = 'MIME-Version: 1.0'."\r\n";
      $headers .= 'Content-type: text/html; charset=iso-8859-1'."\r\n";

      // Envoyer l'email
      mail($destinataire, $sujet, $contenu, $headers); // Fonction principale qui envoi l'email
      echo '<h2>Message envoyé!</h2>'; // Afficher un message pour indiquer que le message a été envoyé
      // (2) Fin du code pour traiter l'envoi de l'email
      $nombreErreur = 0; // Variable qui compte le nombre d'erreur
      // Définit toutes les erreurs possibles
      if (!isset($_POST['email'])) { // Si la variable "email" du formulaire n'existe pas (il y a un problème)
      $nombreErreur++; // On incrémente la variable qui compte les erreurs
      $erreur1 = '<p>Il y a un problème avec la variable "email".</p>';
      } else { // Sinon, cela signifie que la variable existe (c'est normal)
      if (empty($_POST['email'])) { // Si la variable est vide
      $nombreErreur++; // On incrémente la variable qui compte les erreurs
      $erreur2 = '<p>Vous avez oublié de donner votre email.</p>';
      } else {
      if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
      $nombreErreur++; // On incrémente la variable qui compte les erreurs
      $erreur3 = '<p>Cet email ne ressemble pas un email.</p>';
      }
      }
      }

      if (!isset($_POST['message'])) {
      $nombreErreur++;
      $erreur4 = '<p>Il y a un problème avec la variable "message".</p>';
      } else {
      if (empty($_POST['message'])) {
      $nombreErreur++;
      $erreur5 = '<p>Vous avez oublié de donner un message.</p>';
      }
      } // (3) Ici, il sera possible d'ajouter plus tard un code pour vérifier un captcha anti-spam.
      if (!$captcha1) {
      $nombreErreur++;
      $erreur6 = '<p>Il y a un problème avec la variable "captcha1".</p>';
      }else{
      if ($captcha1!= $produit) {
      // Vérifier que le résultat de l'équation est égal à 4
      $nombreErreur++;
      $erreur7 = '<p>Désolé, le captcha1 anti-spam est erroné.</p>';
      }
      }
      if ($nombreErreur==0) { // S'il n'y a pas d'erreur
      // Ici il faut ajouter tout le code pour envoyer l'email.
      // Dans le code présenté au chapitre précédent, cela signifie au code entre les commentaires (1) et (2).
      } else { // S'il y a un moins une erreur
      echo '<div style="border:1px solid #ff0000; padding:5px;">';
      echo '<p style="color:#ff0000;">Désolé, il y a eu '.$nombreErreur.' erreur(s). Voici le détail des erreurs:</p>';
      if (isset($erreur1)) echo '<p>'.$erreur1.'</p>';
      if (isset($erreur2)) echo '<p>'.$erreur2.'</p>';
      if (isset($erreur3)) echo '<p>'.$erreur3.'</p>';
      if (isset($erreur4)) echo '<p>'.$erreur4.'</p>';
      if (isset($erreur5)) echo '<p>'.$erreur5.'</p>';
      // (4) Ici, il sera possible d'ajouter un code d'erreur supplémentaire si un captcha anti-spam est erroné.
      if (isset($erreur6)) echo '<p>'.$erreur6.'</p>';
      if (isset($erreur7)) echo '<p>'.$erreur7.'</p>';
      echo '</div>';
      }
      }

      ?>
      <form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
      <p>Votre nom et prénom: <input type="text" name="nom" size="30" /></p>
      <p>Votre email: <span style="color:#ff0000;">*</span>: <input type="text" name="email" size="30" /></p>
      <p>Message <span style="color:#ff0000;">*</span>:</p>
      <textarea name="message" cols="60" rows="10"></textarea><br>

      <!-- essai de captcha variable -->
      <? $a=rand(2,9);
      $b=rand(2,9);
      $produit=$a*$b;
      echo "Combien font $a x $b ?";
      ?>

      <input type='hidden' value ="<?php echo $produit;?>" name='produit'>
      <input type="text" name="captcha1" />
      <!-- fin essai captcha-->
      <p><input type="submit" name="submit" value="Envoyer" /></p>
      </form>
      </body>
      </html>
      0
      1. Modérateur
        Attention
        Utilise bien les balises php :
        <?php 
        

        et non juste :
        <?
        

        comme tu l'as fait
          <? $a=rand(2,9);
        

        A remplacer par :
          <?php  $a=rand(2,9);
        
        0
    4. On progresse ! Le form s'affiche en totalité...
      J'ai replacé le code pour l'envoi comme le préconise de script d'origine soit après les tests d'erreurs
      si NombreErreur==0...
      J'ai transféré vers SFR. ( http://autourdalos.fr/Essais/formcomplet3.php )
      Saisie des données, envoi... et message "erreur6" et pas d'envoi


      if (!$captcha1) {
      $nombreErreur++;
      $erreur6 = '<p>Il y a un problème avec la variable "captcha1".</p>';
      }else{
      if ($captcha1!= $produit) {
      // Vérifier que le résultat de l'équation est égal à 4
      $nombreErreur++;
      $erreur7 = '<p>Désolé, le captcha1 anti-spam est erroné.</p>';
      }
      }

      ..................................................................

      $message = isset($_POST['message']) ? htmlentities($_POST['message']) : '';
      $captcha1= !empty($_POST['captcha1']) ? $_POST['captcha1'] : NULL;
      $produit = !empty($_POST['produit']) ? $_POST['produit'] : NULL;

      ...........................................................
      0
      1. Modérateur
        Tu ne sais pas faire un copier/coller ???
        La tu as réussi à inverser la récupération des variables .... et ton test sur ton captcha....
        0
    5. Si, je sais faire (encore que copier le code entier me restitue quelques lignes de ??????????? )
      Mais je me suis fié aux commentaires d'utilisation du script d'origine qui préconise de déplacer toute une partie vers l'envoi, même si je trouvais l'explication un peu confuse...
      Bon, tout va bien maintenant.(formcomplet4.php) Il me reste à faire en sorte qu'un nouveau form vide ne se lance pas après l'envoi.
      Merci pour ton aide ... et ta patience !
      Petit souvenir de la balade de ce matin :
      https://www.cjoint.com/c/FFbol4LdvV6
      0
      1. Modérateur
        Moi ce matin le souvenir .. c'est ça :

        0