Page 1 sur 1

Casse tête : formulaire

Posté : 12 juin 2010, 17:00
par Lowlow
Bonjour tout le monde,

Avant de poster dans ce forum, j'ai cherché un peu partout une solution, mais je n'ai rien trouvé...

Je vais vous expliquer :

J'ai un formulaire en .php qui appelle deux autres fonctions à savoir une qui envoi un email de confirmation à la personne qui a rempli le formulaire (m2.php) et une qui envoi un email au client avec les données du formulaire précédemment rempli.(sendmail.php)

Le problème c'est qu'il me manque une fonction pour vérifier mon formulaire...
J'ai commencé par vérifier les données dans mon formulaire, mais je ne sais pas comment je peux faire pour tester mes données correctement. Car là en fait je regarde si les champs sont vides ou non... or certain champs ne sont pas obligatoires...

merci par avance :oops:

Voilà le morceau de mon code qui fait la vérification.

Code : Tout sélectionner

<?php if(isset($_POST["valider"])) { require 'sendMail.php'; require 'm2.php'; $data["name"] = trim($_POST["name"]); $data["responsable"] = trim($_POST["responsable"]); $data["tel"] = trim($_POST["tel"]); $data["fax"] = trim($_POST["fax"]); $data["gsm"] = trim($_POST["gsm"]); $data["mail"] = trim($_POST["mail"]); $data["contact"] = trim($_POST["contact"]); $data["gsmContact"] = trim($_POST["gsmContact"]); $data["adresse"] = trim($_POST["adresse"]); $data["lieu"] = trim($_POST["lieu"]); $data["materielNombre"] = trim($_POST["materielNombre"]); if(isset($_POST["langue1"])) $data["langue1"] = trim($_POST["langue1"]); if(isset($_POST["langue2"])) $data["langue2"] = trim($_POST["langue2"]); if(isset($_POST["langue3"])) $data["langue3"] = trim($_POST["langue3"]); $data["langue4"] = trim($_POST["langue4"]); $data["languesDebut"] = trim($_POST["languesDebut"]); $data["languesFin"] = trim($_POST["languesFin"]); $data["day"] = trim($_POST["day"]); $data["month"] = trim($_POST["month"]); $data["year"] = trim($_POST["year"]); $data["heureDebut"] = trim($_POST["heureDebut"])."h"; $data["minuteDebut"] = trim($_POST["minuteDebut"])."m"; $data["heureFin"] = trim($_POST["heureFin"])."h"; $data["minuteFin"] = trim($_POST["minuteFin"])."m"; $data["manifestation"] = trim($_POST["manifestation"]); $data["materiel"] = trim($_POST["materiel"]); $data["materiel2"] = trim($_POST["materiel2"]); $erreur = null; $erreurs = array('name' => 'le nom de l\'organisme demandeur', 'responsable' => 'le nom du représentant', 'gsm' => 'le numéro gsm', 'tel' => 'le numéro de téléphone', 'mail' => 'l\'adresse mail', 'contact' => 'le nom de la personne à contacter', 'gsmContact' => 'le numéro gsm de la personne à contacter', 'adresse' => 'l\'adresse de facturation', 'materielNombre' => 'le nombre de coffrets souhaités', 'langue4' => 'le nom de la langue supplémentaire', 'languesDebut' => 'le début des langues', 'languesFin' => 'la fin des langues', 'manifestation' => 'le nom de la manifestation'); echo "<p>"; foreach($data as $key => $value) { if(empty($data[$key])) { $erreur = 1; echo "Il y a une erreur dans $erreurs[$key]<br />"; } } echo "</p>"; if($erreur != 0) echo "<p>Veuillez recommencer.</p>"; else { if(sendMail("form3", $data)) echo "Votre demande a été transmise à nos services."; else echo "Erreur de transmission, veuillez recommencer."; } }

Re: Casse tête : formulaire

Posté : 12 juin 2010, 18:37
par AB
mais je ne sais pas comment je peux faire pour tester mes données correctement. Car là en fait je regarde si les champs sont vides ou non... or certain champs ne sont pas obligatoires...
Ben heu..., y'a qu'à enlever les champs non obligatoires du test sur les champs vides, non ?

Re: Casse tête : formulaire

Posté : 12 juin 2010, 18:40
par Lowlow
mais je ne sais pas comment je peux faire pour tester mes données correctement. Car là en fait je regarde si les champs sont vides ou non... or certain champs ne sont pas obligatoires...
Ben heu..., y'a qu'à enlever les champs non obligatoires du test sur les champs vides, non ?

hum oui mais comment ? #-o sachant que j'ai utilisé :

Code : Tout sélectionner

if(empty($data[$key]))

