Au sein d’une page XHTML ou HTML, utilisant le protocole HTTP
Les balises <form> et </form> encadrent le formulaire :
L’attribut « method » est « GET » (transmission par URL) ou « POST » (tranmission par l’en-tête HTTP)
L’attribut « action » indique la page vers laquelle les données sont envoyées
Les boutons « send » et « reset »
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_recuperation.php" method="post" enctype="multipart/form-data">
<legend><b>Vos coordonnées</b></legend>
<label>Nom : </label>
<input type="text" name="nom" size="40" value="" /><br />
<label>Prénom : </label>
<input type="text" name="prenom" size="40" value="" /><br />
<label>Mail : </label>
<input type="text" name="mail" size="40" value="" /><br />
<input type="reset" value="Effacer" />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
Les « superglobales » :
L’index des variables superglobales est le nom du champ du formulaire
$_POST[‘nomChamp’] ou
$_GET[‘nomChamp’] ou
$_REQUEST[‘nomChamp’]
=> Si plusieurs champs HTML sont envoyés par plusieurs méthodes avec le même nom, la priorité est : 1. cookies, 2. post, 3. get.
<?php
echo $_POST['nom'] . "<br />";
echo $_REQUEST['prenom'] . "<br />";
echo $_POST['mail'] . "<br />";
<?php
echo '<h1>Lecture des données </h1>';
foreach($_POST as $cle=>$valeur)
{
echo 'Nom de la variable :'. $cle. ', valeur de la variable :' . $valeur .' <br />';
}
<input type="checkbox"> : la valeur (par défaut à « on ») n'est transmise que si la case est cochée.
isset($_REQUEST['nomCaseaCocher']
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_checkbox.php" method="post" enctype="multipart/form-data">
<legend><b>Cochez vos préférences : </b></legend>
Le bon : <input type="checkbox" name="bon" /><br />
La brute : <input type="checkbox" name="brute" /><br />
Le truand : <input type="checkbox" name="truand" /><br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
<?php
echo '<h1>Eléments récupérés </h1>';
if (isset($_REQUEST['bon'])) { echo 'BON coché <br />'; }
if (isset($_REQUEST['brute'])) echo 'BRUTE coché <br />';
if (isset($_REQUEST['truand'])) echo 'TRUAND coché <br />';
?>
Exercice : Remplacer le code précédent par une boucle.
<select name="nomSelect" multiple> : le même paramètre peut être envoyé plusieurs fois avec différentes valeurs. => risque de ne garder que le dernier !!!
=> combiner 2 solutions :
<select name="nomSelect[]" multiple>
foreach ($_REQUEST["nomSelect"] as value)
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_selectMultiple.php" method="post" enctype="multipart/form-data">
<legend><b>Sélectionnez vos préférences : </b></legend>
<select name="language[]" size="4" multiple>
<option value="PHP">Le PHP</option>
<option value="JAVA">Le JAVA</option>
<option value="c#">Le C#</option>
<option value="COBOL">Le COBOL</option>
</select>
<br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
<?php
echo "<h1>Eléments sélectionnés </h1>";
foreach ( $_REQUEST["language"] as $selection ) {
echo 'Choix :'. $selection .' <br />';
}
?>
<textarea name="nomTextarea"> : plusieurs lignes sont envoyées, avec des retours à la ligne. Mais les retours à la ligne ne sont pas des caractères HTML => le contenu du textarea ne peut pas être affiché sur une page HTML
=> utilisation de la fonction
nl2br($_REQUEST['nomTextarea']
pour transformer les “new line” (nl) en “br”, et pouvoir afficher le contenu du textarea sur une page HTML
<!DOCTYPE html P>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_textarea.php" method="post" enctype="multipart/form-data">
<legend><b>Ecrivez votre paragraphe : </b></legend>
<textarea name="nomTextarea" cols="50" rows="10"></textarea>
<br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
<?php
echo '<h1>Eléments récupérés </h1>';
// echo $_REQUEST['nomTextarea'] ;
echo ($_REQUEST['nomTextarea']) ;
?>
<input type="image" name="nomImg" src=... > : la position du clic de souris est envoyée.
L’abscisse du point de clic est donnée par le nom du champ suivi de _x (dans ce cas “nomImg_x”); l’ordonnée est donnée par le nom du champ suivi de _y (dans ce cas “nomImg_y”).
<input type="file" name="nomFile"> : les données sont récupérées dans la superglobale $_FILES[].
$FILES[] est un tableau à 2 dimensions :
Par exemple :
$_FILES['nomFile']['nom'];
<!DOCTYPE html >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_file.php" method="post" enctype="multipart/form-data">
<legend><b>Uploadez votre fichier : </b></legend>
<input type="file" name="nomFile" size="50" />
<br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
<?php
echo '<h1>Eléments récupérés </h1>';
echo 'Nom fichier origine : ' . $_FILES['nomFile']['name'] . '<br />';
echo 'Taille fichier : ' . $_FILES['nomFile']['size'] . '<br />';
echo 'Nom temporaire du fichier : ' . $_FILES['nomFile']['tmp_name'] . '<br />';
echo 'Type du fichier : ' . $_FILES['nomFile']['type'] . '<br />';
echo 'Erreur de téléchargement : ' . $_FILES['nomFile']['error'] . '<br />';
$destination = '/tmp/upload/' . $_FILES['nomFile']['name'];
move_uploaded_file($_FILES['nomFile']['tmp_name'], $destination);
Exercice
//Créez un formulaire qui permette d’ajouter une personne (nom, prenom).
//Récupérez les données de ce formulaire, et afficher les en gras et majuscule.
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="request.php" method="post">
<input type="text" name="nom" id="nom">
<input type="text" name="prenom" id="prenom">
<input type="submit" value="Envoyer">
</form>
</body>
</html>
<?php
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
?>
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
Nom : <?php echo strtoupper($nom); ?>
Prénom : <?php echo strtoupper($prenom) ?>
</body>
</html>
Valeur par défaut d’un champ
=> Question de l’insertion de ces champs dans le formulaire HTML ???
En produisant les champs mêmes du formulaire, avec le nom de chaque champ
Problème: le champ d’un formulaire doit avoir une valeur par défaut calculée (par ex, la date du jour).
Solution : un script PHP s’occupe d’afficher tout le formulaire, avec la bonne valeur dans le champ par défaut.
Difficulté: faire imprimer du HTML par PHP, ce qui n’est pas très maintenable
Défi: la séparation des couches en PHP
(gestion approfondie de « templates »)
Exemple: afficher un champ texte avec la date du jour comme valeur par défaut
Heredoc
<?php
$now = date('d/m/y');
echo <<<fin
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_dynamique_donnee_traitement.php" method="get" enctype="multipart/form-data">
<legend><b>La date</b></legend>
<label>Entrez votre date : </label>
<input type="text" name="date" size="40" value="$now" /><br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
fin;
HTML + PHP
<?php
$now = date('d/m/y');
?>
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_dynamique_donnee_traitement.php" method="get" enctype="multipart/form-data">
<legend><b>La date</b></legend>
<label>Entrez votre date : </label>
<input type="text" name="date" size="40" value="<?php echo $now ?>" /><br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
HTML séparé de PHP
La vue
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="form_dynamique_donnee_traitement.php" method="get" enctype="multipart/form-data">
<legend><b>La date</b></legend>
<label>Entrez votre date : </label>
<input type="text" name="date" size="40" value="<?php echo $now ?>" /><br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
Le PHP
<?php
$now = date('d/m/y');
include("form_dynamique_donnee_include_view.php");
Récupération
<?php
$date = $_REQUEST['date'];
echo "LA DATE EST : " . $date;
Problème: il faut créer un formulaire qui s’adapte automatiquement au nombre de données.
Difficulté: donner des noms de champs dynamiquement
# A vous
<html >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="composition_familiale.php" method="post" >
<legend><b>Vos données personnelles</b></legend>
<label>Nom : </label>
<input type="text" name="nom" size="40" value="" /><br />
<label>Prénom : </label>
<input type="text" name="prenom" size="40" value="" /><br />
<legend><b>Combien d'enfants compte votre famille ?</b></legend>
<label>Nombre d'enfants : </label>
<input type="text" name="nombre" size="40" value="" /><br />
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
<?php
$nombreenfant = $_POST['nombre'];
?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<form action="composition_familiale_ecran2_controller.php" method="get" enctype="multipart/form-data">
<legend><b>Indiquez l'âge pour chacun d'entre eux</b></legend>
<?php for ($i=0; $i<$nombreenfant;$i++): ?>
<label>Age de l'enfant <?php echo $i+1 ?> : </label>
<input type="text" name="age[]" size="40" value="" /><br />
<?php endfor; ?>
<input type="submit" value="Envoyer" />
</form>
</body>
</html>
<?php
$age = $_POST['age'];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulaire traité par PHP</title>
</head>
<body>
<h1>Récapitulatif</h1>
<?php for($i=0;$i<count($age);$i++) : ?>
<p>Age de l'enfant <?php echo $i+1 ?> : <?php echo $age[$i] ?> </p>
<?php endfor; ?>
</body>
</html>