nelumbo Posté 22 Janvier 2007 Posté 22 Janvier 2007 Bonjour, Spammé depuis quelques jours et à répétition par l'intermédiaire de mon formulaire de contact, je souhaite intégrer un cryptograph à mon formulaire. L'installation en semble pas compliqué, mais sans succès pour ma part. L'image qui génère les codes ne s'affiche pas ! Le dossier crypt est bien sur mon serveur. -http://www.lanature.fr/contact.php <?php include "crypt/functions.php"; ?><?php// Dans la ligne qui suit, remplacer webmaster_AT_domaine.tld par l'adresse email du webmaster, à laquelle les messages devront être envoyés$email_webmaster = "webmaster_AT_lanature.fr";// === traitement des données du formulaire ============================================================if (isset($_POST["envoyer"])){// le formulaire a été soumis$etat = "erreur";// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---if (isset($_POST["email_expediteur"])) {$_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));}if (isset($_POST["titre"])) {$_POST["titre"]=trim(stripslashes($_POST["titre"]));}if (isset($_POST["message"])) {$_POST["message"]=trim(stripslashes($_POST["message"]));}// --- test de la validité des champs saisis ---if (empty($_POST["email_expediteur"])) {// il manque l'email de l'expéditeur$erreur="Saisissez votre adresse email...";}elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){// l'adresse e-mail n'est pas valide$erreur="Votre adresse e-mail n'est pas valide...";}elseif (empty($_POST["message"])) {// le message est vide$erreur="Saisissez un message...";}elseif (empty($_POST["code"])) {// le code n'est pas saisi$erreur="Saisissez le code de verification...";}else {// --- Vérification de la validité du code captcha ---if (chk_crypt($_POST['code']))// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---$etat="ok";// --- Le code captcha n'est pas valide ---else $erreur="Code de verification non valide ...";}}else {// --- le formulaire n'a pas été soumis ---$etat="attente";}// === fin de traitement des données du formulaire =======================================================?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head> <title>Contact nature et jardin bio</title> <meta name="description" content="Formulaire de contact nature et jardin bio, posez vos questions sur la nature"> <meta name="Keywords" content="nature, jardin ,question nature, question jardin, contact nature"> <link href="http://www.lanature.fr/icones.ico" rel="shortcut icon"> <link rel="stylesheet" type="text/css" href="style.css"></head><body><div id="conteneur"><br><div id="edito"><h2 style="text-align: center;">Contact Nature et jardinbio</h2><br>Pour toutes demandes d'aides et conseils sur le thème dela <strong>nature</strong> et du <strong>jardin</strong>,merci<br>d'utiliser le forum. Vous pouvez y accéder en cliquant sur <a style="color: rgb(102, 0, 204);" href="forum/"><strong>forumnature</strong></a>.<br><br>Pour me contacter, remplissez le formulaire ci-dessous.<br><br><div align="center"><?phpif ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreurif ($etat=="erreur"){//le formulaire a été soumis avec une erreurecho "<p><strong>".$erreur."</strong></p>\n";// afficher le message d'erreur}?><form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>"><p><label for="email_expediteur">Votre adresse e-mail (obligatoire):</label><br /><input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?phpif (!empty($_POST["email_expediteur"])) {// l'adresse email de l'expéditeur a été saisie: la réafficherecho htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);}?>" /></p><p><label for="titre">Titre de message (facultatif):</label><br /><input type="text" size="40" name="titre" id="titre" value="<?phpif (!empty($_POST["titre"])) {// le titre du message a été saisi: le réafficherecho htmlspecialchars($_POST["titre"],ENT_QUOTES);}?>" /></p><p><label for="message">Message (obligatoire):</label><br /><textarea name="message" id="message" cols="40" rows="5"><?phpif (isset($_POST["message"])) {// le message a été saisi: le réafficherecho htmlspecialchars($_POST["message"],ENT_QUOTES);}?></textarea></p><?php dsp_crypt(0,1); ?><p><input type="text" name="code" /></p><p><input type="submit" name="envoyer" value="Envoyer" /></p></form><?php}else {// le formulaire a été soumis sans erreur, on envoie le mail$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";$entete .= "MIME-Version: 1.0";if (@mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)){// mail envoyéecho "Votre message a été envoyé.<br />\n";echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Envoyer un autre message...</a>\n";}else {// erreur lors de l'envoi du mailecho "Un problème s'est produit lors de l'envoi du message.\n";echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a>\n";}}?></div><br><br><div style="text-align: center;"><br><input name="button2" onclick="history.back()" value="Retour" type="button"></div></div><div style="text-align: center;" id="header"><?php include("menu.php"); ?><big><br><br><br><br><br></big></div><div style="text-align: center;" id="gauche"><?php include("gauche.php"); ?><big><br></big></div><div id="droite"><div style="text-align: center;"><?php include("droite.php"); ?></div><big><br></big></div><div style="text-align: center;" id="pied"><?php include("pied.php"); ?></div></div></body></html>
alphega Posté 22 Janvier 2007 Auteur Posté 22 Janvier 2007 Bonjour, Regarde dans la faq de cryptographp si tu n'es pas dans un de ces cas: http://www.cryptographp.com/index.php?page=10 (problème hebergeur ?)
nelumbo Posté 22 Janvier 2007 Posté 22 Janvier 2007 Merci, mon serveur ne l'accepte. J'ai testé le script sur un autre hebergeur, il fonctionne impecable. Meme avec les modifications apportées l'image reste inaffiché. J'opte pour un autre script, qui semble fonctionner.
Norbert_404 Posté 24 Janvier 2007 Posté 24 Janvier 2007 Bonjour à tous ! Juste une question : Le mailer en php proposé dans ce sujet permet-il de cacher l'email quand la page est aspirée ? Je me pose cette question car apparemment mon site a été aspiré... PS: j'utilise aussi le captcha proposé par Byc et j'ai ajouté dans le répertoire qui contient le formulaire php un fichier index.html pour éviter d'afficher le contenu de ce même répertoire...
captain_torche Posté 24 Janvier 2007 Posté 24 Janvier 2007 Il ne faut pas confondre : - Un système de captcha empêche (théoriquement) aux robots automatisés de s'inscrire, pour qu'ils ne puissent pas spammer un forum ou un système de commentaires - un aspirateur enregistre toutes les pages d'un site en suivant les liens (comme un moteur de recherche, mais avec un but plus ou moins avouable). Ils ne sont pas liés : un captcha n'empêchera pas à un aspirateur de voir les adresses e-mail de ton site. Une manière de se protéger, est de faire en sorte que les adresses e-mail ne soient pas reconnues comme telles par un robot. Sur ce forum, elles sont automatiquement transformées en adresse_AT_email.com
alphega Posté 24 Janvier 2007 Auteur Posté 24 Janvier 2007 Là en l'occurence, meme si ton site est aspiré l'adresse email qui se trouve dans le script ne sera pas vue car elle n'apparait pas dans la source du fichier html mais seulement dans la source du fichier php. Ce script protège donc ton adresse email. Ce que verra la personne qui a aspiré ton site, c'est ce que tu vois quant tu fais un clic droit/afficher la source lorsque tu visionnes ta page de contact.
bed Posté 24 Janvier 2007 Posté 24 Janvier 2007 J'ai modifié le deuxième formulaire avec le système d'addition qui est proposé sur ce fil et j'ai ajouté l'envoie de l'adresse IP ainsi que le navigateur de celui qui poste le message. Que pensez-vous du code ? <?php include_once("antispam.php");?><?php// Dans la ligne qui suit, remplacer webmaster_AT_domaine.tld par l'adresse email du webmaster, à laquelle les messages devront être envoyés$email_webmaster = "webmaster_AT_domaine.tld ";// Rajout alphega: Dans cette ligne remplacer example.com par le nom de votre site. Utile si vous avez plusieurs formulaires.$titre_cache = "Depuis le site domaine.tld";// === traitement des données du formulaire ============================================================if (isset($_POST["envoyer"])){// le formulaire a été soumis$etat = "erreur";// Valeur par défaut. Prendra la valeur "ok" s'il n'y a pas d'erreur// --- mise en forme des champs saisis dans le formulaire lors de sa soumission ---if (isset($_POST["email_expediteur"])) {$_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));}if (isset($_POST["titre"])) {$_POST["titre"]=trim(stripslashes($_POST["titre"]));}if (isset($_POST["message"])) {$_POST["message"]=trim(stripslashes($_POST["message"]));}// --- test de la validité des champs saisis ---if (empty($_POST["email_expediteur"])) {// il manque l'email de l'expéditeur$erreur="Saisissez votre adresse email...";}elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){// l'adresse e-mail n'est pas valide$erreur="Votre adresse e-mail n'est pas valide...";}elseif (empty($_POST["message"])) {// le message est vide$erreur="Saisissez un message...";}elseif (antispam_check() == false) {// l'addition est fausse$erreur="Résultat incorrect du calclul antispam, veuillez réessayer !";}else {// --- tous les champs sont correctement remplis: on pourra envoyer le mail ---$etat="ok";}}else {// --- le formulaire n'a pas été soumis ---$etat="attente";}// === fin de traitement des données du formulaire =======================================================?> <?phpif ($etat!="ok"){// le formulaire n'a pas été soumis, ou soumis avec une erreurif ($etat=="erreur"){//le formulaire a été soumis avec une erreurecho "<p><strong>".$erreur."</strong></p>\n";// afficher le message d'erreur}?><form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>"><p><label for="email_expediteur">Votre adresse e-mail (obligatoire):</label><br /><input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?phpif (!empty($_POST["email_expediteur"])) {// l'adresse email de l'expéditeur a été saisie: la réafficherecho htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);}?>" /></p><p><label for="titre">Titre de message (facultatif):</label><br /><input type="text" size="40" name="titre" id="titre" value="<?phpif (!empty($_POST["titre"])) {// le titre du message a été saisi: le réafficherecho htmlspecialchars($_POST["titre"],ENT_QUOTES);}?>" /></p><p><label for="message">Message (obligatoire):</label><br /><textarea name="message" id="message" cols="40" rows="5"><?phpif (isset($_POST["message"])) {// le message a été saisi: le réafficherecho htmlspecialchars($_POST["message"],ENT_QUOTES);}?></textarea></p><p>Résultat du calcul (pour éviter le spam):</p><?php antispam_ins(); ?><p><input type="submit" name="envoyer" value="Envoyer" /></p></form><?php}else {// le formulaire a été soumis sans erreur, on envoie le mail$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";$entete .= "Return-Path: ". $email_webmaster . "\n";$entete .= "MIME-Version: 1.0";$message="Provenance : $HTTP_REFERER\n";$message.="Adresse IP : $REMOTE_ADDR,\n";$message.="Navigateur : $HTTP_USER_AGENT\n";if (@mail($email_webmaster,$titre_cache." / ".$_POST["titre"],$message.$_POST["message"],$entete)){// mail envoyéecho "Votre message a été envoyé.<br />\n";echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Envoyer un autre message...</a>\n";}else {// erreur lors de l'envoi du mailecho "Un problème s'est produit lors de l'envoi du message.\n";echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Réessayez...</a>\n";}}?>
Yoav Posté 28 Janvier 2007 Posté 28 Janvier 2007 (modifié) Je viens de tester ton script mais je crois qu'il y a un problème ... Il me dit chaque fois qu'il y a une erreur : "Un problème s'est produit lors de l'envoi du message. Réessayez... " Dommage ça à l'air super Voici l'adresse : http://www.eretz.be/contact2.php Modifié 28 Janvier 2007 par Yoav
H2V Posté 15 Février 2007 Posté 15 Février 2007 (modifié) Bonjour à toutes et à tous et merci tout d'abord pour le script qui fonctionne très bien quand utilisé "tel que". C'est quand j'essaie de la mettre à "ma sauce" que ça se complique. J'obtiens systématiquement des erreurs. Mais pourquoi ? Je séche depuis 2 heures (je précise que je ne connais rien au PHP) et j'ai besoin d'un (petit ?) coup de main.. Dans un 1er temps (et c'est déjà là que je bloque) je cherche à rajouter le nom de l'expéditeur et de le récupérer dans l'email qu'il va m'adresser. J'ai donc mis ceci dans la 1ère partie : if (isset($_POST["nom"])) { $_POST["nom"]=trim(stripslashes($_POST["nom"])); } et un peu plus bas dans cette partie toujours : elseif (empty($_POST["nom"])) {// il manque le nom de l'expéditeur $erreur="Merci de donner votre nom."; } Le contrôle semble bien s'effectuer. Dans la partie html j'ai donc rajouter un champ de cette manière : <p><label for="nom">Votre nom (obligatoire):</label><br /> <input type="text" size="40" name="nom" id="nom" value="<?php if (!empty($_POST["nom"])) {// le nom de l'expéditeur a été saisi: le réafficher echo htmlspecialchars($_POST["nom"],ENT_QUOTES); } ?>" /> </p> Pas de souci encore : tout s'affiche bien. Et c'est dans cette dernière ligne que les choses se gâtent. J'ai rajouté $_POST["nom"] ainsi : // le formulaire a été soumis sans erreur, on envoie le mail $entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n"; $entete .= "MIME-Version: 1.0"; if (@mail($email_webmaster,$_POST["nom"],$_POST["titre"],$_POST["message"],$entete)){// mail envoyé Dans ma petite tête j'étais certain que cela fonctionnerait, mais non ! À chaque fois ce que je récupère c'est le message d'erreur déclenché par le script : Un problème s'est produit lors de l'envoi du message Et je ne comprends pas du tout du tout. Quelle erreur ai-je pu commettre ? Merci d'avance pour vos réponses. Modifié 15 Février 2007 par H2V
Yoav Posté 16 Février 2007 Posté 16 Février 2007 (modifié) Si ça peut intéresser quelqu'un, j'ai traduit le formulaire en Néerlandais avec un code capcha du style 2+8= ... Il faut télécharger antispam.php et contacten.php dans le même répertoire. <?phpinclude_once("antispam.php");?><?php// Vertaling van Yoav Rheims voor www.eretz.be// n de lijn die volgt, webmaster_AT_domaine.tld door het adres e-mail van webmaster vervangen, waarnaar de berichten verzonden zullen moeten worden $email_webmaster = "e-mail van de webmaster";// Rajout alphega: In deze lijn example.com door de naam van uw plaats vervangen. Nuttig als u verschillende formulieren hebt.$titre_cache = "Sinds de site naam van jij site";// === behandeling van de gegevens van het formulier============================================================if (isset($_POST["envoyer"])){// het formulier werd voorgelegd $etat = "erreur";// Waarde per gebrek. Zal de waarde "ok" nemen als er geen fout is // --- inzet in vorm van de velden die in het formulier bij zijn indiening worden gegrepen ---if (isset($_POST["email_expediteur"])) {$_POST["email_expediteur"]=trim(stripslashes($_POST["email_expediteur"]));}if (isset($_POST["titre"])) {$_POST["titre"]=trim(stripslashes($_POST["titre"]));}if (isset($_POST["message"])) {$_POST["message"]=trim(stripslashes($_POST["message"]));}// --- test van de geldigheid van de gegrepen velden---if (empty($_POST["email_expediteur"])) {// hij mist de e-mail van de afzender $erreur="Grijpt uw adres e-mail ...";}elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){// het adres e-mail is niet geldig $erreur="Uw adres e-mail is niet geldig ...";}elseif (empty($_POST["message"])) {//het bericht is leeg $erreur="Voert een bericht in ...";}elseif (antispam_check() == false) {// de rekening is vals $erreur="Incorrect resultaat, zal opnieuw willen proberen !";}else {// --- alle velden worden juist gevuld: men zal mail kunnen verzenden ---$etat="ok";}}else {// --- het formulier werd niet voorgelegd ---$etat="attente";}// === behandelingseind van de gegevens van het formulier =======================================================?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xml:lang="nl" lang="nl" xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Contacten vertaling door Yoav Rheims voor www.eretz.be</title></head><body><?phpif ($etat!="ok"){// het formulier werd niet, voorgelegd of met een fout voorgelegdif ($etat=="erreur"){//het formulier werd met een fout voorgelegd echo "<p><strong>".$erreur."</strong></p>\n";// het bericht van fout te kennen geven }?><form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>"><p><label for="email_expediteur">Uw emailadres (Verplicht) :</label><br /><input type="text" size="40" name="email_expediteur" id="email_expediteur" value="<?phpif (!empty($_POST["email_expediteur"])) {// het adres e-mail van de afzender werd gegrepen: aangevenecho htmlspecialchars($_POST["email_expediteur"],ENT_QUOTES);}?>" /></p><p><label for="titre">Titel van het onderwerp (Facultatief) :</label><br /><input type="text" size="40" name="titre" id="titre" value="<?phpif (!empty($_POST["titre"])) {// de titel van het bericht werd ingevoerd: aangevenecho htmlspecialchars($_POST["titre"],ENT_QUOTES);}?>" /></p><p><label for="message">Onderwerp (Verplicht) :</label><br /><textarea name="message" id="message" cols="40" rows="5"><?phpif (isset($_POST["message"])) {// het bericht werd ingevoerd: aangevenecho htmlspecialchars($_POST["message"],ENT_QUOTES);}?></textarea></p><p>Rekenresultaat:</p><?php antispam_ins(); ?><p><input type="submit" name="envoyer" value="Zenden" /></p></form><?php}else {// het formulier werd zonder fout voorgelegd, men verzendt mail $entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";$entete .= "Return-Path: ". $email_webmaster . "\n";$entete .= "MIME-Version: 1.0";if (@mail($email_webmaster,$titre_cache." / ".$_POST["titre"],$_POST["message"],$entete)){// mail gezant echo "Uw bericht werd verzonden.<br />\n";echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Een ander bericht verzenden ...</a>\n";}else {// fout bij de zending van mail echo "Een probleem heeft zich bij de zending van het bericht voorgedaan.\n";echo "<a href=\"".$_SERVER["PHP_SELF"]."\">Probeert opnieuw ...</a>\n";}}?> Voici l'adresse exemple : http://yoavftp.yo.funpic.org/contacten.php Modifié 16 Février 2007 par Yoav
dorjee Posté 19 Février 2007 Posté 19 Février 2007 Je suis en train d'installer le script contact.php de alphega avec cryptographp. Cependant, je souhaiterais développer un formulaire avec davantage de champs que "message". Je bute sur la ligne d'envoi du mail : if (@mail($email_webmaster,$_POST["titre"],$_POST["message"],$entete)){ J'ai réussi à ajouter un "message2" (avec un champ textarea associé et en doublant $_POST["message"] avec $_POST["message2"]) et ça passe niveau mail. Cependant, je n'arrive pas aller au-delà. Dans mon formulaire je voudrais les champs : Nom, Prénom, Fonction, Téléphone (en text) et Adresse (en textarea). Comment faire pour envoyer par mail toutes ces variables ? De plus, comment envoyer aussi des chaînes d'intitulés, pour recevoir mon mail avec, par exemple : Nom : Dupont Prénom : Jean Téléphone : 05 00 00 00 00 00 et ainsi de suite... Peut-on concaténer tout ça dans une seule variable "message" y compris les retours à la ligne ? Et comment ? Je ne suis pas connaisseur en PHP, mais je chipote le code... Merci pour éventuelle réponse.
alphega Posté 19 Février 2007 Auteur Posté 19 Février 2007 Bonjour, Vous avez de la chance car je ne m'y connais pas énormément mais j'ai juste trouvé comment faire ceci il y a 3 jours lorsque j'ai eu besoin de rajouter un champ, plus exactement, dans mon cas, l'envoi d'un pseudo. Ca vous aidera certainement pour ce que vous souhaitez obtenir. Voici ce que j'ai fait: 1- Rajout du champ pseudo (les parties rajoutées sont en gras): <p><label for="titre">Titre de message (facultatif):</label><br /><input type="text" size="50" name="titre" id="titre" value="<?php if (!empty($_POST["titre"])) { // le titre du message a été saisi: le réafficher echo htmlspecialchars($_POST["titre"],ENT_QUOTES); } ?>" /> </p> <p><label for="titre">Votre pseudo (facultatif):</label><br /> <input type="text" size="50" name="pseudo" id="pseudo" value="<?php if (!empty($_POST["pseudo"])) { // le titre du message a été saisi: le réafficher echo htmlspecialchars($_POST["pseudo"],ENT_QUOTES); } ?>" /> </p> <p><label for="message">Message (obligatoire):</label><br /> <textarea name="message" id="message" cols="60" rows="5"><?php if (isset($_POST["message"])) { // le message a été saisi: le réafficher echo htmlspecialchars($_POST["message"],ENT_QUOTES); } ?></textarea> </p> 2- Récupération du pseudo dans "$message" et aussi de l'ip, du referer et de l'agent utilisateur grace au message précédent de "bed" que j'ai modifié car ça ne fonctionnait pas (les modifs sont en gras également): // le formulaire a été soumis sans erreur, on envoie le mail$entete = "From: ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n"; $entete .= "Return-Path: ". $email_webmaster . "\n"; $entete .= "MIME-Version: 1.0"; $message="Provenance: ". $_SERVER['HTTP_REFERER'] . "\n"; $message.="Adresse IP: ". $_SERVER['REMOTE_ADDR'] . "\n"; $message.="Navigateur: ". $_SERVER['HTTP_USER_AGENT'] . "\n"; $message.="Pseudo: ". $_POST["pseudo"] . "\n\n"; 3- envoi du message: if (@mail($email_webmaster,$titre_cache." / ".$_POST["titre"],$message.$_POST["message"],$entete)){// mail envoyé J'ai réussi ceci en observant un peu les messages de tout le monde encore une fois. Merci à tous d'ailleurs, j'ai maintenant un formulaire super complet avec un captcha accessible, ip du posteur etc...
dorjee Posté 20 Février 2007 Posté 20 Février 2007 Un grand merci, ça va aussi m'être d'une grande aide, bravo Je vais tester ça dans la journée.
dorjee Posté 20 Février 2007 Posté 20 Février 2007 Oui, merci alphega pour cette superbe amélioration. J'ai eu un sale ralentissement php chez mon fournisseur dans la journée, mais ce soir ça roule et ton script fait des merveilles J'ai aussi fait des petites améliorations et je vais faire un peu de didactique pour les newbees qui passeraient par là (étant donné la position sur Google, doit y avoir du monde). Donc... A partir du scrypt de base de alphega que l'on trouve en page 1 de cette série de posts, pour ajouter des champs de formulaire il suffit de répliquer le morceau de script suivant dans la page html autant de fois que de champs nécessaires et voulus. Le morceau en question : <label for="nom">Item :</label></td><td ><input type="text" size="60" name="item" id="item" value="<?phpif (!empty($_POST["item"])) {// le item de l'expéditeur a été saisi : le réafficherecho htmlspecialchars($_POST["item"],ENT_QUOTES);}?>" /> Vous remplacez "item" par ce dont vous avez besoin pour votre formulaire (nom, prenom, telephone, e-mail, etc.). ça c'est pour des champs text. Maintenant pour un textarea multiligne : <label for="message">Message* :</label></td> <td ><textarea name="message" id="message" cols="45" rows="5"><?phpif (isset($_POST["message"])) {// le message a été saisi: le réafficherecho htmlspecialchars($_POST["message"],ENT_QUOTES);}?></textarea> Là j'ai laissé le nom de l'item "message", car généralement un champ textarea sert pour la partie "message" d'un formulaire. Mais vous pouvez y mettre ce que vous voulez bien entendu. Ensuite, on passe aux contrôles de sécurité et validation. Dans la partie "haute" du script de alphega, celle qui se trouve au-dessus du code HTML (au dessus de "<!DOCTYPE html PUBLIC ..."), pour chaque champ de votre formulaire vous devez ajouter ceci : if (isset($_POST["item"])) {$_POST["item"]=trim(stripslashes($_POST["item"]));} Je ne connais pas grand chose à PHP, mais je suppose (c'est "trim", qui me rappelle VBasic qui m'y fait penser), je suppose que ça enlève les slashes, voire les antislashes du contenu du champ, afin d'éviter le passage de codes malicieux par là. Enfin, alphega l'a mis, faut le mettre Là encore, remplacer "item" par l'identité du champ en question (nom, prenom, telephone, etc.). Donc faire ça pour chaque champ de formulaire. Ensuite, pour chaque champ obligatoire ajouter ceci : if (empty($_POST["item"])) {// le item est vide$erreur="Saisissez votre item...";} Là, fastoche à comprendre, c'est pour obliger à remplir un champ avant d'envoyer le formulaire. Donc à n'utliser que pour les champs qui doivent être obligatoirement remplis (par exemple, l'adresse e-mail de l'expéditeur, qu'on puisse lui répondre). A noter que pour les deux morceaux de scripts ci-dessus, il vaut mieux les mettre dans le même ordre que l'ordre des champs de formulaire dans la page. A présent, retour en bas de page HTML, vers le code formulaire. La petite amélioration que j'ai ajoutée concerne le titre du message. En effet, un message de formulaire n'étant pas un e-mail à proprement parler, l'utilisateur se fout de mettre un titre. Par contre, le webmaster qui va recevoir le message voudrait bien recevoir des titres standardisés, qui lui disent aussitôt de quel formulaire de son site vient le message (par exemple, "Formulaire d'inscription", "Formulaire de commande", etc.). C'est pour cela que la variable titre n'est plus nourrie par un champ de formulaire, mais par une variable cachée (hidden) à laquelle l'utilisateur ne touche pas et qui est propre au formulaire. La voici, à placer juste sous la balise "<form method="post"..." : <input type="hidden" id="titre" name="titre" value="Formulaire de contact"> Voilà, à la place de "Formulaire de contact" vous mettez ce que vous voulez et ça s'affichera dans le titre du mail que vous recevrez. On arrive à la fin, dans la partie, tout en bas, du script pour envoyer le formulaire, je donne un exemple complet correspondant à un formulaire de contact avec nom, prénom, fonction, téléphone et message. En fait, on ajoute (ou retranche ou change) autant d'items que l'on veut. $entete = "From : ".$_POST["email_expediteur"]." <".$_POST["email_expediteur"].">\n";$entete .= "MIME-Version: 1.0";$message="Provenance : ". $_SERVER['HTTP_REFERER'] . "\n";$message.="Adresse IP : ". $_SERVER['REMOTE_ADDR'] . "\n";$message.="Navigateur : ". $_SERVER['HTTP_USER_AGENT'] . "\n";$message.="Nom : ". $_POST["nom"] . "\n";$message.="Prénom : ". $_POST["prenom"] . "\n";$message.="Fonction : ". $_POST["fonction"] . "\n";$message.="Téléphone : ". $_POST["telephone"] . "\n\n";$message.="Message : ";if (@mail($email_webmaster,$_POST["titre"],$message.$_POST["message"],$entete)){ Quelques explications pour ceux qui connaissent pas. Les "\n" sont des retours à la ligne qui s'effectueront dans le message mail que vous recevrez. "Nom : ", etc. sont des intitulés des informations transmises (par exemple, dans votre message vous verrez "Nom : Dupont"). A ce propos, j'ai ajouté en dernier "Message : ", ce qui donne un intitulé à la partie "message" du mail. Que c'est pas beau de fignoler comme ça Voilà, je reviendrais certainement lorsque je testerai les cases à cocher et les listes de sélection... A bientôt et merci à tous.
dorjee Posté 21 Février 2007 Posté 21 Février 2007 Désolé, dans les deux premiers codes ci-dessus il traîne des balises de table "</td><td >" à enlever (ou bien mettre <tr><td> au début et </td></tr> à la fin pour avoir deux belles cellules de tableau, à encadrer par <table></table> bien sûr !).
dorjee Posté 21 Février 2007 Posté 21 Février 2007 Me revoilà avec donc de nouveaux champs de formulaire. Tout d'abord des bouton radio (un seul choix possible). Pour faire ça je me suis inspiré du code donné par Norbert_404, ce qui donne : Veuillez choisir :<br><input type="radio" name="choix" id="choix1" value="<?php echo htmlspecialchars("A");?>" checked /><label for="choix1">A</label> <input type="radio" name="choix" id="choix2" value="<?php echo htmlspecialchars("B");?>" /><label for="choix2">B</label> <input type="radio" name="choix" id="choix3" value="<?php echo htmlspecialchars("C");?>" /><label for="choix3">C</label> Le visiteur a le choix dans cet exemple (à adapter bien sûr à vos besoins) entre 3 options : A, B ou C. Vous remarquerez la fameuse balise <label> (qui renvoie à l'id du champ) que j'ai découverte grâce à alphega ( ) et qui renforce l'ergonomie d'un formulaire, car le visiteur, surtout dans le cas des boutons radio (ou les checkbox) n'a pas besoin de passer une épreuve de psychomotricité fine en visant le petit rond (ou la petite case), mais peut simplement cliquer sur le texte d'option qui voisine avec le bouton radio (pitié pour les mal voyants). Concernant le formatage il n'y en a pas pour un bouton radio (comment passer un antislash par un bouton radio, hein ? A ce propos, le "stripslashes" c'est pour retirer les anti-slashes d'une chaîne de caractères). Pas non plus de test de remplissage (je suppose qu'on pourrait en faire un du style "au moins un choix doit être fait"), le plus simple étant de forcer un choix avec "checked" (j'ai, dans mon exemple, forcé l'option A), libre au visiteur de changer de choix. Pour ce qui concerne l'envoi du formulaire, j'ai utilisé la ligne suivante : $message.="Choix du visiteur : ". $_POST["choix"] . "\n"; tout simplement ! Et dans le message mail reçu j'obtiens bien A, B ou C en fonction du bouton coché par le visiteur. Passons à une case à cocher. J'ai suivi le même principe, ce qui donne : <input type="checkbox" name="acceptation" id="acceptation" value="<?php echo htmlspecialchars("Accepté");?>" /> <label for="acceptation">J'accepte</label> Ici, le visiteur peut cocher une case d'acceptation (de ce que vous voulez). Toujours l'ergonomie <label>, voir ci-dessus. Pour l'envoi cela donne : $message.="Acceptation par le visiteur : ". $_POST["acceptation"]; Ainsi, dans le mail reçu si pas coché y'a rien, sinon je vois "Accepté". Enfin, à noter une petite modif de la ligne de commande "@mail", puisque dans mon formulaire il n'y a que des champs text, boutons radio et checkbox et plus de message, donc ceci : if (@mail($email_webmaster,$_POST["titre"],$message.$_POST["message"],$entete)){ devient : if (@mail($email_webmaster,$_POST["titre"],$message,$entete)){ Au passage, dans le cas de l'utilisation du textarea "message" je suis d'ailleur en train de me demander si on ne peut pas tout simplement ajouter "message" dans $message et se passer ainsi d'envoyer $_POST["message"]. ça doit être possible, hein alphega ? ******************************* Voilà, il me reste deux questions, pour alphega justement (ou un autre tout aussi performant...). 1) J'ai deux champs text pour une adresse e-mail et sa confirmation, donc je voudrais pouvoir insérer un test qui vérifie que "email_expediteur" est bien == à "re_email_expediteur" avec message d'erreur assorti, si ce n'est pas le cas. 2) concernant la case à cocher d'acceptation, là encore comment tester qu'elle est bien cochée et obliger cette coche pour l'envoi du formulaire ? A vous de jouer
alphega Posté 21 Février 2007 Auteur Posté 21 Février 2007 Je ne suis pas assez calé pour te répondre à propos de ces modifications mais je suis sur qu'avec tout ce que compte le hub en bidouilleurs de haut vol, tu devrais trouver des réponses. En tout cas merci pour ton récapitulatif car je crois que j'avais oublié le passage des "stripslashes" pour le rajout d'un champ
dorjee Posté 22 Février 2007 Posté 22 Février 2007 (modifié) Déjà une réponse concernant le test d'égalité entre deux variables (deux champs du formulaire donc). Soit les deux champs à tester "email_expediteur" et "re_email_expediteur" (on demande au visiteur de ré-écrire son e-mail à l'identique, pour vérification). Le code de test est le suivant : elseif (empty($_POST["email_expediteur"])) {// l'e-mail est vide$erreur="Saisissez votre e-mail...";}elseif (!eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\.[a-z]{2,4}$",$_POST["email_expediteur"])){// l'adresse e-mail n'est pas valide$erreur="Votre adresse e-mail n'est pas valide...";}elseif (empty($_POST["re_email_expediteur"])) {// l'e-mail répétée est vide$erreur="Re-saisissez votre e-mail...";}elseif ($_POST["email_expediteur"] !== $_POST["re_email_expediteur"]) {// les e-mails ne sont pas identiques$erreur="Re-saisissez votre e-mail à l'identique...";} Soit 4 tests : vérifier que le premier champ e-mail contient quelque chose (pas vide) dans ce cas vérifier sa validité (format xxx_AT_xxx) vérifier que le deuxième champ e-mail contient quelque chose (pas vide) et c'est là qu'apparaît le test d'égalité avec l'opérateur "!==" qui veut dire "différent" et si les deux adresses mail saisies sont différentes alors on renvoie le message d'erreur Modifié 22 Février 2007 par dorjee
H2V Posté 22 Février 2007 Posté 22 Février 2007 Bonjour Je voulais vous remercier tous les 2 parce que 1/ j'ai appris beaucoup de choses et 2/ grâce à vous j'ai réussi à mettre en place ce sacré formulaire qui me faisait tourner en bourique depuis quelques jours. Reste plus qu'à le mettre en forme pour qu'il soit un peu plus sexy. Merci encore. H2V
OBIT Posté 6 Mars 2007 Posté 6 Mars 2007 Bravo à tous - Je viens juste de m'inscrire sur Hub et en quelques heures j'ai pu mettre en place le formulaire. Je ne connais vraiment rien au développement et m'arrachais les cheveux pour savoir comment mettre en place un formulaire de contact. Le votre est simple, Le code est propre et en plus vous avez vraiment bien réfléchi la sécurité. Je suis étonné de ne pas trouver de démo de vos travaux alors j'ajoute un lien sur lequel je vais mettre le formulaire avec : Chekbox adresse ip nom e mail (dans l'entête + le message pour être à mon goût) J'ai choisi la méthode de calcul simple et efficace. Notes : - Malheureusement pour le calcul les résultats négatifs doivent obligatoirement être inscrits sous cette forme : Ex : -6 et non - 6 Je conseille donc de prévenir les internautes. - On pourrait compléter par l'envoi d'un mail de confirmation sympathique à l'expéditeur. (ce qui permet à l'internaute la vérification de validité de son mail...) - Une extension (qu'on trouve peut-être ailleurs sur le site): une boite dialogue interne avec les clients pour les réponses (ex: Amen ou Xiti) avec alerte mail automatique à l'internaute - ça évite aux mails de se balader et de diminuer totalement les spams et messages abusifs. Malheureusement, je ne connais rien au développement, je ne peux que lancer des idées... Démo Formulaire
dorjee Posté 6 Mars 2007 Posté 6 Mars 2007 Merci pour les remerciements ! Je posterai bientôt l'url du site sur lequel je travaille et où on verra les formulaires en question... a+
adn Posté 19 Mars 2007 Posté 19 Mars 2007 (modifié) Hello, J'aime bien l'idée de l'addition que je viens d'implémenter J'ai fait une variante de byc qui me semble plus simple. En fait, a la place de la fonction de décodage, je mets dans la value de l'input "asb" le resultat de l'opération passé à md5(). A la reception du formulaire je n'ai plus qu'a tester l'égalité md5($asa) == $asb Pour compliqué un peu on peut ajouter une valeur fixe au calcul. Modifié 19 Mars 2007 par adn
H2V Posté 19 Mars 2007 Posté 19 Mars 2007 Hello ayant reçu sur le weekend 63 spams dans ma boîte à lettres provenant de mes formulaires je viens de mettre le captcha de calcul de byc que je tiens à remercier. @ adn : n'étant pas compétent je n'ai pas compris mais je suivrais vos discussions à ce propos. Bonne journée
adn Posté 19 Mars 2007 Posté 19 Mars 2007 Hello, Voici le code (noter que, j'ai limité l'opération a une addition): <? $operateur = array("+", "-"); $alpha = rand(1, 10); $op = rand(0, 0); $beta = rand(1, 10); $res = md5($alpha + $beta); // pour compliquer on peut ajouter une constante au calcul?>(Contre le spam) <? echo $alpha." ".$operateur[$op]." ".$beta." = "; ?><input name="asa" type="text" size="10" value="" /><input type="hidden" name="asb" value="<? echo $res; ?>" /> A la reception du formulaire, tester: md5($asa) != $asb
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant