Form et traitement : passage de variables [Résolu/Fermé]

Signaler
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021
-
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
-
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

Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496
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                                                                 
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021

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>

Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496
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 ?
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021
>
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021

Bonjour 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.
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496 >
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021

Quel est exactement le code présent sur ton serveur ?
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021

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.
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496
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.
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021

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>
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496
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);
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021

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;

...........................................................
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496
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....
Messages postés
105
Date d'inscription
lundi 16 janvier 2012
Statut
Membre
Dernière intervention
20 avril 2021

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
Messages postés
32540
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 mai 2021
3 496
Moi ce matin le souvenir .. c'est ça :