Transmettre des données d'une page à l'autre
Les variables superglobales
1. $GLOBALS
Vous avez vu, dans le chapitre Les fonctions et structures de contrôle - Les fonctions, qu’il existe des variables locales et globales. Ces variables ont une certaine portée suivant l’endroit où vous les avez déclarées.
Il existe dans PHP un tableau $GLOBALS dit "superglobal" car il contient des valeurs valables quelle que soit sa portée, c’est-à-dire dans n’importe quel endroit de la page PHP. Ce tableau a comme indice le nom des variables et comme valeur la valeur des variables.
Par exemple :
<?php
$prenom = "Jean";
$nom = "Dupont";
function concatene() {
$GLOBALS['prenom'] = $GLOBALS['prenom'] . " " . $GLOBALS['nom'];
}
concatene(); //concatène le prénom et le nom
echo $prenom;
?>
Affiche :
Jean Dupont |
En effet, si vous aviez mis $prenom = $prenom . " " . $nom; dans la fonction, PHP aurait généré une erreur car ces variables n’ont pas la portée nécessaire pour être connues dans la fonction.
Vous pourriez penser qu’il est plus simple de déclarer des variables uniquement superglobales mais ce n’est pas le cas. Cela évite beaucoup de confusion de déclarer des variables en local et surtout vous économiserez beaucoup de mémoire car si votre site est visité par beaucoup de personnes simultanément, chaque variable $GLOBALS prendra de la place en mémoire sur le serveur et vous risquez de saturer le serveur. En utilisant des variables locales, PHP libère la mémoire dont il n’a plus l’utilité.
Depuis PHP 8.1, il n’est plus possible de modifier plusieurs valeurs en même temps dans le tableau $GLOBALS ni de le supprimer.
Ainsi :
$GLOBALS = ['prenom' => 'Jean', 'nom' => 'Dupont'];
et
unset($GLOBALS);
ne sont plus autorisés.
Vous verrez plus loin qu’il existe d’autres variables superglobales. Elles sont toujours écrites en majuscules, sous forme de tableau et valables dans toutes les pages PHP.
2. $_SERVER
$_SERVER est un tableau créé automatiquement contenant des informations comme les chemins...
La méthode GET
1. Utilisation de la méthode GET
Pour l’instant, vous avez appelé vos pages PHP avec l’URL suivante : http://127.0.0.1/test.php
Lorsque vous installez votre page PHP chez votre hébergeur en ayant acheté un nom de domaine comme www.site.fr, vous aurez : http://www.site.fr/test.php
Par défaut, lorsque vous passez d’une page PHP à une autre, toutes les informations de la première page sont perdues. Pour garder ces informations, vous pouvez les transmettre dans l’URL qui appelle la deuxième page PHP.
Les valeurs sont passées dans l’URL de cette façon : http://127.0.0.1/test.php?nom=Dupont&prenom=Jean
Vous ajoutez le point d’interrogation après le nom de la page PHP puis vous ajoutez le nom de la variable puis le symbole = puis sa valeur. Pour ajouter d’autres variables avec leurs valeurs, vous ajoutez le symbole & puis le nom de la variable puis le symbole = puis sa valeur et ainsi de suite.
Vous pouvez avoir par exemple : http://127.0.0.1/test.php?var1=fraise&var2=framboise&var3=banane &var4=myrtille
Il n’est pas conseillé de dépasser 256 caractères pour l’URL, donc cette méthode a ses limites.
Dans l’exemple suivant, deux pages PHP sont créées, get_envoie.php et get_recoit.php, pour transmettre des données d’une page à l’autre.
Voici le code de la page get_envoie.php :
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Exercice avec GET</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
</head>
<body>
<p><a href="get_recoit.php?nom=Dupont&prenom=Jean">appel de
la page get_recoit.php?nom=Dupont&prenom=Jean</a></p>
</body>
</html>
Cette page contient un lien qui appelle la page get_recoit.php avec les variables nom et prenom ainsi que leurs valeurs respectives.
Pour récupérer la valeur de ces variables, un tableau associatif $_GET est utilisé.
Ce tableau a pour indice le nom des variables passées...
La méthode POST
1. Utilisation de la méthode POST
La méthode POST sert à transmettre des données d’une page PHP à l’autre mais contrairement à la méthode GET, ces données ne sont pas visibles dans l’URL. Cette méthode est donc la plus utilisée.
Toutes les données contenues dans un formulaire seront envoyées à l’autre page PHP via la méthode POST et reçues dans tableau superglobal $_POST.
Pour mieux comprendre, vous allez créer une page PHP se nommant formulaire.php contenant un formulaire avec le nom et le prénom.
Le code de la page formulaire.php :
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Exercice avec POST</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
</head>
<body>
<form action="recoit_post.php" method="POST" name="formulaire">
<h2>Formulaire d'envoi du prénom et du nom</h2>
Prénom: <input type="text" name="prenom" /><br />
Nom: <input type="text" name="nom" /><br />
<input type="submit" name="envoyer" value="envoyer" />
</form>
</body>
</html>
Vous remarquez que dans la balise <form> se trouve l’attribut method avec la valeur POST. Ceci est obligatoire pour transmettre les valeurs saisies dans le formulaire. Si vous mettez method=GET, les données saisies sont transmises dans l’URL.
Ensuite, la balise <form> doit aussi contenir l’action, c’est-à-dire le nom de la page PHP appelée lorsque vous cliquez sur le bouton envoyer. Le bouton envoyer est de type submit.
Lorsque vous cliquez sur envoyer, toutes les valeurs des objets contenus dans le formulaire sont envoyées à la page recoit_post.php qui les reçoit dans le tableau $_POST.
Le code de la page recoit_post.php :
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Exercice...
La méthode $_REQUEST
$_REQUEST est un tableau associatif regroupant les méthodes $_GET, $_POST et $_COOKIE. Ce tableau est aussi superglobal donc il est accessible dans tous les scripts PHP. Que les données soient envoyées par POST, par GET ou par COOKIE, elles peuvent être récupérées par $_REQUEST.
Dans cet exemple, la page formulaire.php contient deux boutons : un pour envoyer les données par POST et l’autre par GET.
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Exercice avec REQUEST</title>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<SCRIPT language="JAVASCRIPT">
function envoyer_formulaire() {
//appelle la page recoit_post.php avec transmission
//des variables dans l'URL
document.location.href="recoit_post.php?nom="+document.formulaire.
nom.value+"&prenom="+document.formulaire.prenom.value;
} ...
Extraction de données
La fonction extract importe les variables dans la table des symboles, c’est-à-dire que cette fonction prend un tableau en paramètre puis transforme chaque clé en variable contenant la valeur associée.
<?php
//Initialisation de la variable $nom
$nom = "Martin";
//Remplissage du tableau
$var_array = array("nom" => "Dupont",
"prenom" => "Bob",
"age" => "30");
//Extraction du tableau
extract($var_array);
echo "$nom, $prenom, $age";
?>
Cet exemple affiche :
Dupont, Bob, 30 |
Vous remarquez que la variable $nom contenant "Martin" a été écrasée.
Cette fonction est souvent utilisée en MVC lorsqu’on récupère un $_POST et qu’on souhaite le transformer en plusieurs variables.
Zones portant le même nom
Si deux ou plusieurs zones portent le même nom dans un formulaire, c’est la dernière qui sera utilisée.
Par exemple :
<form action="recoit_post.php" method="POST" name="formulaire">
<h2>Formulaire d'envoi du prénom et du nom</h2>
Prénom: <input type="text" name="prenom" /><br />
Nom: <input type="text" name=" prenom " /><br />
<input type="submit" name="envoyerPOST" value="envoyer par POST" />
</form>
Seule la valeur saisie dans la zone à côté du nom est transmise par $_POST car les deux zones se nomment prenom.
Plusieurs formulaires dans la même page
Si plusieurs formulaires existent dans la même page, ces formulaires sont indépendants et chaque bouton submit envoie les valeurs de son propre formulaire.
Par exemple :
<form action="recoit_post.php" method="POST" name="formulaire1">
<h2>Formulaire d'envoi du prénom et du nom</h2>
Prénom: <input type="text" name="prenom1" /><br />
Nom: <input type="text" name=" nom1 " /><br />
<input type="submit" name="envoyer1" value="envoyer 1" />
</form>
<form action="recoit_post.php" method="POST" name="formulaire2">
<h2>Formulaire d'envoi du prénom et du nom</h2>
Prénom: <input type="text" name="prenom2" /><br />
Nom: <input type="text" name=" nom2 " /><br />
<input type="submit" name="envoyer2" value="envoyer 2" />
</form>
Si vous cliquez sur le bouton envoyer1, seules les valeurs des zones prenom1 et nom1 sont postées.
Contrôle des données et redirection de pages
1. Introduction
Les données saisies dans un formulaire ne sont pas sécurisées. En effet, les utilisateurs peuvent saisir des lettres quand vous demandez un âge ou mettre un code SQL destructif à la place de leur nom. Cette dernière action s’appelle l’injection SQL. Pour éviter qu’un utilisateur puisse rendre votre site web inopérant, il convient de sécuriser les données saisies. Pour cela, vous pouvez vérifier en JavaScript (côté client) que les données saisies correspondent à celles que vous voulez mais ce n’est pas l’objet du support et ce n’est pas suffisant. Il faut en plus coder des vérifications en PHP (côté serveur) avant d’enregistrer les données en base de données.
2. Données obligatoires
Ce test consiste à vérifier si l’utilisateur a renseigné une zone du formulaire.
Pour les zones du type text, textarea, hidden et password, la vérification est :
<?php
//En supposant que le formulaire contienne un champ nom
if ($_POST['nom'] != '') {
echo "Votre nom est : ".$_POST['nom'];
}
else
{
echo "Le nom n'a pas été saisi.";
}
?>
Pour les zones du type radio bouton, checkbox et liste, la vérification est :
<?php
//En supposant que le formulaire contienne une liste appelée pays
if (isset($_POST['pays']) == true) {
echo "Les pays sont : ";
print_r ($_POST['pays']);
}
else
{
echo "Le pays n'a pas été sélectionné.";
}
?>
3. Les filtres
Il existe une fonction PHP permettant de filtrer une variable avec un filtre spécifique. La fonction filter_var() prend en paramètres la variable, le filtre sous forme de constante et éventuellement un tableau d’options.
Par exemple, pour vérifier que mon adresse e-mail est valide :
<?php
//exemple d'e-mail
$email = "bob.dupont@france.com";
//test l'e-mail avec la constante FILTER_VALIDATE_EMAIL...
Exercices
1. Énoncés
Exercice 1 (facile)
Créer une page login.php contenant un formulaire avec une zone login et une zone mot de passe. Ajouter un bouton "vérifier" de type submit qui appelle la page verif_login.php. Cette page affiche "login correct" si le nom est égal à "Dupont" et le mot de passe "alibaba", sinon cette page redirige sur la page login.php avec le message "login incorrect".
Exercice 2 (difficulté moyenne)
Créer une page tableau.php contenant un formulaire avec une liste à sélection simple contenant des pays et en dessous une zone de type <div> affichant les villes suivant le pays sélectionné. Le formulaire contient un bouton de type "submit" permettant de rappeler la page elle-même suivant le pays sélectionné. L’objectif est de réaliser cette page sans utiliser de JavaScript. Lorsque vous affichez la page pour la première fois, il faut afficher le premier pays de la liste avec ces villes correspondantes. Les deux tableaux sont :
$pays = array('France','Italie','Allemagne','Russie');
et :
$villes['France'][0] = "Paris";
$villes['France'][1] = "Lyon";
$villes['France'][2] = "Marseille";
$villes['Italie'][0] = "Rome";
$villes['Italie'][1] = "Milan";
$villes['Italie'][2] = "Naples";
$villes['Allemagne'][0] = "Berlin";
$villes['Allemagne'][1] = "Munich";
$villes['Allemagne'][2] = "Francfort";
$villes['Russie'][0] = "Moscou";
$villes['Russie'][1] = "Saint-Pétersbourg";
$villes['Russie'][2] = "Nizhny-Novgorod";
Exercice 3 (difficulté moyenne)
Reprendre l’exercice 1 et afficher dans la page login.php le nombre de fois où l’utilisateur a essayé de se loguer avant d’utiliser les bons login et mot de passe. Afficher aussi dans cette page tous les logins...