PHP Manual
/
HTTP

Méthodes d'envoi des données (GET et POST)

26. 11. 2019

Obsah článku

En plus des variables normales, nous avons également des variables dites "superglobales" en PHP, qui contiennent des informations sur la page actuellement appelée et les données que nous transmettons.

Typiquement, nous avons un formulaire sur une page que l'utilisateur remplit et nous voulons transférer ces données au serveur web où nous les traitons en PHP.

Il existe 3 méthodes les plus couramment utilisées pour ce faire :

  • GET ~ les données sont transmises dans l'URL en tant que paramètres.
  • POST ~ les données sont transmises secrètement avec la requête de la page.
  • Ajax POST ~ traitement javascript asynchrone

Méthode GET - $_GET.

Les données envoyées par la méthode GET sont visibles dans l'URL (en tant que paramètres après le point d'interrogation), la longueur maximale est de 1024 caractères dans Internet Explorer (les autres navigateurs ne sont presque pas limités, mais les textes plus longs ne doivent pas être transmis de cette façon). L'avantage de cette méthode est surtout la simplicité (vous pouvez voir ce que vous envoyez) et la possibilité de fournir un lien vers le résultat du traitement. Les données sont envoyées à une variable.

L'adresse de la page de réception pourrait ressembler à ceci :

https://____________.com/script.php?promenna=obsah&promenna2=obsah

En PHP, on peut alors, par exemple, écrire la valeur du paramètre variable comme suit :

echo $_GET['promenade']; // imprime "contenu".

Avertissement fort: Cette méthode d'écriture des données directement dans la page HTML n'est pas sécurisée, car on peut passer, par exemple, du code HTML dans l'URL qui serait écrit dans la page et ensuite exécuté.

Nous devons toujours traiter les données avant toute sortie sur la page, la fonction htmlspecialchars() est utilisée pour cela.

