Aller au contenu
Valtiel

Formulaire PHP (envoi de données/champs requis/captcha)

Noter ce sujet :

Recommended Posts

Bonsoir à tous,

Alors voilà, j'ai fait d'innombrables recherches sur le net traitant des formulaires PHP et plus précisément pour l'envoi de données, les champs requis et le captcha.

J'ai pu trouver diverses informations mais d'une page à l'autre, le codage est complètement différent et/ou absolument rien n'est expliqué ils proposent juste un copier/coller et ensuite de faire à notre sauce et comme je veux avant tout APPRENDRE et COMPRENDRE ce que je fais, hors de question de procéder ainsi donc bref du coup, je ne sais trop où donner de la tête...

Cela étant, si vous avez un lien vers un site expliquant bien comment faire (de façon pédagogique de préférence) pour :

- envoyer les données d'un formulaire

(actuellement, mon formulaire est prêt, lorsqu'on appuie sur "ok" l'internaute est dirigé vers une page de confirmation des informations saisies et c'est suite à cette vérification que je voudrais envoyer ces mêmes informations sur une boîte mail, la mienne en l'occurrence)

- vérifier si les champs requis sont bien remplis et accessoirement, une vérification des adresse mails (valide ou pas)

(là, je ne sais pas s'il est possible de combiner la page de "traitement" avec la page de "vérification" que j'aimerais créer ou... je ne sais trop comment procéder)

- insérer un captcha

Je sais que c'est relativement énorme comme demande mais voulant faire bien et apprendre comme il faut, je me tourne vers ceux qui pourront bien m'orienter.

Merci :)

Modifié par Valtiel

Partager ce message


Lien à poster
Partager sur d’autres sites

Je vais tenter de te répondre.

- envoyer les données d'un formulaire

Alors, tu as un formulaire , qui est en HTML. Il possède des champs de différents types (text, textarea, password ...), ce sont toutes les balises input.

Il y a plusieurs méthodes pour envoyer les informations que contiennent ces champs, la méthode GET et la méthode POST.

La méthode POST est la plus courante. Pour la deuxième étape (la demande de validation des informations envoyées) ça va être difficile de t'aider sans avoir un bout de code.

Une possibilité est de récupérer ces informations, puis de les envoyer de nouveau via un formulaire.

On aurait donc quelque chose comme ça : formulaire => validation => formulaire de confirmation => envoi des données et traitement.

-vérifier si les champs requis sont bien remplis et accessoirement[..]

Tu peut utiliser pour cela la fonction empty() de PHP pour savoir si une variable est vide ou non et une expression régulière pour connaître la validité de l'email:
/>http://www.manuelphp.com/php/function.empty.php
/>http://www.commentcamarche.net/faq/855-php-verifier-le-format-d-une-adresse-mail#ii-grace-aux-expressions-regulieres

L'expression régulière va vérifier si la syntaxe de la chaîne que tu lui passe est conforme à celle d'un mail.

En complément, par exemple pour un code postal, tu peut faire d'autres vérifications comme la longueur de la chaîne:
/>http://www.manuelphp.com/php/function.strlen.php

Suivant les traitements que tu vas faire ensuite, penses à sécuriser tes variables pour éviter les injections de scripts/entêtes et les injections sql:
/>http://www.manuelphp.com/php/function.htmlentities.php
/>http://www.manuelphp.com/php/function.addslashes.php

- insérer un captcha

Il existe beaucoup de projets qui te permettront d'intégrer un captcha efficace ("script captcha" , "captcha php" ou encore "class captcha" sur google). Essais d'en intégrer un à ton formulaire et dis moi si tu rencontre un problème spécifique.

Modifié par K-Ola

Partager ce message


Lien à poster
Partager sur d’autres sites

Concernant le codage :

page contact


<form method="post" action="traitement_contact.php">
<p>
<label for="nom">Nom</label> : <br />
<input type="text" name="nom" id="nom" />
<img src="images/puce_2.png"/>
</p>

<p>
<label for="prenom">Prénom</label> : <br />
<input type="text" name="prenom" id="prenom" />
<img src="images/puce_2.png"/>
</p>

<p>
<label for="mail">Adresse e-mail</label> : <br />
<input type="text" name="mail" id="mail" />
<img src="images/puce_2.png"/>
</p>

