Formulaires HTML. Méthodes d'envoi de données au serveur à l'aide d'un formulaire. La forme la plus simple d'envoi de données par e-mail en utilisant HTML et PHP
L'une des fonctions les plus appréciées du site est le formulaire de candidature ou de commande, dont les données sont envoyées par e-mail au propriétaire du site. En règle générale, ces formulaires sont simples et se composent de deux ou trois champs de saisie des données. Comment créer un tel bon de commande ? Cela nécessite l'utilisation du langage de balisage HTML et du langage de programmation PHP.
Le langage de balisage HTML lui-même est simple : il vous suffit de comprendre comment et où placer certaines balises. Avec le langage de programmation PHP, les choses sont un peu plus compliquées.
Pour un programmeur, créer un tel formulaire n'est pas difficile, mais pour un concepteur de mise en page HTML, certaines actions peuvent sembler difficiles.
Créer un formulaire de soumission de données en HTML
La première ligne sera la suivante
Maintenant, rassemblons tout.
Rendons maintenant les champs du formulaire obligatoires. Nous avons le code suivant :
Créez un fichier qui accepte les données du formulaire HTML
Ce sera un fichier appelé send.php
Dans le fichier, dans un premier temps, vous devez accepter les données du tableau post. Pour ce faire, nous créons deux variables :
$fio = $_POST["fio"];
$email = $_POST["email"];
Les noms de variables en PHP sont précédés du signe $ et un point-virgule est placé à la fin de chaque ligne. $_POST est un tableau dans lequel les données du formulaire sont envoyées. Dans le formulaire HTML, la méthode d'envoi est spécifiée comme method="post". Ainsi, deux variables du formulaire HTML sont acceptées. Pour protéger votre site, vous devez faire passer ces variables à travers plusieurs filtres – fonctions php.
La première fonction convertira tous les caractères que l'utilisateur tentera d'ajouter au formulaire :
Dans ce cas, de nouvelles variables ne sont pas créées en php, mais celles existantes sont utilisées. Ce que le filtre va faire, c'est transformer le caractère "<" в "<". Также он поступить с другими символами, встречающимися в html коде.
La deuxième fonction décode l'URL si l'utilisateur tente de l'ajouter au formulaire.
$fio = urldecode($fio);
$email = urldecode($email);
Avec la troisième fonction, nous supprimerons les espaces du début et de la fin de la ligne, le cas échéant :
$fio = trim($fio);
$email = trim($email);
Il existe d'autres fonctions qui vous permettent de filtrer les variables php. Leur utilisation dépend de votre crainte qu'un attaquant tente d'ajouter du code de programme à ce formulaire de soumission par courrier électronique HTML.
Validation des données transférées du formulaire HTML vers le fichier PHP
Afin de vérifier si ce code fonctionne et si des données sont en cours de transfert, vous pouvez simplement l'afficher à l'écran grâce à la fonction écho :
écho $fio;
écho "
";
écho $fio;
La deuxième ligne ici est nécessaire pour séparer la sortie des variables php en différentes lignes.
Envoi des données reçues d'un formulaire HTML vers un e-mail en utilisant PHP
Pour envoyer des données par email, vous devez utiliser la fonction mail de PHP.
mail("à quelle adresse envoyer", "sujet de la lettre", "Message (corps de la lettre)","De : à partir de quel email la lettre est envoyée \r\n");
Par exemple, vous devez envoyer des données à l'adresse e-mail du propriétaire ou du gestionnaire du site [email protégé].
Le sujet de la lettre doit être clair et le message de la lettre doit contenir ce que l'utilisateur a spécifié dans le formulaire HTML.
mail(" [email protégé]", "Application du site", "Nom complet :".$fio.". E-mail : ".$email ,"De : [email protégé]\r\n");
Il est nécessaire d'ajouter une condition qui vérifiera si le formulaire a été envoyé en PHP à l'adresse email indiquée.
si (mail(" [email protégé]", "Commander sur le site", "Nom complet :".$fio.". E-mail : ".$email ,"De : [email protégé]\r\n"))
{
echo "message envoyé avec succès" ;
) autre (
}
Ainsi, le code du programme du fichier send.php, qui enverra les données du formulaire HTML par courrier électronique, ressemblera à ceci :
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
//écho $fio;
//écho "
";
//écho $email;
si (mail(" [email protégé]", "Application du site", "Nom complet :".$fio.". E-mail : ".$email ,"De : [email protégé]\r\n"))
( echo "message envoyé avec succès";
) autre (
echo "des erreurs se sont produites lors de l'envoi du message";
}?>
Trois lignes permettant de vérifier si les données sont en cours de transfert vers le fichier sont commentées. Si nécessaire, ils peuvent être supprimés, car ils n'étaient nécessaires que pour le débogage.
Nous plaçons le code HTML et PHP pour soumettre le formulaire dans un seul fichier
Dans les commentaires de cet article, de nombreuses personnes se demandent comment s'assurer que le formulaire HTML et le code PHP pour l'envoi de données par courrier électronique se trouvent dans un seul fichier, et non deux.
Pour mettre en œuvre ce travail, vous devez placer le code HTML du formulaire dans le fichier send.php et ajouter une condition qui vérifiera la présence de variables dans le tableau POST (ce tableau est envoyé depuis le formulaire). Autrement dit, si les variables du tableau n'existent pas, vous devez alors montrer le formulaire à l'utilisateur. Sinon, vous devez recevoir les données du tableau et les envoyer au destinataire.
Voyons comment changer le code PHP dans le fichier send.php :
// vérifie si des variables existent dans le tableau POST
if(!isset($_POST["fio"]) et !isset($_POST["email"]))(
?> ) autre (
//afficher le formulaire
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$fio = trim($fio);
$email = trim($email);
si (courrier(" [email protégé]", "Application du site", "Nom complet :".$fio.". E-mail : ".$email ,"De : [email protégé]\r\n"))(
echo "Message envoyé avec succès" ;
) autre (
echo "Des erreurs se sont produites lors de l'envoi du message";
}
}
?>
On vérifie l'existence d'une variable dans le tableau POST avec la fonction PHP isset(). Un point d'exclamation devant cette fonction dans une condition signifie négation. Autrement dit, si la variable n'existe pas, nous devons alors afficher notre formulaire. Si je n’avais pas mis de point d’exclamation, la condition signifierait littéralement « si elle existe, alors affichez le formulaire ». Et c'est faux dans notre cas. Naturellement, vous pouvez le renommer index.php. Si vous renommez le fichier, n'oubliez pas de renommer le nom du fichier dans la ligne
En enregistrant ce code dans un fichier HTML et en l'affichant à l'aide de votre navigateur préféré, vous verrez un formulaire HTML familier :
Étiqueter
- action - spécifie l'URL (complète ou relative) à laquelle le formulaire sera envoyé.
- Si cet attribut n'est pas spécifié, la plupart des navigateurs (plus précisément, tous les navigateurs que je connais) envoient le formulaire au document en cours, c'est-à-dire « à lui-même ». Il s'agit d'un raccourci pratique, mais selon la norme HTML, l'attribut action est requis.
- méthode - méthode de soumission du formulaire. Il y en a deux.
GET - envoi des données du formulaire dans la barre d'adresse. Vous avez peut-être remarqué sur différents sites Internet la présence d'un "?" à la fin de l'URL. et les données suivantes au format paramètre=valeur. Ici le « paramètre » correspond à la valeur de l’attribut name des éléments du formulaire (voir ci-dessous à propos de la balise ).
), et « valeur » est le contenu de l'attribut valeur (par exemple, il contient la saisie de l'utilisateur dans le champ de texte de la même balise - Par exemple, essayez de rechercher quelque chose dans Yandex et faites attention à la barre d'adresse de votre navigateur.
- méthode - méthode de soumission du formulaire. Il y en a deux.
Étiqueter POST - les données du formulaire sont envoyées dans le corps de la demande. Si ce dont il s’agit n’est pas tout à fait clair (ou pas du tout clair), ne vous inquiétez pas, nous reviendrons bientôt sur ce problème.
- Si l'attribut de méthode n'est pas spécifié, GET est supposé.
- - spécifie un élément de formulaire défini par l'attribut type :
La valeur "texte" spécifie un champ de saisie de texte sur une seule ligne La valeur "submit" spécifie un bouton qui, lorsqu'on clique dessus, envoie le formulaire au serveur
D'autres valeurs sont possibles (et
- - pas la seule balise qui spécifie un élément de formulaire).
- Alors que se passe-t-il lorsque nous cliquons sur « OK » ?
Le navigateur examine les éléments inclus dans le formulaire et construit les données du formulaire à partir de leurs attributs de nom et de valeur. - Disons que le nom Vasya est entré. Dans ce cas, les données du formulaire sont name=Vasya&okbutton=OK
- Le navigateur établit une connexion avec le serveur, envoie au serveur une demande pour le document spécifié dans l'attribut action de la balise
, en utilisant la méthode d'envoi de données spécifiée dans l'attribut de méthode (dans ce cas - GET), en transmettant les données du formulaire dans la requête.
Le serveur analyse la requête reçue, génère une réponse, l'envoie au navigateur et ferme la connexion
Comme vous l'avez probablement déjà deviné, cliquer sur le bouton Soumettre d'un formulaire avec une méthode de soumission « GET » revient à taper l'URL correspondante (avec un point d'interrogation et les données du formulaire à la fin) dans la barre d'adresse du navigateur :
Http://www.example.com/cgi-bin/form_handler.cgi?name=Vasya&okbutton=OK
En effet, la méthode GET est utilisée chaque fois que vous demandez un document au serveur en saisissant simplement son URL ou en cliquant sur un lien. Lors de l'utilisation
Peut-être que tous ces détails techniques et exercices avec telnet vous semblent incroyablement ennuyeux et même inutiles (« qu'est-ce que PHP a à voir avec ça ? »). Mais en vain. :) Ce sont les bases du travail avec le protocole HTTP, que tout programmeur Web doit connaître par cœur, et ce ne sont pas des connaissances théoriques - tout cela sera utile dans la pratique.
Remplaçons maintenant la première ligne de notre formulaire par ce qui suit :
Nous avons spécifié la méthode d'envoi comme "POST". Dans ce cas, les données sont envoyées au serveur d'une manière légèrement différente :
Telnet www.example.com 80 POST /cgi-bin/form_handler.cgi HTTP/1.0\r\n Hôte : www.example.com\r\n Type de contenu : application/x-www-form-urlencoded\r\ n Longueur du contenu : 41263\r\n \r\n name=Vasya&okbutton=OK
Lors de l'utilisation de la méthode POST, les données du formulaire sont envoyées après « deux entrées » - dans le corps de la demande. Tout ce qui précède est en fait l'en-tête de la requête (et lorsque nous avons utilisé la méthode GET, les données du formulaire ont été envoyées dans l'en-tête). Pour que le serveur sache à quel octet arrêter de lire le corps de la requête, l'en-tête contient la ligne Content-Length ; que les données du formulaire seront transmises sous la forme paramètre1=valeur1¶mètre2=valeur2... , et les valeurs seront transmises sous forme de code urlen - c'est-à-dire exactement la même chose qu'en utilisant la méthode GET, mais dans le corps du request - l'en-tête Content informe le serveur -Type: application/x-www-form-urlencoded .
L'avantage de la méthode POST est qu'il n'y a aucune limite sur la longueur de la ligne de données du formulaire.
Lorsque vous utilisez la méthode POST, il n'est pas possible de soumettre le formulaire en "suivant simplement un lien" comme vous le feriez avec GET .
Lors de l'utilisation d'un formulaire POST, dans son attribut action vous pouvez préciser après le point d'interrogation les paramètres du formulaire GET. Ainsi, la méthode POST inclut la méthode GET.
Tableaux $_GET et $_POST
Ainsi, les formulaires sont le principal moyen d'échange de données entre un serveur Web et un navigateur, c'est-à-dire qu'ils permettent une interaction avec l'utilisateur - en fait, à quoi sert la programmation Web.
Regardons un exemple simple :
si ($_SERVER [ "REQUEST_METHOD" ] == "POST" ) (
écho "
Bonjour, " . $_POST [ "nom" ] . "
!" ;}
?>
Entrez votre nom :
Le formulaire affiché aux lignes 8 à 12 contient deux éléments : nom et bouton ok. L'attribut méthode spécifie la méthode de soumission du formulaire POST, tandis que l'attribut action spécifie l'URL à laquelle le formulaire est envoyé et est rempli avec la valeur de la variable serveur PHP_SELF - l'adresse du script en cours d'exécution.
=$_SERVER["PHP_SELF"]?>- forme abrégée pour echo $_SERVER["PHP_SELF"]; ?> .
Supposons que nous ayons entré la valeur Vasya dans le champ du nom et cliqué sur le bouton OK. Dans ce cas, le navigateur envoie une requête POST au serveur. Corps de la requête : name=Vasya&okbutton=OK . PHP remplit automatiquement le tableau $_POST :
$_POST ["nom" ] = "Vasia"
$_POST ["okbouton" ] = "OK"
En réalité, la valeur « Vasya » est envoyée par le navigateur sous forme d'urlencode ; pour l'encodage Windows-1251, cette valeur ressemble à %C2%E0%F1%FF . Mais comme PHP gère automatiquement le décodage nécessaire, nous pouvons "oublier" cette fonctionnalité - jusqu'à ce que nous devions traiter manuellement les requêtes HTTP.
Étant donné que le corps de la requête spécifie uniquement les noms et les valeurs, mais pas les types d'éléments de formulaire, PHP ne sait pas si $_POST["name"] correspond à une chaîne d'entrée, un bouton ou une zone de liste. Mais nous, en général, n’avons pas du tout besoin de ces informations. :)
Puisque nous n'avons pas besoin de savoir ce que dit le bouton Soumettre, nous pouvons supprimer l'attribut name à la ligne 11, en raccourcissant la description du bouton à . Dans ce cas, le navigateur enverra une requête POST name=Vasya.
Et maintenant la même chose, mais pour le formulaire GET :
if (isset($_GET [ "nom" ])) (
écho "
Bonjour, " . $_GET [ "nom" ] . "
!" ;}
?>
Entrez votre nom :
A la ligne 8, on pourrait tout aussi bien écrire
PHP fait la même chose avec les formulaires GET qu'avec POST, à la différence que le tableau $_GET est rempli.
La différence cardinale se situe à la ligne 4. Puisque la simple saisie de l'adresse dans la ligne du navigateur est une requête GET, la vérification si ($_SERVER["REQUEST_METHOD"] == "GET") n'a aucun sens. Par conséquent, nous recourons à la construction isset(), qui renvoie vrai si la variable est définie (c'est-à-dire qu'une valeur lui a été attribuée) et faux si la variable n'est pas définie. Si le formulaire a été rempli - comme vous l'avez déjà compris, PHP attribue automatiquement à $_GET["name"] la valeur appropriée.
La méthode de vérification utilisant isset() est universelle ; elle pourrait également être utilisée pour un formulaire POST. De plus, c’est préférable car cela permet de savoir quels champs du formulaire sont remplis.
Un exemple un peu plus complexe.
echo "Veuillez entrer un nom !
" ;
< 1900 || $_POST [ "year" ] > 2004 ) {
écho
" ;
) autre (
" ;
echo "À toi " . $âge . " années
" ;
}
écho "
" ;
}
?>
Entrez votre nom :
Entrez votre année de naissance :
Aucune nouvelle technique n’est utilisée ici. Comprenez-le, exécutez le code, essayez de modifier...
Modifions le dernier exemple pour que l'utilisateur n'ait pas à remplir à nouveau les champs. Pour ce faire, remplissez les attributs de valeur des éléments du formulaire avec les valeurs que nous venons de saisir.
$nom = isset($_POST [ "nom" ]) ? $_POST [ "nom" ] : "" ;
$année = isset($_POST [ "année" ]) ? $_POST [ "année" ] : "" ;
Si (isset($_POST [ "nom" ], $_POST [ "année" ])) (
if ($_POST [ "nom" ] == "" ) (
echo "Veuillez entrer un nom !
"
;
) sinon si ($_POST [ "année" ]<
1900
||
$_POST
[
"year"
] >
2004
) {
écho "Veuillez préciser l'année de naissance ! Plage de valeurs valide : 1900..2004
"
;
) autre (
echo "Bonjour, " . $_POST [ "nom" ] . " !
"
;
$age = 2004 - $_POST [ "année" ];
echo "À toi " . $âge . " années
"
;
}
écho "
" ;
}
?>
Entrez votre nom :
Entrez votre année de naissance :
Les lignes 4 et 5 peuvent prêter à confusion. Tout est très simple : la ligne 4 pourrait s'écrire ainsi :
if (isset($_POST [ "nom" ]))
$nom = $_POST ["nom" ];
autre
$nom = "" ;
La question peut se poser : pourquoi ne pas supprimer les lignes 4 et 5 et écrire :
Entrez votre nom :
">
Entrez votre année de naissance :
">
Le fait est que si ces variables POST ne sont pas définies - et ce sera le cas si le formulaire n'a pas encore été rempli - PHP émettra des avertissements sur l'utilisation de variables non initialisées (et tout à fait raisonnablement : un tel message permet de rapidement trouver des fautes de frappe difficiles à détecter dans les noms de variables, et met également en garde contre d'éventuels « trous » sur le site). Vous pouvez bien sûr mettre le code isset directement dans le formulaire, mais cela sera trop fastidieux.
J'ai compris? Essayez maintenant de trouver l'erreur dans le code donné. Eh bien, ce n’est pas exactement une erreur, mais un défaut.
htmlspecialchars()
Vous ne l'avez pas trouvé ? Je vais vous donner un indice. Entrez, par exemple, dans le champ « nom » un guillemet double et du texte, par exemple « Va ». Envoyez le formulaire et jetez un œil au code source de la page résultante. La quatrième ligne aura quelque chose comme :
Entrez votre nom :
Autrement dit, rien de bon. Et si un utilisateur rusé saisissait du code JavaScript ?
Pour résoudre ce problème, vous devez utiliser la fonction htmlspecialchars(), qui remplacera les caractères spéciaux par leur représentation HTML (par exemple, un guillemet avec ") :
$nom = isset($_POST [ "nom" ]) ? htmlspecialchars ($_POST [ "nom" ]) : "" ;
$année = isset($_POST [ "année" ]) ? htmlspecialchars ($_POST [ "année" ]) : "" ;
Si (isset($_POST [ "nom" ], $_POST [ "année" ])) (
if ($_POST [ "nom" ] == "" ) (
echo "Veuillez entrer un nom !
"
;
) sinon si ($_POST [ "année" ]<
1900
||
$_POST
[
"year"
] >
2004
) {
écho "Veuillez préciser l'année de naissance ! Plage de valeurs valide : 1900..2004
"
;
) autre (
echo "Bonjour, " . $nom . " !
"
;
$age = 2004 - $_POST [ "année" ];
echo "À toi " . $âge . " années
"
;
}
écho "
" ;
}
?>
Entrez votre nom :
Entrez votre année de naissance :
Répétez l'expérience et assurez-vous que le code HTML est désormais correct.
N'oubliez pas : la fonction htmlspecialchars() doit être utilisée lors de l'affichage du contenu d'une variable pouvant contenir des caractères spéciaux HTML.
phpinfo()
La fonction phpinfo() est l’une des plus importantes de PHP. Il affiche des informations sur les paramètres PHP, les valeurs de diverses variables de configuration...
Pourquoi est-ce que j'en parle dans un article sur les formulaires ? phpinfo() est un outil de débogage pratique. phpinfo(), entre autres, imprime les valeurs de toutes les variables $_GET, $_POST et $_SERVER. Ainsi, si une variable de formulaire est perdue, le moyen le plus simple de découvrir ce qui ne va pas est d'utiliser la fonction phpinfo(). Pour garantir que la fonction affiche uniquement les valeurs des variables (et sans que vous ayez à faire défiler des dizaines de pages), il convient de l'appeler ainsi : phpinfo(INFO_VARIABLES) ; , ou - ce qui est absolument la même chose - phpinfo(32) ;.
Entrez votre nom :
phpinfo(32);
?>
Ou, par exemple, cette situation : vous souhaitez connaître l'adresse IP d'un visiteur. Vous vous souvenez que la variable correspondante est stockée dans le tableau $_SERVER, mais - pas de chance - vous avez oublié comment s'appelle exactement la variable. Encore une fois, appelez phpinfo(32) ; , recherchez votre adresse IP dans le signe et trouvez-la dans la ligne $_SERVER["REMOTE_ADDR"] .
/php/php5ru.png HTTP/1.0
: www.php5.ru
Ce que vous verriez si vous voyiez ceci clignotera sur l'écran png-fichier dans un éditeur de texte.
Formulaires HTML. Méthodes d'envoi de données au serveur à l'aide d'un formulaire
L'une des applications les plus courantes de tout langage de script serveur est le traitement HTML- les formulaires. La programmation Web implique principalement le traitement de diverses entrées utilisateur.
RNR facilite la tâche de traitement et d'analyse des formulaires reçus du navigateur, puisque toutes les capacités nécessaires sont intégrées au langage au niveau le plus bas. Par conséquent, le programmeur n’a même pas besoin de penser aux fonctionnalités du protocole. HTTP et je me demande comment se produisent l'envoi et la réception
AVEC HTML-des formulaires que vous avez déjà rencontrés lors de l'étude du langage de balisage HTML.
Regardons un exemple d'envoi d'un message à partir d'un formulaire par e-mail.
Inscription e_mail.html. Envoi d'un message depuis un formulaire par e-mail
Cliquez sur Réinitialiser et remplissez la commande.