Les super globales
Aperçu des sections
-
Ce cours va vous permettre de découvrir des notions de base extrêmement utilisées dans toute application utilisant PHP.
Les super globales selon la doc PHP : "Les Superglobales sont des variables internes qui sont toujours disponibles, quel que soit le contexte. Plusieurs variables prédéfinies en PHP sont "superglobales", ce qui signifie qu'elles sont disponibles quel que soit le contexte du script."Pour faire simple, les super globales sont des variables que PHP vous rempli automatiquement, et qui servent à faire diverses choses assez génériques en termes de développement web. Ces variables sont accessibles depuis partout dans votre code, et elles sont automatiquement remplies par PHP, c'est pour cela qu'on les appelle des super globales. Global faisant attrait à la notion de scope, bien entendu. -
Cette variable est l'une des plus utilisée pour récupérer des données en provenance du client. Elle correspond à la méthode "GET" du protocole HTTP, qui permet d'envoyer des paramètres dans l'URL d'une requête. Ces paramètres sont composés de couples de clés/valeurs, et il peux y en avoir plusieurs dans une même requête.
Quand le serveur web reçoit une requête HTTP contenant des paramètres "GET", il envoi tout ça au moteur PHP, qui va décomposer les couples clés/valeurs, et vous les mettre directement à disposition dans tous vos scripts PHP via la variable $_GET.
$_GET prendra alors la forme d'un tableau associatif reprenant les clés/valeurs passées dans l'URL.
Dans cette image, "q" est la clé(pour query), et la chaîne "who+is+jack+bauer" est la valeur.
Il y a deux méthodes de bases pour envoyer des données en utilisant la méthode GET :
- directement dans l'URL
- via un formulaire (ce qui revient en réalité au même)
Pour transmettre des données via l'url, il faut respecter cette syntaxe :
http://exemple.com/page.php?cle1=valeur1&cle2=valeur2&cle3=valeur3 (etc...)
Le point d'interrogation ? permet de commencer la déclaration des variables GET. Ensuite, on écrit les couples de clés/valeurs en utilisant le signe =, et le signe & comme séparateur. Leur utilisation est assez simple, voici un autre exemple :
URL :
http://formation.webboy.fr/php/?nom=julien&metier=formateur&age=33 //Ici, les clés sont en gras
On peux récupérer les données dans notre script de cette manière :
echo "<pre>";
echo "Contenu de la variable GET :<br />";
print_r($_GET);
echo "Bonjour, vous vous appelez ".$_GET['nom'].", vous avez ".$_GET['age']." ans et vous êtes ".$_GET['metier'].". Ok merci !";
echo "</pre>";Ce qui donnera ce résultat dans le navigateur :
Contenu de la variable GET :
Array ( [nom] => julien [metier] => formateur [age] => 33 ) Bonjour, vous vous appelez julien, vous avez 33 ans et vous êtes formateur. Ok merci !Même exemple avec un formulaire
On peux appliquer exactement le même procédé pour transmettre des informations en GET via un formulaire. C'est d’ailleurs la valeur par défaut de l'attribut method de la balise <form> en HTML. Dans un formulaire, c'est l'attribut name des <input> qui déterminera les clés, et ce sont les valeurs de chaque input qui seront associées à chaque clés.
Si on crée un formulaire de cette manière :
<form>
<input type="text" name="nom" />
<input type="text" name="metier" />
<input type="text" name="age" />
<input type="submit" />
</form>Lorsque l'utilisateur va soumettre le formulaire, une requête HTTP utilisant la méthode GET sera envoyée vers le serveur. Les données saisis par l'utilisateur seront alors automatiquement transmises via les paramètres de l'URL.Requête envoyée au serveur suite à la soumission du formulaire avec des données "pierre, comptable, 45" :
http://formation.webboy.fr/php/?nom=pierre&metier=comptable&age=45
Libre à vous de les récupérer dans votre script, puis d'en faire ce que vous souhaitez. Le gros inconvénient du GET, c'est qu'il passe des valeurs en clair, directement dans l'URL. Donc niveau sécurité : c'est zéro. Du coup, l'usage du GET se restreint souvent à des données "non-sensibles".
Exemples d'utilisation fréquente de la méthode GET :
- article.php?id=35 : affichera l'article ayant l'id 35
- produits.php?cat=nourriture&souscat=fruits : Affichera la liste des fruits
- geoloc.php?lat=12.354&long=42.364 : Affichera un point géolocalisé sur une carte
Note importante : dans les exercices suivant (GET et POST), je vous encourage fortement à utiliser l'opérateur null/coalescent (??) et les fonctions de filtrage. Ce sont des bonnes pratiques quand on fait du PHP aujourd'hui
Opérateur null coalscent : https://www.php.net/manual/fr/migration70.new-features.php
Fonctions de filtrage : https://www.php.net/manual/fr/ref.filter.php-
Devoir
-
Devoir
-
Lorsque l'on souhaite transmettre des données de manière "un peu plus sécurisée", on utilisera plutôt le POST. La méthode POST du protocole HTTP fonctionne à peu près de la même manière que le GET, à ceci près que les données ne sont pas transmises dans l'URL, mais via la propriété "body" de la requête HTTP. Les données transmises sont alors "invisibles" à l'écran.
Les données contenues dans un POST sont envoyées un peu comme la pièce jointe d'un e-mail. Attention toutefois, la sécurité n'est qu'illusoire, car les données du POST ne sont pas du tout cryptées, et peuvent être lus facilement si on sait analyser les paquets TCP/IP sur le réseau. Pour être sécurisé, il faut crypter ses requêtes via l'utilisation de HTTPS, quasi obligatoire aujourd'hui car pris en compte pour le SEO.
Note : la méthode POST du protocole HTTP a été légèrement détournée par PHP. Normalement, les méthodes HTTP GET/POST/PUT/DELETE correspondent peu ou prou à un CRUD, ou POST serait le CREATE. En PHP il n'en est rien, on se sert des POST pour un peu tout et n'importe quoi, pour la simple et bonne raison que les méthodes PUT et DELETE ne sont pas implémentées en HTML. En revanche, avec la démocratisation des API Javascript, vous pourrez trouver des PUT et des DELETE plus fréquemment dans des applications Javascript.En PHP, la manière la plus répandue d'utiliser la méthode POST, c'est via un formulaire. Il va falloir spécifier la méthode dans la balise <form method="POST"> (car c'est GET par défaut), et les données seront tout simplement transmises en POST au lieu de GET.
Exemple :
<form method="POST"> <input type="text" name="nom" /> <input type="text" name="metier" /> <input type="text" name="age" /> <input type="submit" /> </form>
<? echo "<pre>"; echo "Contenu de la variable POST :<br />"; print_r($_POST); echo "Bonjour, vous vous appelez ".$_POST['nom'].", vous avez ".$_POST['age']." et vous êtes ".$_POST['metier'].". Ok merci !"; echo "</pre>"; ?>
Rendu :
Pour conclure, en général la méthode GET est utilisée partout ou il y a des liens (ex : http://monsite.com/produit.php?product_id=126), et la méthode POST, partout ou il y a des formulaires, et donc de la saisi utilisateur.En PHP, il est possible de savoir avec quelle méthode a été appelé une page via une autre variable global de PHP : $_SERVER['REQUEST_METHOD']. Vous pourrez alors avoir deux comportements différents sur la même page, en fonction qu'elle ait reçu des informations en GET ou en POST. Ceci est très souvent le cas sur les formulaires de contact par exemples.Validation de formulaire
Une étape importante lorsque l'on récupère des infos envoyées par le client, c'est de vérifier qu'elles ressemblent bien à ce que l'on attend. Par exemple : un numéro de téléphone doit matcher avec un certain pattern, ou bien encore un e-mail. Une donnée de type "nombre" ne devrait pas contenir de caractères alphabétiques, etc etc... On appelle généralement cette étape "la validation de formulaire", et c'est une étape importante car c'est la dernière vérification avant envoie en base de données.On peut faire des vérifications manuelles, en testant un peu tous les cas de figures (en plus de vérifier que la variable n'est pas vide ou, pire, non définie). Il existe une fonction spécialisée pour ce genre de chose, la fonction filter_input. Voici le lien vers la doc officielle.Voici un exemple simple :Voici un formulaire qui demande à l'utilisateur le nombre de participants à un événement.<form method="POST"><input type="number" name="participants" /><input type="submit" /></form><?$nombre_participant = filter_input(INPUT_POST, 'participants', FILTER_VALIDATE_INT);if($nombre_participant > 0){echo "Il y aura $nombre_participant participant(s) à notre évenement";} else {echo "Il y a un problème sur le nombre de participants";}?>Important : pour les exercices suivants, privilégiez la fonction filter_input pour faire vos validations de formulaires-
Devoir
-
Devoir
-
Devoir
-
Pour envoyer un fichier vers le serveur (upload), on va mettre en place un mécanisme simple basé sur trois choses :
- un formulaire HTML correctement configuré
- la variable pré-définie $_FILES
- la fonction native de PHP move_uploaded_file()
Le fait d'uploader des fichiers en PHP demande plus de subtilités que les simples GET et POST. Vous risquez d'être confrontés à différentes problématiques :
- quel types de fichiers acceptez vous ?
- quelle taille maximale ?
- est ce que vous souhaitez dénaturer les fichiers reçus ? (compression, traitement,...)
- quelle est votre "politique de nommage" des fichiers reçus ? (on garde rarement le nom donné par l'utilisateur)(ex : mon-image.jpeg deviendra 25_06-09-2017_172411-355.jpg pour id/date/heure/ms.extension)
Côté front-end
Les formulaires permettant d'envoyer un fichier devront comporter quelques différences par rapport à un formulaire classique. Il va falloir rajouter des éléments qui vont changer le MIME-type du contenu envoyé, ou bien la taille maximale de fichier autorisé. Le type input qui permet de sélectionner un fichier dans l'OS du client est tout simplement type="file". Un formulaire d'upload est obligatoirement en POST.
<form enctype="multipart/form-data" method="post"> <!--Définition du mime-type--> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <!--Définition de taille maximale --> Envoyez ce fichier : <input type="file" name="image" /> <!--Type "file" + nom du champ--> <input type="submit" value="Envoyer le fichier" /> </form>Note sur le max_file_size : normalement, ça se gère en configuration avec le php.ini. Mais c'est une possibilité offerte par HTML de le définir directement dans le formualire. C'est en revanche très risqué de se baser dessus, car la valeur peut être modifier par l'utilisateur côté client. Donc pas très safe.Côté back-end
Pour récupérer le fichier, on va simplement passer par la variable $_FILES, un peu comme avec les GET et les POST. Au lieu de nous fournir les paramètres reçus en GET ou en POST, le moteur PHP va créer sa propre variable correspondant au fichier reçu. Elle a un format prédéfini, sous la forme d'un tableau associatif, et vous allez devoir l'exploiter pour récupérer puis stocker l'image quelque part.
<?
echo "<pre>";
echo "Contenu de la variable FILES :<br />";
print_r($_FILES);
echo "</pre>";
?>
Ce qui donnerai :Explications sur les différentes clés du tableau :
- la clé "image" : c'est le nom du champ dans le formulaire HTML. Si vous souhaitez envoyer plusieurs fichiers, il vous faudra plusieurs champs input file, avec des noms différents. Ici, nous n'en avons qu'un seul, donc $_FILES contient un seul élément.
- name : c'est le nom du fichier tel qu'il a été reçu par le serveur (c'est le nom du fichier dans l'arborescence du client)
- type : MIME-type du fichier détecté par PHP
- tmp_name : c'est le chemin qui correspond à l'emplacement provisoire du fichier reçu dans l'arborescence du serveur
- error : code de statut du traitement du fichier (tout s'est bien passé, fichier trop gros, mime-type interdit,...)
- size : taille du fichier en octets
A ce moment de l'exécution de votre script, le fichier a bien été envoyé au serveur, mais il est stocké dans un dossier temporaire, et il attends d'être traité. Pour info, les dossiers "tmp" sont généralement réglés dans l'OS pour être vidés régulièrement automatiquement, donc impossible de le laisser la.La fonction move_uploaded_file
Cette fonction va simplement vous déplacer un fichier temporaire vers la destination que vous souhaitez, dans l'arborescence de votre serveur. On devra généralement définir quelques variables en amont, puis appeler cette fonction qui fera la job correctement. Elle prends en paramètre le chemin source, et le chemin destination. Cette fonction renvoie true en cas de succès, et false en cas d'erreur.
Avant de vous en servir, il vous faudra bien évidemment déterminer un dossier de stockage pour vos upload, et qu'il ai les bonnes permissions pour qu'Apache/PHP puisse écrire un fichier à l'intérieur.Exemple de script :
$uploaddir = 'uploads'; /*Définition des variables importantes (chemin du dossier + chemin du fichier)*/
$uploadfile = $uploaddir.'/'.basename($_FILES['image']['name']); /*Ici, on garde le nom du fichier tel qu'on l'a reçu*/
if (move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile)) { /*appel de la fonction move_uploaded_file (dans un if) avec la source et la destination*/
echo "Le fichier est valide, et a été téléchargé avec succès.<br />";
echo "<a href='$uploadfile' target='_blank'>Ouvrir le fichier dans un nouvel onglet</a>"; /*Lien vers le fichier pour vérifier*/
} else {
echo "Erreur lors du transfert du fichier";
}Attention : si le fichier de destination existe déjà, il sera écrasé.-
Devoir
-
Devoir
-
Devoir
-
Au même titre que $_GET ou $_POST, la variable $_SERVER est une super globale prédéfinie par PHP. Présentée sous forme de tableau associatif, cette variable contient des informations concernant :
- le client
- le serveur
- le script en cours d'exécution
Cette variable pourrait être utile pour divers usages :
- récupérer l'IP du client (exemple : dans le but de l'afficher, ou bien de faire des statistiques)
- connaitre le domaine ou le sous domaine qui exécute le script (exemple : peut être utile pour changer le comportement de votre script sur différents domaines ou sous-domaines)
- connaître le user-agent (cqfd : le navigateur client)
- récupérer des éléments de l'URL séparément (Uri, nom de domaines, paramètres GET, etc...)
- etc...
Attention : les valeurs constituant cette variable provenant de différents environnement, il se peut que certaines informations ne soient pas fiables :
- données provenant du client : peuvent être changées par l'utilisateur via son navigateur (par exemple)
- données provenant du serveur : le serveur web peut ne pas remplir toutes les spécifications requises par PHP
Malgré l'utilité de cette variable, il faut donc rester vigilant dans son utilisation à cause de la potentielle inexactitude des données qu'elle contient. Donc à vous de piocher là-dedans selon les cas de figure.
Voici un lien vers la page de la documentation officielle sur $_SERVER.-
Devoir
-
PHP offre par défaut un système de "session" qui permet de sauvegarder des données liées à une connexion utilisateur sur votre application. C'est un peu comme une petite base de données, mais qui ne dure que le temps d'une navigation. Lorsque l'utilisateur se déconnectera du site (fermeture d'onglet, fermeture de navigateur, log out, etc...), les données contenues en session seront alors supprimées.
Le mécanisme de la session PHP est basé sur l'envoi de cookies, contenant un identifiant de session unique, dans le navigateur du client. A chaque fois que l'utilisateur va accéder à une page, PHP va récupérer l'identifiant présent dans les cookies, et va "reconstruire" la variable de session avec les données qui étaient déjà présentes lors de la connexion précédente.
Le système de session permet donc de faire persister des données le temps d'une navigation. Les données sont sauvegardées par défaut sous forme de fichier, via le gestionnaire de session interne en PHP, mais on peut modifier ce comportement en les enregistrant - par exemple - en base de données. Ce qui peut améliorer les performances car un accès BDD et moins long qu'un accès fichier.
Le contenu de chaque session est disponible via la super-globale $_SESSION. Les données sont stockées sous forme de tableau associatif, dont vous déterminez vous même les clés/valeurs selon vos besoins.Voici quelques exemples d'utilisation des sessions :
- savoir si un utilisateur s'est authentifié sur un service
- stocker des données utilisées dans tous les scripts, afin de ne pas avoir à les recharger sans arrêt (ex : l'id de l'utilisateur, ses données de base (nom, prénom, image de profil, etc...))
- des "préférences" (ex : un thème CSS particulier)
Avec ce système, chaque utilisateur dispose de sa propre session, et donc vous pouvez leur assigner à chacun des données différentes :
L'utilisation des sessions PHP est assez aisée car c'est un mécanisme natif qui ne demande pas d'installation ou de configuration particulière pour être utilisé simplement. Voici un rappel des choses à savoir sur les fonctionnalités liées aux sessions :
- la super globale $_SESSION
- les fonctions natives dédiées au sessions PHP (session_start(), session_destroy(),...)
- les directives de configuration PHP liées aux session
Initialisation : même si la variable $_SESSION est accessible depuis n'importe ou dans vos scripts, il faudra utiliser la fonction session_start() dans chaque page utilisant la session pour que les données persistent d'une connexion à l'autre.Exemple de stockage d'une information entre deux pages grâce à une session PHP :Page 1 :<?
session_start();
$_SESSION['test'] = 'Hello world';
?>
<a href="sandbox2.php">Aller voir la page 2</a>Page 2 :<?
session_start();
?>
contenu de ma variable SESSION : <?=$_SESSION['test']?>Dans cet exemple, la page 2 affichera "Contenu de ma variable de session : Hello world", alors que l'information n'a pas été initialisée dans cette même page.-
Devoir
-
Devoir
-
Devoir
-
Les autres super globales étant moins utilisées, nous ne les aborderons qu’à l'oral, en cours.
Lien vers la doc officielle : https://www.php.net/manual/fr/language.variables.superglobals.php
=> Parler rapidement de globals, cookie, request et env