formulaires

HTML permet en plus des paragraphes, des titres, des tableaux, etc. d'afficher des FORMULAIRES. C'est l'utilisateur qui voit la page qui peut remplir le formulaire(texte, case a cocher, choix multiple, etc.). A chaque formulaire est associé une url (ie action='resultat.php'). Quand l'utilisateur valide le formulaire c'est comme s'il cliquait sur un lien, il est redirigé vers l'url associée au formulaire. 

Chaque champs du formulaire se rajoute à l'url (si on a mis method='get' à la balise <form> du formulaire) sinon les champs sont passés à l'url quand même mais de façon caché.

Si on a le formulaire

<form action="resultat.php" method="GET">
  Entrez votre prénom :<input type="text" name="prenom"/><br>
  Etes-vous intéréssé par l'informatique :<input type="checkbox" name="intinfo"/><br>
  <input type="submit" value="Je m'inscris en Licence d'informatique"/>
</form>
alors quand l'utilisateur clique sur le bouton "Je m'inscris en Licence d'informatique" il se retrouve sur la page resultat.php?prenom=fred&intinfo=on

Formulaires

Le langage de script PHP crée du code HTML avec des echo ou print(...). Comme il serait lourd de générer toutes les lignes d'un fichier HTML avec des print, PHP permet d'insérer du code PHP au milieu de code HTML classique (entre des balises spéciales ). L'avantage d'un langage de script qui génère du HTML est que vous pouvez
  • faire des boucles for pour générer des lignes de tableaux, des paragraphes ou des images
  • générer un contenu adapté à l'utilisateur
  • générer un contenu adapté au contexte
  • accéder au disque dur pour sauvegarder les réponses d'un questionnaires
  • lire un fichier pour récupérer ce qui avait été sauvegardé plus tôt
  • etc.
PHP peut récupérer la valeur d'un item du formulaire avec $_GET["prenom"]. Comme il y a de grandes chances que cette string soit ensuite affichée sur des pages web (la page résultante mais aussi plein d'autres) et pour des raisons de sécurité on appellera systématiquement la fonction htmlspecialchars() qui enlèvera les caractères html qui permettent aux petits malins de mettre comme prénom :<script>for(let i=0;i<10000000;i++) alert("ERREUR");</script> . 
La bonne pratique consiste à commencer son script PHP par récupérer toutes les variables dont on peut avoir besoin. Par ailleurs on traite aussi les infos manquantes. Par exemple une case à cocher non cochée
ne transmet aucune variable au PHP (alors que si elle est cochée on a name=on), ici je teste la variable et je rajoute le 'off'. Il existe des fonctions PHP pour vérifier les nombres, les emails, le code SQL, etc.
<?php
  $prenom = htmlspecialchars($_GET['prenom']);
  if (array_key_exists('intinfo', $_POST))
    $intinfo = htmlspecialchars($_GET['intinfo']);
  else
    $intinfo = 'off';
  // on utilise ici les variables ...
?>

Allez un petit trait d'humour (mais n'essayez pas de visualiser votre maman en train d'appeler Sandrine au téléphone )

https://xkcd.com/327/

exploit

Une astuce particulière des formulaires et d'un langage de script consiste à faire un seul fichier HTML/PHP qui propose un formulaire qui revient sur la même page quand il est validé. Dans le header de cette page un morceau de PHP cherche si la page provient d'une précédente validation avec un if (isset($_GET["unchamps"])). Si c'est le cas ce script traite le formulaire mais quoi qu'il arrive le formulaire se ré-affiche.

PHP peut donc réagir à un formulaire ET créé un formulaire (Prenez quelques secondes pour laisser votre cerveau s'habituer à cette idée)
Par exemple PHP peut pre-remplir le formulaire avec la valeur déjà rentrée la fois d'avant, il peut aussi remplacer une valeur Robert');DROP TABLE Students;-- par une autre DESOLÉ C'EST INTERDIT

PHP peut générer du morceau de formulaire HTML un peu spécial : <input type="hidden" name="Tricheur" value="oui"> qui n'affiche rien du tout mais lorsque l'utilisateur valide le formulaire 
http://localhost:8888/covidWeb/resultat.php?Tricheur=oui&prenom=fred&intinfo=on
et resultat.php recevra 3 variables dans $_GET (dont Tricheur)

Exercice : faite un tableau à 4 colonnes dont la dernière ligne est un formulaire avec 3 entrées (nom, quantite, et couleur) et un bouton "valider"
nom sera un input de type text,  quantite aussi et couleur sera un select avec 3 options ("red", "green" ou "blue")
quand l'utilisateur valide son formulaire il revient vers la même page MAIS PHP rajoute une ligne au tableau (après avoir verifié que quantite est un nombre).
Dans la nouvelle ligne du tableau il y aura les valeurs précédemment rentrées et le formulaire re-apparaitra vide en bas du tableau