Re: Casse tête : formulaire

Posté : 13 juin 2010, 18:29
par AB
Tu enlèves les champs non obligatoires du tableau $data...

Re: Casse tête : formulaire

Posté : 13 juin 2010, 20:55
par Lowlow
oui mais en faisant ça, je ne récupère pas mes données qui sont ensuite envoyées par mail...
or on peut dans un formulaire avoir des données obligatoires et non obligatoires, comme par exemple le fax, si j'enlève le $data du fax, mais que la personne met quand même son fax, je ne reçois pas cette info par email...

Arf c'est vraiment compliqué :oops:
je suis un peu désespérée...

peut-on imaginer une validation en javascript ?

Re: Casse tête : formulaire

Posté : 13 juin 2010, 22:49
par AB
Oh mais faut pas être désespéré pour si peu :wink:

Tu les enlève pour le contrôle et tu les rajoute pour l'envoi des données

// ex données obligatoires :
$data["name"] = trim($_POST["name"]);
$data["mail"] = trim($_POST["mail"]);

// ex données facultatives :
$data_option["responsable"] = trim($_POST["responsable"]);
$data_option["tel"] = trim($_POST["tel"]);

// ex suite du code pour tester les champs vides

 $erreurs = array('name' => 'le nom de l\'organisme demandeur','mail' => 'adresse_mail')

   foreach($data as $key => $value)
   {
   if(empty($value))
      {
         $erreur = 1;
         echo "Il y a une erreur dans $erreurs[$key]
";
      }
   }

// addition des deux tableaux
$data = array_merge($data,$data_option);

// reste plus qu'à envoyer tes données avec ton tableau $data reconstitué
A part ça oui on peut le faire en javascript, mais il faut le refaire en php par sécurité au cas ou javascript serait désactivé.
Donc tu commence par le php et si tu veux tu complémente ensuite par du javascript :)

Re: Casse tête : formulaire

Posté : 14 juin 2010, 15:45
par Lowlow
Merci beaucoup pour ton aide AB, ça me semble tellement simple maintenant :)
Par contre j'ai changé un peu les choses, comme je n'arrivais pas à faire marcher ça :
// addition des deux tableaux
$data = array_merge($data,$data_option);
alors j'ai simplement mis dans ma fonction sendmail, le $data_option et j'ai adapté ma fonction et ça marche :P

J'ai encore une tite question :oops: quand l'utilisateur rempli le formulaire, s'il oubli un champ alors il y a un message d'erreur mais les données qu'il a rentré précédemment sont effacées... peut-on faire en sorte de ne pas tout effacer ???car c'est chiant de devoir tout remplir à nouveau...

Merci par avance...

une novice en php... :cry:

Re: Casse tête : formulaire

Posté : 15 juin 2010, 14:34
par AB
Tes variables rentrées et postées dans le formulaire sont dans la variable $_POST
Donc tu peux écrire tes champs de formulaire en faisant comme ceci :
<input type = "text"  name = "nom" value = "<?php if(isset($_POST["name"])) echo htmlspecialchars($_POST["name"]) ?>" />
Notes que quand on affiche des variables provenant d'une source non contrôlée il faut toujours les protéger par htmlspecialchars() ou htmlentities() pour éviter le piratage :wink:

Re: Casse tête : formulaire

Posté : 16 juin 2010, 10:45
par Lowlow
Et le php devient plus facile :) finalement c'est pas si dur :)) merci beaucoup.

Mais ça serait trop beau si tout était parfait quand même :)

Encore une petite question j'ai des boutons radios, or si la personne coche un bouton et fait une erreur la croix n'est plus là. Y a t'il un moyen pour garder le bouton coché ?
j'ai essayé de faire de la même manière que pour les données, mais ça n'a pas marché.
Exemple de bouton :
     <input type="checkbox" name="materiel" value="coffrets"/>
Encore une autre question, j'étais contente de voir que ma fonction qui envoi un email à la personne qui a rempli le formulaire marche à merveille... mais le pb c'est qu'elle envoi un mail dès que la personne clic sur validé, et même s'il y a des erreurs...

voici ma fonction :
<?php 


$mail = $_POST['mail'];

$destinataire = $mail;

$sujet = "confirmation " ;



$entetes = "From: adressemail";


$message = '
MAIL DE CONFIRMATION etc.....';


mail($destinataire, $sujet, $message, $entetes) ;

?>
merci encore beaucoup pour ton aide :oops:

Re: Casse tête : formulaire

Posté : 16 juin 2010, 14:31
par AB
Et le php devient plus facile :) finalement c'est pas si dur :)) merci beaucoup.

Mais ça serait trop beau si tout était parfait quand même :)

