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
- ✅ Datele pot fi salvate în bookmark-uri sau partajate prin URL.
- ✅ Ușor de testat și debug-uit.
- ❌ Limitat la lungimea URL-ului (aprox. 2000 caractere).
- ❌ Datele sunt vizibile în URL - nu folosi pentru informații sensibile.
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
- ✅ Permite trimiterea unor cantități mari de date.
- ✅ Datele nu sunt vizibile în URL.
- ❌ Nu poate fi bookmark-uit sau partajat prin URL direct.
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.
Î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:
Superglobală care stochează datele trimise prin metoda
Superglobală care stochează datele trimise prin metoda
Superglobală care combină datele din
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.
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.
Transformă caractere speciale HTML în entități sigure. Astfel, codul HTML introdus de utilizator nu va fi
interpretat, ci afișat ca text normal.
O metodă mai flexibilă de a valida și curăța date. Are diferite filtre, cum ar fi pentru email, URL sau
numere.
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.
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ă
Observație: folosim
PHP ne permite să preluăm fișiere încărcate de utilizatori prin formulare. Formularul trebuie să aibă
atributul
Acest exemplu combină tot ce am discutat: input utilizator, validare, trimitere POST și afișarea datelor în
pagina rezultat.
Superglobalele PHP pentru formulare
$_GET
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
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
$_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
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
Funcția
htmlspecialchars()Exemplu cu htmlspecialchars()
<?php
$input = '<script>alert("Hacked!")</script>';
$safeInput = htmlspecialchars($input);
echo $safeInput;
// Output: <script>alert("Hacked!")</script>
?>
Funcția
filter_var()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
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ă
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>";
?>
htmlspecialchars() pentru a preveni injectarea de cod HTML sau JavaScript.
Upload fișiere cu $_FILES
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
uploads/ trebuie să existe și să aibă permisiuni de scriere.htmlspecialchars() dacă afișezi numele fișierului încărcat pentru a
evita vulnerabilități XSS.Formular de contact complet în PHP
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
htmlspecialchars() pentru a preveni XSS și pentru a afișa corect
caracterele speciale.filter_var().foreach pentru a afișa toate erorile, dacă există.<?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