<p>
<label for="tel">Numéro de téléphone</label> : <br />
<input type="text" name="tel" id="tel" />
</p>

<p>
<label for="sujet">Objet du message</label> : <br />
<input type="text" name="sujet" id="sujet" />
<img src="images/puce_2.png"/>
</p>

<p>
<br />
<label for="message">Saisissez votre message</label> : <br />
<textarea name="message" id="message"></textarea>
<img src="images/puce_2.png"/>
</p>

<p id="requis"><img src="images/puce_2.png"/> Requis</p>

<p id="submit">
<input type="submit" value="Ok" /> <input type="reset" />
</p>
</form>

page traitement_contact


<div class="corps">
<div id="contact">
<?php
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message = $_POST['message'];
?>
<h1>Confirmation des informations</h1>
<p><strong>Confirmez-vous l'exactitude des informations suivantes ?</strong></p>
<p>
<?php echo htmlentities('' . $nom . ' ' . $prenom . ''); ?><br/>
<?php echo htmlentities('' . $mail . ''); ?><br/>
<?php echo htmlentities('' . $tel . ''); ?><br/><br/>
Sujet de votre message : <?php echo htmlentities('' . $sujet . ''); ?><br/><br/>
Votre message : <br/>
<?php echo htmlentities('' . $message . ''); ?>
</p>
</div>
</div>
<div id="corps_bas">
<img src="images/background_corps_bas.png"/>
</div>
<?php include("footer.php"); ?>

Donc tout est prêt à être envoyé mais je ne trouve pas, enfin si j'ai trouvé des sites expliquant brièvement comment procéder ou expliquant bien étape par étape mais d'un site à l'autre, la façon de coder change et comme je ne voudrais pas prendre de mauvaises habitudes, c'est pourquoi j'aimerais que vous me guidiez vers une page de source sûre expliquant bien comment coder en PHP d'aujourd'hui pour envoyer ces données.

Pour les vérifications (et les captcha pour finir), je vais jeter un oeil aux liens proposés et je te remercie K-ola pour cette réponse constructive :).

Modifié par Valtiel

Partager ce message


Lien à poster
Partager sur d’autres sites

Le problème avec ta deuxième étape, c'est que rien ne rend possible l'envoi des informations.

Pour ça, tu peux par exemple recréer un formulaire qui va reprendre les informations du précédent, sauf que ce dernier ne sera pas visible.

Le bouton d'envoi (submit) sera le bouton "valider mon envoi". Tu peut te servir du type "hidden" pour ne pas afficher des champs (qui pourront quand même être envoyés et donc traités).

