$_GET est un tableau de la query string de l'URL, donc article.php?id=42&lang=en donne $_GET['id'] === '42' et $_GET['lang'] === 'en'. $_POST est un tableau des champs d'un formulaire envoyé avec method="post". Lisez les deux avec une valeur par défaut, $_GET['id'] ?? null, car la clé manque dès que le paramètre manque.
Exécutez le bloc, puis cliquez sur les liens : chaque clic relance le script avec $_GET rempli à partir de la query string du lien.
$_GET['lang'] vaut ce que dit l'URL, pas seulement les trois liens que vous avez affichés. N'importe qui peut taper ?lang=<script> dans la barre d'adresse, c'est pourquoi le bloc cherche la valeur dans $languages au lieu de l'afficher, et échappe le seul endroit où il affiche des données de requête.
Lire un nombre dans la query string
Chaque valeur de $_GET est une chaîne. Pour un numéro de page, validez et convertissez en une étape avec filter_var() et rabattez-vous sur une valeur par défaut quand la valeur manque, n'est pas un nombre ou sort de la plage. Parcourez les pages, puis essayez les liens Page 999 et Page abc.
filter_var() renvoie l'entier 3 pour "3" et l'option default pour toute autre chaîne, donc $page est toujours un int utilisable. La page filter_var liste les autres validateurs.
Lire les données d'un formulaire avec $_POST
Un formulaire avec method="post" envoie ses champs dans le corps de la requête, et PHP les place dans $_POST sous le name de chaque champ. $_SERVER['REQUEST_METHOD'] vous dit si la requête courante est la première visite (GET) ou un envoi (POST). Remplissez le formulaire et cliquez sur Send pour voir les deux.
Un champ texte vide est quand même envoyé, sous la forme "", donc après un envoi $_POST['title'] existe même si le visiteur n'a rien tapé. Sur un serveur, REQUEST_METHOD est toujours défini ; le ?? 'GET' sert seulement à garder le script silencieux quand vous exécutez le fichier avec php en ligne de commande. Le modèle complet pour valider et réafficher un formulaire est sur la page des formulaires.
Un formulaire de recherche avec method="get"
Utilisez GET pour un formulaire dont le résultat doit être une URL partageable, comme un champ de recherche. Le navigateur transforme les champs en query string (?q=sort&level=beginner) et le script les lit dans $_GET, exactement comme un lien. Cherchez array ou string.
Construire des liens avec http_build_query
Écrire "?q=$q&page=2" à la main casse dès que $q contient un espace, un & ou un #. http_build_query() encode chaque valeur pour vous, et le résultat passe par htmlspecialchars() quand il atterrit dans un href, car & doit devenir & dans du HTML.
parse_str() avec deux arguments est la façon dont PHP construit $_GET à partir d'une query string, c'est donc pratique pour tester. Passez toujours le second argument ; l'ancienne forme à un argument qui créait des variables a été supprimée en PHP 8.
$_REQUEST et pourquoi l'éviter
$_REQUEST est la fusion de $_GET et $_POST en un seul tableau. Les fichiers php.ini fournis avec PHP définissent request_order = "GP", donc quand les deux contiennent la même clé, POST l'emporte ; sans ce réglage, les cookies sont aussi fusionnés :
<?php
// POST /save.php?id=1 with a form field id=2
echo $_GET['id']; // "1"
echo $_POST['id']; // "2"
echo $_REQUEST['id']; // "2"
Cela semble pratique, mais cela cache l'origine d'une valeur. Un traitement qui supprime un enregistrement à partir de $_REQUEST['id'] peut être déclenché par un simple lien, exactement ce que les actions réservées à POST doivent empêcher. Lisez plutôt $_GET ou $_POST par leur nom.
GET ou POST : lequel utiliser
| GET | POST | |
|---|---|---|
| Où voyagent les données | Dans l'URL : ?q=php&page=2 | Dans le corps de la requête |
| À lire avec | $_GET | $_POST |
| Favori, partage, bouton retour | Oui | Non (le navigateur demande à renvoyer) |
| Longueur | Limitée par l'URL (quelques milliers de caractères restent sûrs) | Limitée par post_max_size (8M par défaut) |
| Envoi de fichiers | Non | Oui, avec enctype="multipart/form-data" (lire $_FILES) |
| À utiliser pour | Recherche, filtres, tri, pagination | Connexion, inscription, enregistrement, suppression, paiements |
La règle qui compte : une requête GET ne doit rien modifier. Les navigateurs préchargent les liens, les robots les suivent et les gens les partagent, donc un lien ?delete=5 finira par être suivi par quelque chose qui n'était pas censé supprimer. Aucune des deux méthodes n'est chiffrée en elle-même : HTTPS protège les deux, et POST ne fait que garder les données hors de l'URL, de l'historique du navigateur et des journaux du serveur.
Questions fréquentes
Comment récupérer un paramètre de l'URL en PHP ?
Lisez-le dans $_GET avec une valeur par défaut : pour page.php?id=42, $id = $_GET['id'] ?? null; donne la chaîne "42". Chaque valeur est une chaîne (ou un tableau pour id[]=), convertissez-la donc et validez-la, par exemple avec filter_var($id, FILTER_VALIDATE_INT).
Quelle est la différence entre $_GET et $_POST ?
$_GET vient de la query string de l'URL, elle est donc visible, peut être mise en favori et a une longueur limitée ; utilisez-la pour les recherches, les filtres et les pages. $_POST vient du corps de la requête d'un formulaire envoyé avec method="post" ; utilisez-la pour tout ce qui modifie des données, comme enregistrer, acheter ou se connecter.
Comment vérifier si un paramètre GET existe en PHP ?
Utilisez isset($_GET['q']), qui vaut faux quand la clé manque ou vaut null. Pour traiter aussi une valeur vide (?q=) comme absente, comparez la valeur après trim : trim($_GET['q'] ?? '') !== ''.
Faut-il utiliser $_REQUEST en PHP ?
En général, non. $_REQUEST fusionne $_GET et $_POST (et, selon request_order, les cookies), donc vous ne savez pas d'où vient une valeur, et un lien peut fournir une valeur que vous attendiez d'un formulaire. Lisez explicitement $_GET ou $_POST.
Comment savoir si une requête est en GET ou en POST en PHP ?
Comparez $_SERVER['REQUEST_METHOD'] : if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. C'est plus fiable que isset($_POST['submit']), qui échoue quand le bouton n'a pas de name ou quand le formulaire est envoyé par JavaScript ou un autre script sans ce champ.