Par exemple : `echo htmlspecialchars($_GET['variable']);``

Méthode POST - $_POST.

Les données envoyées par la méthode POST ne sont pas visibles dans l'URL, ce qui résout le problème de la longueur maximale des données envoyées. La méthode POST doit toujours être utilisée pour envoyer les champs de formulaire, car elle permet de s'assurer que, par exemple, les mots de passe ne sont pas visibles et qu'un lien ne peut être fourni vers la page traitant le résultat d'une saisie particulière.

Les données sont disponibles dans la variable $_POST et l'utilisation est la même que pour la méthode GET.

Vérification de l'existence des données soumises

Avant de traiter des données, nous devons d'abord vérifier que les données ont effectivement été envoyées, sinon nous accédons à des données de l'UE. à une variable inexistante, ce qui entraînerait un message d'erreur.

La fonction isset() est utilisée pour vérifier l'existence d'une variable.

if (isset($_GET['Nom'])) {
echo 'Votre nom :' . htmlspecialchars($_GET['Nom']);
} else {
echo 'Aucun nom n'a été saisi.';
}

Formulaire de saisie des données

Le formulaire est réalisé en HTML, pas en PHP. Il peut s'agir d'une simple page HTML. Toute la "magie" est gérée par le script PHP qui accepte les données.

Par exemple, nous pouvons utiliser un formulaire pour recevoir 2 numéros, envoyés par la méthode GET :

<form action="script.php" method="get">
První číslo: <input type="text" name="x">
Druhé číslo: <input type="text" name="y">
<input type="submit" value="Sečíst čísla">
</form>

Dans la première ligne, vous pouvez voir où les données seront envoyées et par quelle méthode.

Les 2 lignes suivantes sont des éléments de formulaire simples, notez l'attribut name="", c'est le nom de la variable qui contiendra ce qui est maintenant dans le formulaire.

Viennent ensuite le bouton pour soumettre les données (obligatoire) et la balise HTML de fermeture du formulaire (obligatoire pour que le navigateur sache ce qu'il doit soumettre ou non).

Nous pouvons avoir un nombre quelconque de formulaires sur une page, et ils ne peuvent pas être imbriqués. En cas d'imbrication, le formulaire le plus imbriqué est toujours envoyé et les autres sont ignorés.

Traitement des formulaires sur le serveur

Maintenant nous avons un formulaire HTML terminé et nous l'envoyons à script.php, qui reçoit les données en utilisant la méthode GET. L'adresse de la requête de la page pourrait ressembler à ceci :

https://________.com/script.php?x=5&y=3

script.php

$x = $_GET['x']; // 5
$y = $_GET['y']; // 3
echo $x + $y; // imprime 8

Correctement, nous devons d'abord vérifier que les deux champs du formulaire ont été remplis, ce qui est fait avec la fonction isset() :

if (isset($_GET['x']) && isset($_GET['y'])) {
$x = $_GET['x']; // 5
$y = $_GET['y']; // 3
echo $x + $y; // imprime 8
} else {
echo 'Le formulaire n'a pas été rempli correctement.';
}

TIP: Vous pouvez passer plusieurs paramètres à la construction isset() pour vérifier qu'ils existent tous.

Par conséquent, au lieu de isset($_GET['x']) && isset($_GET['y']), vous pouvez simplement spécifier :

isset($_GET['x'], $_GET['y']).

Traitement des données reçues par la méthode POST

Si les données sont reçues par la méthode POST, l'URL du script à traiter ressemblera toujours à ceci :

https://________.com/script.php

Et jamais autrement. Juste non. Les données sont cachées dans la requête HTTP et nous ne pouvons pas les voir.

La méthode POST cachée est nécessaire pour envoyer les noms d'utilisateur et les mots de passe pour des raisons de sécurité.

Sécurité: Si vous travaillez avec des mots de passe sur votre site, le formulaire de connexion et d'inscription doit être hébergé sur HTTPS et vous devez hacher les mots de passe de manière appropriée (par exemple, avec BCrypt).

Traitement des requêtes ajax

Dans certains cas, lors du traitement des requêtes ajax, il peut s'avérer difficile de récupérer les données. Cela s'explique par le fait que les bibliothèques ajax envoient généralement des données sous forme de données utiles json, alors que la variable superglobale $_POST ne contient que des données de formulaire.

Les données sont toujours accessibles, j'ai décrit les détails dans l'article Gestion des requêtes POST ajax.

Obtenir des données brutes

Il peut arriver qu'un utilisateur envoie une demande en utilisant une méthode HTTP inappropriée et qu'il y ajoute ses propres données. Ou, par exemple, envoie un fichier binaire, ou de mauvais en-têtes HTTP.

Pour un tel cas, il est bon d'utiliser l'entrée native, qui est obtenue en PHP comme suit :

$input = file_get_contents('php://entrée');

Lors de la mise en œuvre de la bibliothèque REST API, j'ai également rencontré un certain nombre de cas particuliers où différents types de serveurs web décidaient de manière incorrecte des en-têtes HTTP d'entrée, ou l'utilisateur soumettait de manière incorrecte les données du formulaire, etc.

Pour ce cas, j'ai pu implémenter cette fonction qui résout presque tous les cas (l'implémentation dépend de Nette\Http\RequestFactory, mais vous pouvez remplacer cette dépendance par autre chose dans votre projet spécifique) :

/**
* Obtenir les données POST directement à partir de l'en-tête HTTP, ou essayer d'analyser les données à partir de la chaîne.
* Certains clients traditionnels envoient des données au format json, qui est une chaîne de caractères de base, ce qui rend obligatoire la conversion des champs en tableaux.
*
* @return array<string|int, mixed>
*/
private function getBodyParams(string $method): array
{
if ($method === 'GET' || $method === 'DELETE') {
return [];
}
$request = (new RequestFactory())->fromGlobals();
$return = array_merge((array) $request->getPost(), $request->getFiles());
try {
$post = array_keys($_POST)[0] ?? '';
if (str_starts_with($post, '{') && str_ends_with($post, '}')) { // support pour les anciens clients
$json = json_decode($post, true, 512, JSON_THROW_ON_ERROR);
if (is_array($json) === false) {
throw new LogicException('Json n'est pas un tableau valide.');
}
unset($_POST[$post]);
foreach ($json as $key => $value) {
$return[$key] = $value;
}
}
} catch (Throwable $e) {
// Le silence est d'or.
}
try {
$input = (string) file_get_contents('php://entrée');
if ($input !== '') {
$phpInputArgs = (array) json_decode($input, true, 512, JSON_THROW_ON_ERROR);
foreach ($phpInputArgs as $key => $value) {
$return[$key] = $value;
}
}
} catch (Throwable $e) {
// Le silence est d'or.
}
return $return;
}

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
6.
Status:
All systems normal.
2024