Trong các bài học trước, chúng ta chủ yếu chạy những đoạn mã PHP cố định trên server. Nhưng để xây dựng ứng dụng web tương tác, chúng ta cần lấy dữ liệu từ người dùng. Form (biểu mẫu) chính là cách để người dùng nhập thông tin và gửi lên server. Trong bài này, chúng ta sẽ tìm hiểu cách xử lý form trong PHP thông qua hai phương thức HTTP phổ biến là GET và POST.
1. Form là gì?
Form (biểu mẫu) trong lập trình web là một khu vực trên trang web cho phép người dùng nhập dữ liệu (ví dụ: nhập văn bản, chọn tùy chọn, v.v.) và gửi dữ liệu đó đến server. Mỗi form HTML thường gồm các thành phần như ô nhập liệu (input
, textarea
), menu chọn (select
), nút chọn (radio
, checkbox
) và nút Submit để gửi form. Khi người dùng nhấn submit, trình duyệt sẽ tạo một yêu cầu (request) gửi đến server theo phương thức được chỉ định (GET hoặc POST).
Trong PHP, việc "xử lý form" nghĩa là chúng ta viết mã để nhận dữ liệu mà người dùng đã gửi lên và thực hiện các hành động cần thiết (ví dụ: lưu vào cơ sở dữ liệu, tính toán, phản hồi lại kết quả...). Dữ liệu từ form gửi lên sẽ được PHP tự động lưu vào các biến toàn cục tương ứng: nếu form dùng phương thức GET thì dữ liệu nằm trong $_GET
, còn nếu dùng POST thì dữ liệu nằm trong $_POST
. Chúng ta sẽ lần lượt xem chi tiết từng phương thức.
2. Phương thức GET
GET là phương thức gửi dữ liệu kèm theo URL. Cụ thể, các dữ liệu từ form sẽ được trình duyệt gắn vào phần query string (chuỗi truy vấn) của URL khi gửi đến server. Điều này đồng nghĩa với việc thông tin người dùng nhập sẽ hiển thị ngay trên thanh địa chỉ trình duyệt dưới dạng các tham số URL.
Phương thức GET thường được dùng cho các form đọc dữ liệu hoặc các thao tác không làm thay đổi trạng thái trên server (ví dụ: form tìm kiếm, lọc kết quả) vì người dùng có thể dễ dàng đánh dấu (bookmark) hoặc chia sẻ URL chứa kết quả truy vấn. Tuy nhiên, do dữ liệu nằm trên URL nên không nên dùng GET cho các thông tin nhạy cảm (như mật khẩu), và lượng dữ liệu gửi bằng GET cũng bị giới hạn (URL quá dài có thể không hoạt động trên một số trình duyệt).
Khi xử lý form GET trong PHP, chúng ta sẽ sử dụng biến toàn cục $_GET
(một mảng associative) để lấy các giá trị. Mỗi trường (field) trong form sẽ tương ứng với một phần tử trong $_GET
, với key chính là tên trường (định nghĩa bởi thuộc tính name của input). Hãy xem ví dụ sau đây để hiểu rõ hơn.
Ví dụ: Tạo một form đơn giản để người dùng nhập tên và tuổi, gửi dữ liệu bằng phương thức GET, sau đó PHP sẽ xử lý và hiển thị lại thông tin.
<!-- file form_get.php -->
<form action="xu_ly_get.php" method="GET">
Nhập tên: <input type="text" name="ten"><br>
Nhập tuổi: <input type="text" name="tuoi"><br>
<input type="submit" value="Gửi">
</form>
<!-- file xu_ly_get.php -->
<?php
// Lấy dữ liệu từ form gửi lên bằng phương thức GET
$ten = $_GET['ten'];
$tuoi = $_GET['tuoi'];
echo "Chào $ten, bạn $tuoi tuổi.";
?>
Trong ví dụ trên, file form_get.php
chứa một form với hai ô nhập liệu là tên và tuổi. Mỗi ô đều có thuộc tính name
(ten
và tuoi
) để định danh dữ liệu. Thuộc tính method="GET"
cho biết form sẽ gửi dữ liệu bằng phương thức GET, và action="xu_ly_get.php
" chỉ định URL (file) sẽ nhận và xử lý dữ liệu gửi lên. Khi người dùng nhập tên và tuổi rồi bấm nút "Gửi", trình duyệt sẽ gửi yêu cầu đến server theo URL đã chỉ định. Dữ liệu được gắn vào cuối URL dưới dạng tham số truy vấn.
Ví dụ, nếu người dùng nhập tên là "Ngọc" và tuổi là "30", khi submit, trình duyệt sẽ chuyển tới URL:
xu_ly_get.php?ten=Ng%E1%BB%8Dc&tuoi=30
Trên thanh địa chỉ, ta có thể thấy sau tên file xu_ly_get.php
là dấu ?
, tiếp theo là cặp ten=Ngọc
và tuoi=30
nối với nhau bằng dấu &
.
Lưu ý: trình duyệt tự động mã hóa các ký tự đặc biệt và dấu tiếng Việt – ví dụ "Ngọc" hiển thị thành
Ng%E1%BB%8Dc
– nhưng PHP sẽ giải mã để thu được chuỗi gốc "Ngọc".
Tại file xu_ly_get.php
, PHP sẽ tự động điền các giá trị vào mảng $_GET
với các key tương ứng. Cụ thể, $_GET['ten']
sẽ là chuỗi "Ngọc"
, và $_GET['tuoi']
là chuỗi "30"
. Code xử lý chỉ việc đọc các giá trị này (ở ví dụ trên, gán vào biến $ten
và $tuoi
cho dễ dùng) rồi dùng echo
để hiển thị kết quả. Khi chạy xu_ly_get.php
với dữ liệu trên, trang sẽ in ra: “Chào Ngọc, bạn 30 tuổi.”
3. Phương thức POST
POST là phương thức gửi form ngầm trong phần thân (body) của yêu cầu HTTP, không đính kèm dữ liệu lên URL. Khi dùng POST, người dùng sẽ không thấy các thông tin đã nhập xuất hiện trên thanh địa chỉ. Điều này giúp bảo mật thông tin tốt hơn (ví dụ không lộ mật khẩu trên URL) và cũng cho phép gửi lượng dữ liệu lớn (ví dụ nội dung bài viết dài, dữ liệu file upload).
Phương thức POST thường được sử dụng cho các form thay đổi dữ liệu trên server hoặc chứa thông tin nhạy cảm, chẳng hạn như form đăng ký, đăng nhập, form gửi bài viết, v.v. Mặc dù dữ liệu POST không hiển thị công khai, bạn vẫn nên sử dụng kết hợp với các biện pháp bảo mật khác (như mã hóa HTTPS) khi gửi thông tin quan trọng, vì dữ liệu có thể bị chặn trên đường truyền nếu không được mã hóa.
Tương tự như với GET, PHP cung cấp mảng toàn cục $_POST
để chúng ta truy xuất dữ liệu từ form gửi bằng phương thức POST. Cách sử dụng cũng giống $_GET
: mỗi trường form (theo name
) sẽ tương ứng một phần tử trong $_POST
. Hãy xem ví dụ tương tự như trên nhưng sử dụng POST.
Ví dụ: Vẫn là form nhập tên và tuổi, nhưng lần này gửi bằng phương thức POST.
<!-- file form_post.php -->
<form action="xu_ly_post.php" method="POST">
Nhập tên: <input type="text" name="ten"><br>
Nhập tuổi: <input type="text" name="tuoi"><br>
<input type="submit" value="Gửi">
</form>
<!-- file xu_ly_post.php -->
<?php
// Lấy dữ liệu từ form gửi lên bằng phương thức POST
$ten = $_POST['ten'];
$tuoi = $_POST['tuoi'];
echo "Chào $ten, bạn $tuoi tuổi.";
?>
Trong ví dụ này, phần HTML của form gần như giống hệt form GET ở ví dụ trước, chỉ khác là chúng ta để method="POST"
. Khi người dùng nhấn "Gửi", trình duyệt sẽ gửi yêu cầu tới file xu_ly_post.php
. Dữ liệu tên và tuổi không gắn trên URL nữa, mà được đóng gói trong phần body của request. Kết quả là người dùng sẽ được chuyển đến trang xu_ly_post.php
với URL hiển thị chỉ là xu_ly_post.php
(không có chuỗi tham số nào phía sau).
Tại xu_ly_post.php
, PHP nhận dữ liệu và lưu vào mảng $_POST
. Chúng ta lấy ra tương tự như với GET: $ten = $_POST['ten']
, $tuoi = $_POST['tuoi']
. Sau đó sử dụng những dữ liệu này (ở đây đơn giản là in ra màn hình). Ví dụ, nếu tên nhập là "Ngọc" và tuổi "30" như trước, kết quả in ra vẫn sẽ là: “Chào Ngọc, bạn 30 tuổi.”. Điểm khác biệt nằm ở chỗ thanh địa chỉ không hiển thị thông tin ten
và tuoi
như phương thức GET nữa.
Nhìn bề ngoài, việc xử lý trong PHP với $_GET
hay $_POST
là tương tự nhau – đều truy cập phần tử mảng theo tên trường. Tuy nhiên, GET và POST có những điểm khác biệt quan trọng mà bạn cần nắm để sử dụng đúng trường hợp.
4. So sánh phương thức GET và POST
Cả GET và POST đều dùng để gửi dữ liệu từ client (trình duyệt) lên server, nhưng chúng khác nhau về cách thức và phù hợp cho những tình huống khác nhau. Dưới đây là một số điểm so sánh chính:
Vị trí dữ liệu: Phương thức GET gắn dữ liệu ngay trên URL (sau dấu
?
của URL, các cặpname=value
nối với nhau bằng dấu&
). Còn POST gửi dữ liệu trong body của HTTP request, hoàn toàn không hiển thị trên URL.Truy xuất trong PHP: Dữ liệu gửi lên bằng GET được PHP lưu trong mảng toàn cục
$_GET
, còn dữ liệu gửi bằng POST được lưu trong$_POST.
Do đó, bạn phải sử dụng đúng biến tương ứng để lấy giá trị. (Nếu gửi form bằng POST mà lại cố lấy bằng$_GET
hoặc ngược lại thì sẽ không nhận được dữ liệu).Giới hạn dung lượng: Thông thường, phương thức GET chỉ gửi được lượng dữ liệu rất giới hạn – một URL quá dài có thể bị cắt bỏ hoặc không được chấp nhận bởi trình duyệt. (Giới hạn này khác nhau tùy trình duyệt, khoảng tầm 2048 ký tự đối với nhiều trình duyệt phổ biến). Ngược lại, phương thức POST cho phép gửi dữ liệu lớn hơn nhiều, phù hợp khi bạn cần gửi các nội dung văn bản dài hoặc nhiều trường thông tin.
Tính bảo mật: GET không an toàn để truyền thông tin nhạy cảm vì dữ liệu hiển thị công khai trên URL và có thể bị lưu lại trong lịch sử trình duyệt hoặc log server. Với POST, dữ liệu được gửi ngầm nên bảo mật hơn GET về mặt hiển thị (dù vẫn có rủi ro nếu không dùng HTTPS). Do đó, các thông tin như mật khẩu, thông tin cá nhân quan trọng nên được gửi bằng POST thay vì GET.
Khả năng bookmark/cache: URL chứa tham số GET có thể bookmark (đánh dấu) hoặc chia sẻ trực tiếp cho người khác, và kết quả tương ứng có thể được truy cập lại dễ dàng. Điều này rất tiện cho các trang tra cứu hoặc tìm kiếm. Ngược lại, kết quả từ form gửi bằng POST không thể đơn giản lưu bằng URL, vì vậy POST thích hợp cho các hành động một lần (ví dụ gửi form đăng ký) hơn là các trang cần truy cập lặp lại kết quả.
Upload file: Nếu bạn cần gửi tập tin (file) từ client lên server (ví dụ form cho phép người dùng chọn ảnh để upload), bạn bắt buộc phải dùng phương thức POST kèm với thuộc tính
enctype="multipart/form-data"
trong form. Phương thức GET không hỗ trợ upload file. (Chúng ta sẽ tìm hiểu chi tiết cách xử lý upload file trong PHP ở bài học khác).
Tóm lại, GET thích hợp cho các truy vấn đơn giản, không nhạy cảm và muốn tận dụng việc lưu lại URL, còn POST thích hợp cho các form phức tạp, dữ liệu nhạy cảm hoặc thao tác làm thay đổi dữ liệu trên server. Khi thiết kế chức năng web, bạn hãy cân nhắc lựa chọn phương thức phù hợp để đảm bảo tiện lợi và an toàn.
5. Lời kết
Qua bài học này, hy vọng các bạn đã hiểu cách tạo form HTML và xử lý dữ liệu gửi lên bằng phương thức GET và POST trong PHP. Đây là kiến thức nền tảng quan trọng giúp chúng ta tạo ra các trang web có tương tác với người dùng, thay vì chỉ hiển thị nội dung tĩnh. Hãy thử tự mình xây dựng vài form đơn giản (ví dụ: form nhập thông tin cá nhân và hiển thị lại, form tìm kiếm giả lập, v.v.) để rèn luyện kỹ năng xử lý form.
Ở các bài trước, chúng ta đã làm quen với nhiều khía cạnh cơ bản của PHP. Việc xử lý form bằng GET/POST sẽ mở đường cho nhiều ứng dụng thực tế, đặc biệt là khi kết hợp với cơ sở dữ liệu hay các kỹ thuật khác. Bài tiếp theo, chúng ta sẽ tìm hiểu cách upload file từ form lên server bằng PHP, một chức năng rất hữu dụng và là minh chứng rõ rệt cho sức mạnh của phương thức POST. Hẹn gặp các bạn ở bài học tiếp theo nhé!