Ce sera quelque chose du genre (regardes ma remarque en fin de message, sans quoi ce code n'est pas sécurisé):

<form action="" method="post">
<input type="hidden" name="nom" value=<?=$nom?>>
<input type="hidden" name="prenom" value=<?=$prenom?>>
[...]
<input type="submit" value="Valider mon envoi">
</form>

Tu reproduits le principe pour l'ensemble des champs.

Ainsi, si tu places ce bout de code en dessous de celui que tu as tu te retrouveras avec:

-Le récapitulatif des informations

-Un bouton de validation qui se chargera de transmettre les données du précédent formulaire

Par contre, un conseil: filtres dés le début tes variables, et pas au moment de l'affichage, cela évite les oublis et tu sépares mieux les fonctions de ton code.

Donc au début, quant tu récupères tes données:

 $nom = addslashes(htmlentities($_POST['nom']));

Après il n'y a pas de référence au niveau de la solution envisageable , c'est une possibilité, il en existe d'autres.

Modifié par K-Ola

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui je sais que mon deuxième formulaire ne permet pas de récupérer quoi que ce soit, mais en fait ce que j'aimerais faire c'est que l'internaute procède ainsi :

1er étape : il rempli le formulaire et clique sur "ok" en bas de page

2ème étape : il est alors renvoyé sur une page où est inscrit les informations qu'il a rentré afin qu'il vérifie si tout est correct

3ème étape : si c'est le cas, il valide et le formulaire est alors envoyé à mon adresse mail, sinon il revient en arrière

Voilà ce que je voudrais faire. Après dans l'idéal, je sais qu'il est possible de faire afficher une fenêtre hop-up pour que l'internaute valide ses informations et clique sur "ok" et le formulaire est alors envoyé sur mon adresse mail mais pour ça, il faut faire appel à du javascript il me semble et je n'y ai encore pas touché...

Partager ce message


Lien à poster
Partager sur d’autres sites

Je te déconseilles l'utilisation des popups, qui se feront bloquer sur la plupart des navigateurs.

La solution que j'ai énoncée répond tout à fait à ta problématique (enfin je pense).

Pour récapituler:

-L'utilisateur saisi ses infos et valide

-Il voit le récapitulatif des informations, techniquement, en plus de lui faire afficher ces informations, tu génères un formulaire avec des champs invisibles.

Le bouton suivant enverra donc ces données vers ta page de traitement

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui j'ai pensé au problème des hop-up bloqués mais bon... j'apprécie malgré tout cette méthode.

Quoi qu'il en soit, je vais me pencher sur mon formulaire et je te tiens au courant en espérant ne pas rencontrer de problème.

En tout cas, merci encore pour tout ça K-Ola même si j'en demandais pas tant ^^.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut,

Désolé pour le retard de ma réponse... En fait, je viens de relire ton message mais, au final ok je recréé une page avec l'ensemble de mon formulaire caché pour récupérer mes informations mais... comment faire pour dire qu'il faut envoyer ces informations là à telle adresse ou serveur ?!

Car ok le bouton d'envoi est présent mais s'il ne sait pas où envoyer, ça va être dur ^^.

Partager ce message


Lien à poster
Partager sur d’autres sites

Comme dans un formulaire classique , tu va définir la cible du formulaire avec la propriété action :

<form action="ma_page_cible.php" method="post">

Le fait qu'il soit caché n'aura aucune influence sur le fonctionnement du formulaire.

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui mais cette ligne renvoi sur une page traitant les informations avec PHP mais en rien elle n'envoie ces dernières sur mon adresse mail par exemple, je me trompe ?

J'ai lu quelque part qu'il fallait écrire une ligne dans cet esprit "$TO" etc.

PS : t'es debout super tôt dit moi. Ou alors tu te couches bien tard... ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok, j'avais pas compris ta question comme ça.

Alors pour la suite, l'envoi des données sur ton adresse mail, il va falloir utiliser la fonction mail() de php.


<?
$destinataire = "tonmail_AT_domaine.com";
$expediteur = $mail;
$reponse = $expediteur;
$titre="Formulaire de contact - ".$sujet;
$message="
Nouveau message de ".$prenom." ".$nom."
Tél.: ".$tel."
Message: ".$message;
mail($destinataire,$titre,$message,"From: $expediteur\r\nReply-To: $reponse");
?>

Pour les infos complémentaire, voir le manuel : http://php.net/manual/fr/function.mail.php

Voilà pour un exemple basique, à adapter bien sûr :)

Modifié par K-Ola

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok donc si j'ai bien compris, (partons du principe que je vais créer une page "envoi_contact" pour l'envoi des informations) :

page "traitement_contact"


<div id="traitement_contact">
<?php
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message = $_POST['message'];
?>
<h1>Confirmation des informations</h1>
<p><strong>Confirmez-vous l'exactitude des informations suivantes ?</strong></p>
<p>
<?php echo htmlentities('' . $nom . ' ' . $prenom . ''); ?><br/>
<?php echo htmlentities('' . $mail . ''); ?><br/>
<?php echo htmlentities('' . $tel . ''); ?><br/><br/>
Sujet de votre message : <?php echo htmlentities('' . $sujet . ''); ?><br/><br/>
Votre message : <br/>
<?php echo htmlentities('' . $message . ''); ?>
</p>
<form method="post" action="envoi_contact.php">
<input id="submit" type="submit" value="Ok" /> <input id="submit" type="button" value="Retour" onClick="history.back()"/>
</form>
</div>

Si tu regardes en bas, j'ai ajouté un bouton "ok" qui renverra sur la page "envoi_contact" et un bouton qui renvoi en arrière.

Sur la page "envoi_contact" j'insère les lignes (modifiées à ma convenance bien sûre) que tu m'as fourni et ainsi, je recevrais les informations de l'internaute sur ma boîte mail, est-ce bien ça ?

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est presque ça :)

