Médiaforma

All posts tagged transmission de données

Dans la section précédente, vous avez appris à transmettre des données par l’URL. Cette technique fonctionne parfaitement, mais elle a deux principaux désavantages :

  • Le nombre de paramètres transmissibles est limité par la longueur de l’URL.
  • Les paramètres transmis apparaissent en clair et l’utilisateur peut, s’il le souhaite, les modifier en agissant sur l’URL.

Pour résoudre ces deux problèmes, on utilise une transmission de données par formulaires.

Voici le code d’un formulaire traditionnel. Lorsque l’utilisateur clique sur le bouton Envoyer, les données contenues dans le formulaire sont transmises au script traitement.php en utilisant la méthode POST :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Transission de données par un formulaire</title>
  </head>
  <body>
    <form name="MonFormulaire" method="post" action="traitement.php">
      <table><tr><td><label>Prénom</label></td>
      <td><input type="text" name="prenom"></td></tr>

      <tr><td><label>Nom</label></td>
      <td><input type="text" name="nom"></td></tr>

      <tr><td><label>Mot de passe</label></td>
      <td><input type="password" name="mdp"></td></tr>

      <tr><td><label>Age</label></td>
      <td><select name="age">
        <option><20 ans</option>
        <option>20 à 50 ans</option>
        <option>>50 ans</option>
      </select></td></tr>

      <tr><td><label>Observations</label></td>
      <td><textarea name="observations" cols="40" rows="4"></textarea></td></tr>

      <tr><td><input type="submit" name="Nom" value="Envoyer"></td>
      <td><input type="reset" name="Nom" value="Annuler"></td></tr>
      </table>
    </form>
  </body>
</html>

Voici le code du script traitement.php :

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Traitement des données envoyées par formulaire</title>
  </head>
  <body>
  <?php
    $prenom = $_POST["prenom"];
    $nom = $_POST["nom"];
    $motDePasse = $_POST["mdp"];
    $age = $_POST["age"];
    $obs = $_POST["observations"];

    echo "<b>Données reçues :</b><br><br>";
    echo "Prénom : $prenom<br>";
    echo "Nom : $nom<br>";
    echo "Mot de passe : $motDePasse<br>";
    echo "Age : $age<br>";
    echo "Observations : $obs<br>";
    ?>
  </body>
</html>

Exécutons ce code dans WAMP Server. Nous entrons un prénom, un nom et un mot de passe. Nous sélectionnons une tranche d’âge et nous insérons quelques mots dans le textarea. Un clic sur le bouton Envoyer et les données sont transmises au programme traitement.php et affichées à l’aide d’instructions echo.

Pour éviter les problèmes d’injection de type Cross-Site Scripting, pensez à convertir les données entrées par l’utilisateur en appliquant (systématiquement !) la fonction htmlspecialchars() à chacune des données récupérées. Le code du script traitement.php devient alors le suivant :

<?php
  $prenom = htmlspecialchars($_POST["prenom"]);
  $nom = htmlspecialchars($_POST["nom"]);
  $motDePasse = htmlspecialchars($_POST["mdp"]);
  $age = htmlspecialchars($_POST["age"]);
  $obs = htmlspecialchars($_POST["observations"]);

  echo "<b>Données reçues :</b><br><br>";
  echo "Prénom : $prenom<br>";
  echo "Nom : $nom<br>";
  echo "Mot de passe : $motDePasse<br>";
  echo "Age : $age<br>";
  echo "Observations : $obs<br>";
?>

La façon la plus simple de transmettre des données à une page PHP consiste à les insérer dans l’URL :

http://www.adressedusite.com/unepage.php?param1=valeur1&param2=14

Ici par exemple, deux données sont transmises à la page unepage.php : param1 et param2. Ces deux données ont pour valeur “valeur1” et “14”.

Remarque

Vous pouvez transmettre autant de données que vous voulez, mais la taille des URL doit être inférieure à 256 caractères, sans quoi, certains navigateurs risquent de tronquer les URL trop longues.

Pour récupérer les données, vous utiliserez le tableau superglobal $_GET[] en l’interrogeant sur le nom de la donnée dont vous voulez récupérer la valeur :

<?php
  echo "La donnée param1 a pour valeur ".$_GET["param1"]."<br>";
  echo "La donnée param2 a pour valeur ".$_GET["param2"]."<br>";
?>

Exécutons ce code en entrant son adresse dans la barre d’adresses du navigateur. Les deux données ont bien été récupérées dans le tableau superglobal $_GET :

Si vous affichez la même page en supprimant les données de l’URL, deux erreurs sont générées :

Pour éviter ces problèmes, utilisez la fonction isset() pour tester si les données qui sont supposées être transmises dans l’URL sont effectivement présentes :

<?php
  if (isset($_GET["param1"]))
    echo "La donnée param1 a pour valeur ".$_GET["param1"]."<br>";
  if (isset($_GET["param2"]))
    echo "La donnée param2 a pour valeur ".$_GET["param2"]."<br>";
  if (!isset($_GET["param1"]) && !isset($_GET["param2"]))
    echo "Aucune donnée n'a été transmise à ce script PHP";
?>

Si le paramètre param1 est défini, on affiche sa valeur.

Si le paramètre param2 est défini, on affiche sa valeur.

Si aucun des paramètres param1 et param2 ne sont définis, on affiche un message pour l’indiquer à l’utilisateur.

Essayons ces trois configurations.

Nous transmettons le paramètre param1 mais pas le paramètre param2. Aucune erreur n’est détectée et la valeur du paramètre param1 est affichée.

Nous transmettons le paramètre param2 mais pas le paramètre param1. Aucune erreur n’est détectée et la valeur du paramètre param2 est affichée.

Nous omettons les paramètres param1 et param2 de l’URL. Un message indiquant que ces paramètres n’ont pas été transmis est affiché.

 

Etant donné que l’utilisateur peut modifier l’URL affiché dans la barre d’adresses du navigateur, il est vital d’échapper les données reçues pour éviter les problèmes d’injection de type Cross-Site Scripting. Pour cela, vous appliquerez la fonction htmlspecialchars() à chacune des données récupérées. Le code à utiliser est le suivant :

<?php
  if (isset($_GET["param1"]))
    echo "La donnée param1 a pour valeur ".htmlspecialchars($_GET["param1"])."<br>";
  if (isset($_GET["param2"]))
    echo "La donnée param2 a pour valeur ".htmlspecialchars($_GET["param2"])."<br>";
  if (!isset($_GET["param1"]) && !isset($_GET["param2"]))
    echo "Aucune donnée n'a été transmise à ce script PHP";
?>

Dans ce code, nous avons juste protégé l’affichage en appliquant la fonction htmlspecialchars aux deux paramètres qui auraient pu être altérés par l’utilisateur.