0

PHP và MySQL Bài 12: Phương thức $_GET và $_POST - Bản chất và cách ứng dụng

Trong các bài học trước, các biến và dữ liệu đều do chúng ta tự gán cứng (hardcode) vào mã nguồn. Tuy nhiên, một trang web thực tế cần sự tương tác: người dùng gõ từ khóa tìm kiếm, đăng nhập tài khoản, hoặc điền form đăng ký.

Để PHP (Server) có thể "hứng" được dữ liệu do Trình duyệt (Client) gửi lên, chúng ta sử dụng hai "biến siêu toàn cục" (Superglobals) đặc biệt là $_GET$_POST.

1. Biến siêu toàn cục (Superglobals) là gì?

Trong PHP, $_GET$_POST thực chất là hai Mảng kết hợp (Associative Arrays) đã được hệ thống tạo sẵn. Điểm đặc biệt của chúng là có tính "siêu toàn cục" - nghĩa là bạn có thể gọi và sử dụng chúng ở bất kỳ đâu trong kịch bản PHP (kể cả bên trong hàm) mà không cần dùng từ khóa global.

Dữ liệu bên trong hai mảng này được tự động phân tách dựa trên các trường (fields) mà người dùng gửi lên.


2. Phương thức $_GET - Công khai và Nhanh chóng

Khi Client gửi dữ liệu lên Server bằng phương thức GET, toàn bộ dữ liệu sẽ được đính kèm trực tiếp vào thanh địa chỉ URL của trình duyệt.

Đoạn dữ liệu này được gọi là Query String, bắt đầu bằng dấu chấm hỏi ? và các cặp key=value được nối với nhau bằng dấu &.

Ví dụ: Khi bạn vào trang tìm kiếm và gõ chữ "php", URL sẽ trông như thế này: http://localhost/search.php?keyword=php&page=1

Cách PHP hứng dữ liệu GET:

<?php
    // Kiểm tra xem người dùng có gửi 'keyword' lên không
    if (isset($_GET['keyword'])) {
        $tuKhoa = $_GET['keyword'];
        $trang = $_GET['page'];
        
        echo "Bạn đang tìm kiếm từ khóa: " . $tuKhoa . "<br>";
        echo "Đang hiển thị kết quả ở trang: " . $trang;
    } else {
        echo "Vui lòng nhập từ khóa tìm kiếm.";
    }
?>

Đặc điểm của GET:

  • Có thể lưu lại (Bookmarkable): Vì dữ liệu nằm trên URL, người dùng có thể lưu link, chia sẻ cho người khác hoặc tải lại trang mà không bị hỏi lại.
  • Giới hạn độ dài: URL có giới hạn độ dài (thường khoảng 2048 ký tự tùy trình duyệt), nên GET không thể gửi lượng dữ liệu lớn.
  • Kém bảo mật: Tuyệt đối không bao giờ dùng GET để gửi mật khẩu hoặc thông tin nhạy cảm vì chúng sẽ phơi bày toàn bộ trên thanh địa chỉ và lưu vào lịch sử trình duyệt.

3. Phương thức $_POST - Kín đáo và Mạnh mẽ

Trái ngược với GET, phương thức POST sẽ đóng gói dữ liệu và gửi ngầm bên trong phần thân của yêu cầu HTTP (HTTP Request Body). Dữ liệu hoàn toàn vô hình trên thanh địa chỉ URL.

POST thường được kích hoạt thông qua việc người dùng nhấn nút Submit trên một Form HTML.

Mô phỏng Form HTML gửi dữ liệu POST:

<!-- Thuộc tính method="POST" chỉ định cách gửi dữ liệu -->
<form action="login.php" method="POST">
    <input type="text" name="username" placeholder="Tên đăng nhập">
    <input type="password" name="password" placeholder="Mật khẩu">
    <button type="submit">Đăng nhập</button>
</form>

Cách PHP hứng dữ liệu POST (tại file login.php):

<?php
    // Hứng dữ liệu dựa vào thuộc tính 'name' của các thẻ input
    if (isset($_POST['username']) && isset($_POST['password'])) {
        $taiKhoan = $_POST['username'];
        $matKhau = $_POST['password'];
        
        // Thực hiện logic kiểm tra với Database tại đây
        echo "Đang xử lý đăng nhập cho tài khoản: " . $taiKhoan;
        // Lưu ý: Không bao giờ in mật khẩu ra màn hình trong thực tế!
    }
?>

Đặc điểm của POST:

  • Kín đáo: Dữ liệu không hiển thị trên URL, an toàn hơn so với GET khi truyền tải thông tin nhạy cảm.
  • Không giới hạn: Có thể gửi lượng dữ liệu khổng lồ (phụ thuộc vào cấu hình post_max_size trên máy chủ).
  • Hỗ trợ Upload file: Chỉ có phương thức POST mới có thể được sử dụng để tải các tệp tin (hình ảnh, tài liệu) lên máy chủ.

4. Bảng So Sánh và Tiêu Chuẩn Áp Dụng

Để quyết định khi nào dùng GET, khi nào dùng POST, bạn chỉ cần ghi nhớ bảng quy chuẩn sau:

Tiêu chí Phương thức $_GET Phương thức $_POST
Vị trí dữ liệu Hiển thị trên thanh địa chỉ URL. Nằm ẩn trong phần Body của HTTP Request.
Mục đích chính Lấy dữ liệu (Đọc, tìm kiếm, lọc, phân trang). Thay đổi dữ liệu (Thêm, sửa, xóa, đăng ký, đăng nhập).
Giới hạn kích thước Có giới hạn (Thường < 2KB). Không giới hạn (Tùy cấu hình Server).
Lưu lịch sử / Cache Trình duyệt có lưu lại lịch sử và cache. Trình duyệt không lưu lịch sử, không cache.
Bảo mật Rất thấp (Tuyệt đối không gửi Password). Cao hơn (An toàn hơn cho dữ liệu nhạy cảm).

Tổng kết

Hiểu rõ sự khác biệt giữa $_GET$_POST là nền tảng để bạn thiết kế các luồng giao tiếp chuẩn xác giữa người dùng và hệ thống Backend. Hãy nhớ nguyên tắc cơ bản: GET để "hỏi" lấy thông tin, POST để "đưa" thông tin lên xử lý.

Tuy nhiên, việc hứng dữ liệu trực tiếp từ người dùng luôn tiềm ẩn những rủi ro bảo mật vô cùng lớn. Đừng vội mang dữ liệu nhận được đi xử lý ngay. Ở Bài 13: Xử lý form HTML và Validate dữ liệu cơ bản, chúng ta sẽ học cách thiết lập các "chốt chặn" để làm sạch và kiểm tra tính hợp lệ của dữ liệu đầu vào.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.