Curs Web Development
Curs HTML
Curs CSS
Curs Javascript
Curs PHP
Curs Phyton
Curs SQL
Curs SEO

Formulare în PHP & Input utilizator

Formularele HTML permit utilizatorilor să trimită date către server. În PHP, aceste date sunt preluate și procesate pentru a crea pagini dinamice, a salva informații în baze de date sau a interacționa cu aplicații web. Înainte să intrăm în detaliile tehnice, trebuie să înțelegem două metode principale de transmitere a datelor: GET și POST.

Ce este metoda GET?

Metoda GET trimite datele formularului prin URL. Aceasta înseamnă că informațiile apar în bara de adrese a browserului sub formă de perechi cheie=valoare, separate prin simbolul &. GET este folosit de obicei pentru acțiuni care nu modifică datele pe server, cum ar fi căutările sau filtrarea unui catalog de produse.

Avantaje și dezavantaje GET

Exemplu simplu GET

<!DOCTYPE html>
<html>
<body>

<form action="rezultat.php" method="get">
  Nume: <input type="text" name="nume"><br>
  Vârsta: <input type="number" name="varsta"><br>
  <input type="submit" value="Trimite">
</form>

</body>
</html>

Ce este metoda POST?

Metoda POST trimite datele în corpul cererii HTTP, nu în URL. Aceasta permite trimiterea unui volum mai mare de date și este mai sigură pentru informații sensibile, cum ar fi parole sau mesaje private. POST este folosit pentru acțiuni care modifică date pe server, cum ar fi înregistrarea unui utilizator sau trimiterea unui formular de contact.

Exemplu simplu POST

<!DOCTYPE html>
<html>
<body>

<form action="rezultat.php" method="post">
  Email: <input type="email" name="email"><br>
  Parolă: <input type="password" name="parola"><br>
  <input type="submit" value="Trimite">
</form>

</body>
</html>

Avantaje și dezavantaje POST

Acum că am înțeles conceptele de bază ale metodelor GET și POST, putem trece la modul în care PHP preia aceste date folosind superglobalele $_GET și $_POST.

Superglobalele PHP pentru formulare

În PHP, datele trimise prin formulare nu sunt accesibile direct ca variabile normale. Ele sunt disponibile prin superglobale, care sunt variabile predefinite, globale și disponibile în orice context al scriptului. Cele mai importante pentru formulare sunt:

$_GET

Superglobală care stochează datele trimise prin metoda GET. Este un array asociativ, unde cheia este numele câmpului din formular, iar valoarea este ce a introdus utilizatorul.

Exemplu

<?php
// URL: form.php?nume=Ioan&varsta=30
echo "Numele este: " . $_GET['nume'];   // afișează: Numele este: Ioan
echo "Vârsta este: " . $_GET['varsta']; // afișează: Vârsta este: 30
?>

$_POST

Superglobală care stochează datele trimise prin metoda POST. De asemenea, este un array asociativ cu cheia numelui câmpului și valoarea introdusă de utilizator. POST este mai sigur decât GET pentru date sensibile și poate transporta mai multe informații.

Exemplu

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nume = $_POST['nume'];
    $email = $_POST['email'];
    echo "Salut, $nume! Am primit email-ul: $email";
}
?>

$_REQUEST

Superglobală care combină datele din $_GET, $_POST și $_COOKIE. Este mai puțin recomandată pentru proiecte mari, deoarece poate fi mai greu de controlat de unde vin exact datele.

$_SERVER

O superglobală care oferă informații despre server și despre cererea HTTP curentă. De exemplu, putem verifica metoda folosită (GET sau POST) sau adresa scriptului curent.

Exemplu: verificarea metodei formularului

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    echo "Formularul a fost trimis prin POST!";
} else {
    echo "Formularul nu a fost încă trimis.";
}
?>

Sanitizarea datelor în PHP

Atunci când utilizatorii trimit date prin formulare, nu trebuie să avem încredere că acestea sunt sigure. Un utilizator rău intenționat poate trimite cod HTML, JavaScript sau alte lucruri periculoase. De aceea, trebuie să sanitizăm datele înainte să le folosim sau să le afișăm.

Funcția htmlspecialchars()

Transformă caractere speciale HTML în entități sigure. Astfel, codul HTML introdus de utilizator nu va fi interpretat, ci afișat ca text normal.

Exemplu cu htmlspecialchars()

<?php
$input = '<script>alert("Hacked!")</script>';
$safeInput = htmlspecialchars($input);

echo $safeInput;
// Output: <script>alert("Hacked!")</script>
?>

Funcția filter_var()

O metodă mai flexibilă de a valida și curăța date. Are diferite filtre, cum ar fi pentru email, URL sau numere.

Exemplu: validare email

<?php
$email = "user@example.com";
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Email valid: $email";
} else {
    echo "Email invalid!";
}
?>

Exemplu: curățare string

<?php
$input = " <b>Salut!</b> ";
$sanitized = filter_var($input, FILTER_SANITIZE_STRING);
echo $sanitized; // Output: Salut!
?>

Validarea câmpurilor obligatorii

Este important să verificăm dacă utilizatorul a completat toate câmpurile necesare. Dacă un câmp obligatoriu este gol, trebuie să afișăm un mesaj de eroare și să nu procesăm datele.

Exemplu simplu de validare

<?php
$errors = [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nume = trim($_POST['nume']); // eliminăm spațiile la început și sfârșit
    $email = trim($_POST['email']);

    if (empty($nume)) {
        $errors[] = "Câmpul Nume este obligatoriu.";
    }

    if (empty($email)) {
        $errors[] = "Câmpul Email este obligatoriu.";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "Adresa de email nu este validă.";
    }

    if (empty($errors)) {
        echo "Datele sunt valide! Nume: $nume, Email: $email";
    } else {
        foreach ($errors as $eroare) {
            echo "<p style='color:red;'>$eroare</p>";
        }
    }
}
?>

Trimiterea și afișarea datelor într-o pagină nouă

Când utilizatorul completează un formular, putem trimite datele către aceeași pagină sau către o altă pagină. În acest exemplu vom trimite datele către o pagină nouă numită rezultat.php.

Formular HTML

<form action="rezultat.php" method="post">
    <label for="nume">Nume:</label>
    <input type="text" name="nume" id="nume" required><br><br>

    <label for="email">Email:</label>
    <input type="email" name="email" id="email" required><br><br>

    <input type="submit" value="Trimite">
</form>

Pagina rezultat.php

<?php
// Primim datele din formular
$nume = htmlspecialchars($_POST['nume']);
$email = htmlspecialchars($_POST['email']);

echo "<p>Salut, $nume!</p>";
echo "<p>Email-ul tău este: $email</p>";
?>

Observație: folosim htmlspecialchars() pentru a preveni injectarea de cod HTML sau JavaScript.

Upload fișiere cu $_FILES

PHP ne permite să preluăm fișiere încărcate de utilizatori prin formulare. Formularul trebuie să aibă atributul enctype="multipart/form-data".

Formular pentru upload fișier

<form action="upload.php" method="post" enctype="multipart/form-data">
    <label for="fisier">Alege fișier:</label>
    <input type="file" name="fisier" id="fisier" required><br><br>

    <input type="submit" value="Încarcă">
</form>

Pagina upload.php

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_FILES['fisier']) && $_FILES['fisier']['error'] === 0) {
        $numeFisier = $_FILES['fisier']['name'];
        $tmpLocatie = $_FILES['fisier']['tmp_name'];
        $folderDestinatie = 'uploads/' . $numeFisier;

        // Mutăm fișierul în folderul uploads
        if (move_uploaded_file($tmpLocatie, $folderDestinatie)) {
            echo "<p>Fișierul $numeFisier a fost încărcat cu succes!</p>";
        } else {
            echo "<p style='color:red;'>A apărut o eroare la încărcare.</p>";
        }
    } else {
        echo "<p style='color:red;'>Nu a fost selectat niciun fișier sau a apărut o eroare.</p>";
    }
}
?>

Observații importante

Formular de contact complet în PHP

Acest exemplu combină tot ce am discutat: input utilizator, validare, trimitere POST și afișarea datelor în pagina rezultat.

contact.php - Formularul

<?php
// Dacă au fost trimise date anterior, le putem păstra în form pentru a evita reintroducerea
$nume = $_POST['nume'] ?? '';
$email = $_POST['email'] ?? '';
$mesaj = $_POST['mesaj'] ?? '';
$eroare = '';
?>

<form action="contact-rezultat.php" method="post">
    <label for="nume">Nume:</label>
    <input type="text" name="nume" id="nume" value="<?php echo htmlspecialchars($nume); ?>" required><br><br>

    <label for="email">Email:</label>
    <input type="email" name="email" id="email" value="<?php echo htmlspecialchars($email); ?>" required><br><br>

    <label for="mesaj">Mesaj:</label><br>
    <textarea name="mesaj" id="mesaj" rows="5" required><?php echo htmlspecialchars($mesaj); ?></textarea><br><br>

    <input type="submit" value="Trimite">
</form>

<?php
if ($eroare) {
    echo "<p style='color:red;'>$eroare</p>";
}
?>

contact-rezultat.php - Procesare și afișare

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Preluăm datele și le curățăm
    $nume = htmlspecialchars($_POST['nume']);
    $email = htmlspecialchars($_POST['email']);
    $mesaj = htmlspecialchars($_POST['mesaj']);

    // Validări simple
    $erori = [];
    if (empty($nume)) $erori[] = "Numele este obligatoriu.";
    if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) $erori[] = "Email valid este obligatoriu.";
    if (empty($mesaj)) $erori[] = "Mesajul nu poate fi gol.";

    if (!empty($erori)) {
        echo "<p style='color:red;'>Au apărut erori:</p>";
        echo "<ul style='color:red;'>";
        foreach ($erori as $e) {
            echo "<li>$e</li>";
        }
        echo "</ul>";
        echo "<a href='contact.php'>Înapoi la formular</a>";
        exit;
    }

    // Afișăm datele dacă totul este corect
    echo "<h3>Mesaj trimis cu succes!</h3>";
    echo "<p><strong>Nume:</strong> $nume</p>";
    echo "<p><strong>Email:</strong> $email</p>";
    echo "<p><strong>Mesaj:</strong><br>$mesaj</p>";
} else {
    echo "<p style='color:red;'>Acces nepermis direct la această pagină.</p>";
}
?>

Explicații suplimentare

  • Folosește htmlspecialchars() pentru a preveni XSS și pentru a afișa corect caracterele speciale.
  • Validăm că toate câmpurile sunt completate și că email-ul este valid folosind filter_var().
  • Am folosit foreach pentru a afișa toate erorile, dacă există.
  • Formularul trimite datele prin POST către o altă pagină, conform celor mai bune practici.
🔧 Exemplu PHP:
<?php
// Exemplu simplu de formular și procesare
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $nume = htmlspecialchars($_POST['nume'] ?? '');
    $email = htmlspecialchars($_POST['email'] ?? '');
    $mesaj = htmlspecialchars($_POST['mesaj'] ?? '');
    echo "<h3>Mesaj primit!</h3>";
    echo "<p>Nume: $nume<p>";
    echo "<p>Email: $email<p>";
    echo "<p>Mesaj: $mesaj<p>";
} else {
?>
<form method="post">
    <label>Nume: <input type="text" name="nume" required></label><br><br>
    <label>Email: <input type="email" name="email" required></label><br><br>
    <label>Mesaj:<br><textarea name="mesaj" rows="4" required></textarea></label><br><br>
    <input type="submit" value="Trimite">
</form>
<?php
}
?>

🧠 Quiz - Formulare & Input utilizator în PHP

Top