Il te manque l'ensemble des champs du précédent formulaire :


<form method="post" action="envoi_contact.php">
<input type="hidden" name="nom" value=<?=$nom?>>
<input type="hidden" name="prenom" value=<?=$prenom?>>
[...]
<input id="submit" type="submit" value="Ok" /> <input id="submit" type="button" value="Retour" onclick="history.back()"/>
</form>

N'oublies pas les htmlentities() et addslashes() à la récupération des variables.

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok ok. Bon, j'ai appliqué le tout (sauf pour le moment la sécurité) et je reçois bien le mail mais... voir.

Voici le code :

pahe "envoi_contact"


<div id="envoi_contact">
<p>Merci pour votre message, je vous répondrais dans les plus bref délais.</p>
<?
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message = $_POST['message'];
$destinataire = "valtiel7_AT_gmail.com";
$expediteur = $mail;
$reponse = $expediteur;
$titre ='Formulaire de contact - ' . $sujet . '';
// -----
$message ='
Nouveau message de ' . $prenom . ' ' . $nom . ''
Tél.: '' . $tel . ''
Message: '' . $message . '';
// -----
mail($destinataire,$titre,$message,'De : ' . $expediteur . '\r\n Répondre : ' . $reponse . '');
?>
</div>

J'ai uniquement modifié quelques détails et à ce propos, pourquoi mettre $message à la fin des lignes que j'ai mis entre "// -----" ?

Modifié par Valtiel

Partager ce message


Lien à poster
Partager sur d’autres sites

Si tu essais avec ce code :

          
<div id="envoi_contact">
<p>Merci pour votre message, je vous répondrais dans les plus bref délais.</p>
<?
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message = $_POST['message'];
$destinataire = "valtiel7_AT_gmail.com";
$expediteur = $mail;
$reponse = $expediteur;
$titre ='Formulaire de contact - '.$sujet;
$message ='
Nouveau message de ' . $prenom . ' ' . $nom . '
Tél.: ' . $tel . '
Message: ' . $message;
mail($destinataire,$titre,$message,"From: ".$expediteur."\r\nReply-To: ".$reponse);

?>
</div>

Attention au dernier paramètre de la fonction mail qui est l'entête, à laisser comme ça donc.

Pour tester il faudra systématiquement commencer à l'étape 1 , sans quoi les variables seront vides.

Pour le placement de $message, peu importe l'emplacement tant que c'est après l'assignation des variables bien entendu.

Modifié par K-Ola

Partager ce message


Lien à poster
Partager sur d’autres sites

Je reçois toujours un message vide :/

Page "envoi_contact"


<?
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message_internaute = $_POST['message'];
$destinataire = "valtiel7_AT_gmail.com";
$expediteur = $mail;
$reponse = $expediteur;
$titre ='Formulaire de contact - ' . $sujet . '';
$message ='
Nouveau message de ' . $prenom . ' ' . $nom . '
Tél. : ' . $tel . '
Message : ' . $message_internaute . '';
mail($destinataire,$titre,$message,"From: ".$expediteur."\r\nReply-To: ".$reponse);
?>

Pourtant, tout est récupéré... et j'ai bien repris depuis la première étape pour les essais.

PS : Je ne comprenais pas pour la variable $message car il y en avait deux, j'ai donc changé la variable $message concernant l'internaute en $message_internaute.

Modifié par Valtiel

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu peux faire un :

print_r($_POST); 

au début du fichier et donner le résultat stp.

Partager ce message


Lien à poster
Partager sur d’autres sites

Le print_r() est censé afficher des données au début, il ne t'affiches rien ?

Il c'est le cas, alors le problème se situe sans doute à l'étape précédente.

Partager ce message


Lien à poster
Partager sur d’autres sites

Et bien non non, le mail ne contient absolument rien des informations de l'internaute.

Pour la page précédente :

Page "traitement_contact"


<div id="traitement_contact">
<?
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message_internaute = $_POST['message'];
?>
<h1>Confirmation des informations</h1>
<p><strong>Confirmez-vous l'exactitude des informations suivantes ?</strong></p>
<p>
<?php echo htmlentities('' . $nom . ' ' . $prenom . ''); ?><br/>
<?php echo htmlentities('' . $mail . ''); ?><br/>
<?php echo htmlentities('' . $tel . ''); ?><br/><br/>
Sujet de votre message : <?php echo htmlentities('' . $sujet . ''); ?><br/><br/>
Votre message : <br/>
<?php echo htmlentities('' . $message_internaute . ''); ?>
</p>
<form method="post" action="envoi_contact.php">
<input id="submit" type="submit" value="Ok" /> <input id="submit" type="button" value="Retour" onClick="history.back()"/>
</form>
</div>