Encore une petite question j'ai des boutons radios, or si la personne coche un bouton et fait une erreur la croix n'est plus là. Y a t'il un moyen pour garder le bouton coché ?
j'ai essayé de faire de la même manière que pour les données, mais ça n'a pas marché.
Exemple de bouton :
     <input type="checkbox" name="materiel" value="coffrets"/>
C'est un peu pareil mais il n'y a pas de texte à indiquer pour un checkbox. Donc il faut tester si le checkbox a été coché puis indiquer qu'il a été coché s'il y a un ré affichage. Pour indiquer un checkbox coché il faut mettre checked = "checked" dans l'input.
Je te laisse chercher la condition php pour l'écrire à bon escient.

Pendant la phase de développement, pour voir le contenu de l'ensemble du $_POST, tu peux écrire
echo '<pre>';
print_r($_POST);
echo '</pre>';
dans ton code php (en dehors de toutes les conditions "if...")

Fais quelques tests en cochant ou décochant tes checkbox et en remplissant ou non des champs textes.
Comme ça tu verras le retour contenu dans le $_POST et les choses vont s'éclairer encore un peu plus.


Encore une autre question, j'étais contente de voir que ma fonction qui envoi un email à la personne qui a rempli le formulaire marche à merveille... mais le pb c'est qu'elle envoi un mail dès que la personne clic sur validé, et même s'il y a des erreurs...
Ben là je dirais il faut conditionner l'envoi du mail avec la validité du formulaire.

Tu peux faire une structure conditionnelle ou enregistrer un témoin d'état de validité.
Par exemple schématiquement :

Code : Tout sélectionner

initialisation de la variable erreur $erreur = null; tests if champ 1 non rempli -> $erreur = 'champ 1 non rempli'; if champ 2 non rempli $erreur = 'champ 2 non rempli'; Si une erreur est survenue la variable $erreur n'est plus nulle. Or le code d'envoi de mail doit s'effectuer uniquement si elle est nulle (si aucune erreur n'a été détectée la variable a gardé son état initial). Donc on peut écrire if (is_null($erreur)) {... code d'envoi du mail ...}
Dans cet exemple tu pourrais aussi écrire if (!isset($erreur)) à la place de if (is_null($erreur))

Re: Casse tête : formulaire

Posté : 18 juin 2010, 15:03
par Lowlow
On avance, l'envoi du mail fonctionne désormais correctement :) merci beaucoup :)

Par contre pour la checkbox... c'est pas encore ça...
if (isset($_POST['materiel'])) {
	
$_POST['materiel']=='checked';
	
	
	
	print ('ok');
	
}
voilà ce que j'ai fait... et ça ne marche pas..

si j'enlève
$_POST['materiel']=='checked';
pour tester simplement ma chekbox, ça marche et je vois le 'ok'. J'ai compris qu'on devait surtout utiliser la valeur de la chekbox... mais c'est pas encore ça #-o

Re: Casse tête : formulaire

Posté : 19 juin 2010, 18:50
par AB
Pendant la phase de développement, pour voir le contenu de l'ensemble du $_POST, tu peux écrire
echo '<pre>';
print_r($_POST);
echo '</pre>';
dans ton code php (en dehors de toutes les conditions "if...")

Fais quelques tests en cochant ou décochant tes checkbox et en remplissant ou non des champs textes.
Comme ça tu verras le retour contenu dans le $_POST et les choses vont s'éclairer encore un peu plus.
Tu l'a fait ? Prends l'habitude de le faire tu gagneras beaucoup de temps :wink:

Si tu l'a fait tu devrais comprendre qu'un checkbox renvoie 1 si coché et ne renvoie rien pas même la variable $_POST correspondante si non coché

donc pour un checkbox nommé "azerty"
<input type = "checkbox" name = "azerty"  <?php if (isset($_POST['azerty'])) echo 'checked = "checked"'?> />

Re: Casse tête : formulaire

Posté : 27 juin 2010, 23:11
par Lowlow
Pendant la phase de développement, pour voir le contenu de l'ensemble du $_POST, tu peux écrire
echo '<pre>';
print_r($_POST);
echo '</pre>';
dans ton code php (en dehors de toutes les conditions "if...")

Fais quelques tests en cochant ou décochant tes checkbox et en remplissant ou non des champs textes.
Comme ça tu verras le retour contenu dans le $_POST et les choses vont s'éclairer encore un peu plus.
Tu l'a fait ? Prends l'habitude de le faire tu gagneras beaucoup de temps :wink:
oui je l'avais fait, mais en fait ça ne faisait rien et quand je cliquais sur "valider" alors là ça affichait la valeur de la chekbox... en tout cas merci beaucoup pour ton aide, tout fonctionne :)
:lol: