Ves al contingut principal

Mètode POST

El mètode POST s'utilitza per enviar dades al servidor per crear o actualitzar un recurs. Els paràmetres no s'envien a la URL, sinó que s'incorporen al cos de la sol·licitud HTTP. Aquesta informació no és visible a la barra d'adreces i és més segura per transmetre dades sensibles.

El mètode POST és l'estàndard per a formularis web que impliquen:

  • Inicis de sessió: enviar contrasenyes i noms d'usuari.

  • Comentaris o missatges: crear contingut nou a un lloc web.

  • Processament de pagaments: enviar informació bancària.

A PHP, el servidor rep aquestes dades en una variable superglobal diferent: $_POST, que també és un array associatiu.

Avantatges:

  • Les dades són més segures i privades.

  • No hi ha limitació de grandària (o és molt més gran que la de GET), permetent enviar fitxers grans o molt de text.

  • S'utilitza per a operacions que modifiquen l'estat del servidor (crear un usuari, enviar una comanda).

Inconvenients:

  • No es poden compartir fàcilment (no hi ha una URL única per a la sol·licitud).

  • No són indexables pels motors de cerca.

El mètode POST exemplifica la seguretat i la privacitat

Com funciona?

Quan envies un formulari amb el mètode POST, el navegador recull les dades introduïdes per l'usuari i les empaqueta en el cos de la sol·licitud. Aquesta informació no és visible a la barra d'adreces del navegador, cosa que la fa ideal per a dades sensibles.

Al servidor, un llenguatge com PHP accedeix a aquestes dades a través de l'array superglobal $_POST, que conté els valors amb les claus corresponents als noms dels camps del formulari.

Exemple: un formulari de contacte

A continuació, tenim un formulari HTML que envia dades per POST a un fitxer PHP, que les processa i les mostra.

Fitxer: contacte.php

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <title>Formulari de Contacte</title>
</head>
<body>

    <h2>Contacta amb nosaltres</h2>
    <form action="processar_contacte.php" method="post">
        <label for="nom">Nom:</label><br>
        <input type="text" id="nom" name="nom" required><br><br>
        
        <label for="email">Correu electrònic:</label><br>
        <input type="email" id="email" name="email" required><br><br>
        
        <label for="missatge">Missatge:</label><br>
        <textarea id="missatge" name="missatge" rows="4" required></textarea><br><br>
        
        <input type="submit" value="Enviar Missatge">
    </form>

</body>
</html>

Fitxer: processar_contacte.php

<?php

// Primer, comprovem si la sol·licitud s'ha enviat pel mètode POST
// if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (isset($_POST['nom']) && !empty($_POST['nom']) &&
    isset($_POST['email']) && !empty($_POST['email']) &&
    isset($_POST['missatge']) && !empty($_POST['missatge'])) {
    
    // Accedim als valors de l'array superglobal $_POST.
    // L'ús de isset() és una bona pràctica per evitar errors si els camps estan buits.
    $nom = isset($_POST['nom']) ? htmlspecialchars($_POST['nom']) : "No s'ha especificat";
    $email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : "No s'ha especificat";
    $missatge = isset($_POST['missatge']) ? htmlspecialchars($_POST['missatge']) : "No s'ha especificat";
    
    // Mostrem les dades rebudes
    echo "<h1>Missatge rebut correctament!</h1>";
    echo "<p>Gràcies, **{$nom}**.</p>";
    echo "<p>El teu correu electrònic és: {$email}</p>";
    echo "<p>El teu missatge és:</p>";
    echo "<p><em>\"{$missatge}\"</em></p>";
    
    // Aquí podríem afegir lògica addicional, com guardar les dades
    // a una base de dades, o enviar un correu electrònic.
    
} else {
    // Si la pàgina s'ha accedit directament sense enviar el formulari
    echo "<p>Aquesta pàgina s'ha de carregar des d'un formulari.</p>";
}

htmlspecialchars(): Aquesta funció és un pas de seguretat crucial. Converteix caràcters especials com < i > en entitats HTML (&lt;, &gt;). Si un usuari maliciós introduís codi HTML o JavaScript al formulari, htmlspecialchars() evitaria que el navegador l'interpretés, prevenint atacs de Cross-Site Scripting (XSS).

Un únic arxiu?

<!DOCTYPE html>
<html lang="ca">
<head>
    <meta charset="UTF-8">
    <title>Formulari de Contacte</title>
</head>
<body>

    <h2>Contacta amb nosaltres</h2>

    <?php
    // Comprovem si la sol·licitud és de tipus POST per saber si s'ha enviat el formulari.
    if ($_SERVER["REQUEST_METHOD"] == "POST") {

        // Validem que els camps obligatoris existeixin i no estiguin buits.
        if (isset($_POST['nom']) && !empty($_POST['nom']) &&
            isset($_POST['email']) && !empty($_POST['email']) &&
            isset($_POST['missatge']) && !empty($_POST['missatge'])) {
            
            // Assignem les dades a variables i les sanititzem amb htmlspecialchars().
            $nom = htmlspecialchars($_POST['nom']);
            $email = htmlspecialchars($_POST['email']);
            $missatge = htmlspecialchars($_POST['missatge']);

            // Mostrem el missatge de confirmació amb les dades rebudes.
            echo "<div style='color: green; font-weight: bold;'>";
            echo "Missatge rebut correctament! Gràcies, {$nom}.";
            echo "</div>";
            echo "<p>El teu correu electrònic és: {$email}</p>";
            echo "<p>El teu missatge és:</p>";
            echo "<p><em>\"{$missatge}\"</em></p>";
            
            // Aquí afegiries la lògica per guardar les dades, enviar un correu, etc.

        } else {
            // Missatge d'error si algun camp obligatori no s'ha omplert.
            echo "<div style='color: red; font-weight: bold;'>";
            echo "Error: Si us plau, omple tots els camps del formulari.";
            echo "</div>";
        }

    }
    ?>

    <form action="" method="post">
        <label for="nom">Nom:</label><br>
        <input type="text" id="nom" name="nom" required><br><br>
        
        <label for="email">Correu electrònic:</label><br>
        <input type="email" id="email" name="email" required><br><br>
        
        <label for="missatge">Missatge:</label><br>
        <textarea id="missatge" name="missatge" rows="4" required></textarea><br><br>
        
        <input type="submit" value="Enviar Missatge">
    </form>

</body>
</html>