Voilà, mais je ne pense pas qu'il y ai de problème ici...

Partager ce message


Lien à poster
Partager sur d’autres sites

Il te manques les informations dans le deuxième formulaire:

                <div id="traitement_contact">
<?
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$mail = $_POST['mail'];
$tel = $_POST['tel'];
$sujet = $_POST['sujet'];
$message_internaute = $_POST['message'];
?>
<h1>Confirmation des informations</h1>
<p><strong>Confirmez-vous l'exactitude des informations suivantes ?</strong></p>
<p>
<?php echo htmlentities('' . $nom . ' ' . $prenom . ''); ?><br/>
<?php echo htmlentities('' . $mail . ''); ?><br/>
<?php echo htmlentities('' . $tel . ''); ?><br/><br/>
Sujet de votre message : <?php echo htmlentities('' . $sujet . ''); ?><br/><br/>
Votre message : <br/>
<?php echo htmlentities('' . $message_internaute . ''); ?>
</p>
<form method="post" action="envoi_contact.php">
<input type="hidden" name="nom" value=<?=$nom?>>
<input type="hidden" name="prenom" value=<?=$prenom?>>
<input type="hidden" name="sujet" value=<?=$sujet?>>
<input type="hidden" name="mail" value=<?=$mail?>>
<input type="hidden" name="tel" value=<?=$tel?>>
<input type="hidden" name="message" value=<?=$message_internaute?>>
<input id="submit" type="submit" value="Ok" />
<input id="submit" type="button" value="Retour" onclick="history.back()"/>
</form>
</div>

Partager ce message


Lien à poster
Partager sur d’autres sites

Aaaaah mais oui suis-je bête !!! Un formulaire vide ça fonctionne moins bien -_-"... Quel ignare.

Je te redis ça K-Ola.

Partager ce message


Lien à poster
Partager sur d’autres sites

Re,

donc, je reçois cette fois-ci bien un message rempli, c'est une bonne nouvelle :)

Cependant, la mauvaise nouvelle, les informations sont coupées.

Les parties "sujet" et "message" sont coupées. J'ai entré comme sujet "demande d'informations" et comme message "bonjour, je désire obtenir des informations sur XXX" comme exemple et seul le mot "demande" dans les deux cas est affiché.

Il y aurait-il un lien avec "wordwrap($message, 70)" ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Le problème vient sans doute du ' , il faut absolument que tu filtres tes variables lors de leur récupération à cette étape:

$variable=addslashes(htmlentities($_POST['mavariable']));

Partager ce message


Lien à poster
Partager sur d’autres sites

Page "envoi_contact"


<?
$nom =htmlentities($_POST['nom']);
$prenom =htmlentities($_POST['prenom']);
$mail =htmlentities($_POST['mail']);
$tel =htmlentities($_POST['tel']);
$sujet =htmlentities($_POST['sujet']);
$message_internaute =htmlentities($_POST['message']);
$destinataire =htmlentities("Valtiel7_AT_gmail.com");
$expediteur =htmlentities($mail);
$reponse =htmlentities($expediteur);
$titre =htmlentities('Formulaire de contact - ' . $sujet . '');
$message =htmlentities('
Nouveau message de ' . $prenom . ' ' . $nom . '
Tél. : ' . $tel . '
Message : ' . $message_internaute . '');
mail($destinataire,$titre,$message,"From: ".$expediteur."\r\nReply-To: ".$reponse);
?>

J'ai essayé avec addslash(htmlentities() et des slash sont ajoutés à tout va, là j'ai juste mis htmlentities() et mes caractères sont déformés et dans les deux cas, le problème persiste lors de la réception du message dans ma boîte mail. Pourtant, j'ai fouillé un peu sur le net, et malgré ça en plus de ton aide, je ne trouve pas ce qui pourrait couper le sujet et le message.

Modifié par Valtiel

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×