HTTP Request, URL, xử lý truy vấn GET với PHP

    0

    Cấu trúc URL

    Trong gói tin HTTP Request, dòng Request Line bạn phải cung cấp một URL, thường là thông qua thanh địa chỉ của trình duyệt.

    URL là viết tắt của Uniform Resource Locator. Hiểu một cách nôm na nhất, mỗi URL là địa chỉ của một tài nguyên trên Internet.

    Đôi khi bạn còn gặp thuật ngữ URI (Uniform Resource Identifier) với ý nghĩa rất gần với URL. Nhiều người còn sử dụng lẫn lộn URI với URL.
    URI tương ứng với bất kỳ thứ gì có thể đặt tên trên Internet, bao gồm cả người, cả tài nguyên. Trong khi đó URL chỉ liên quan đến tài nguyên.
    Như vậy, URL là URI nhưng URI chưa chắc đã là URL. Nói cách khác, URL là một phần của URI.

    Cấu trúc tổng quát nhất của một URL như sau:

    scheme://host:port/path?query-string#fragment-id

    Trong đó:

    Scheme thường gặp là http, https hoặc một số giao thức khác (như ftp).

    Port chỉ định cổng mà server nhận kết nối. Port mặc định mà web server chiếm là 80. Các trình duyệt đều tự động thêm port 80. Nếu sử dụng port khác 80, bạn phải tự mình chỉ định. Ví dụ một số site quản lý có thể dùng port 8080 thay cho 80.

    Phần path có thể hiểu tương tự như đường dẫn tới một file (trên ổ cứng). Phần path đơn giản nhất chỉ chứa ký tự /. Path / có tên gọi là root (path).

    Query string chứa các cặp khóa=giá trị. Các cặp phân tách bởi ký tự &. Query string phân tách với path bởi ký tự ?. Đây là một trong các cơ chế truyền dữ liệu từ client đến server.

    Fragment (hoặc anchor) thường chỉ gặp trong các tài nguyên nội dung (như blog post) dùng để đánh dấu các tiêu đề.

    Trong các phần trên, query string và fragment là không bắt buộc.

    Riêng query string là thành phần rất quan trọng trong việc truyền dữ liệu từ trình duyệt về chương trình máy chủ web. Chúng ta sẽ nói kỹ hơn về vấn đề này ở phần tiếp theo của bài học.

    Như bạn đã học trong các bài trước, trong một ứng dụng web PHP cơ bản, bạn có thể xem mỗi URL tương ứng với một file trên server. Nếu bạn sử dụng XAMPP, đó là một file trong thư mục htdocs.

    Tuy nhiên điều này không hoàn toàn đúng. Trong các ứng dụng web, rất nhiều URL thực tế cùng được xử lý bởi một script. Để thực hiện điều này bạn cần biết về cơ chế rewrite của server – chủ đề nằm ngoài nội dung của bài học này.

    Truyền dữ liệu về server qua HTTP

    Trong các bài học trước chúng ta mới chỉ thực hiện việc xuất dữ liệu cho trình duyệt. Như bạn cũng thấy, kỹ thuật này không đủ để tạo ra các ứng dụng web thực sự.

    Một yêu cầu phổ biến khác là gửi dữ liệu từ trình duyệt cho chương trên máy chủ qua HTTP. Để hiểu các cách truyền dữ liệu, bạn cần hình dung cấu trúc gói tin HTTP.

    Gói tin HTTP thực chất là một chuỗi văn bản lớn được định dạng. Có hai loại gói tin HTTP: request – do trình duyệt gửi lên server, response – do server gửi lại trình duyệt. Hai loại gói tin này có cấu trúc khác nhau.

    Dưới đây là minh họa một gói tin request:

    Gói tin này là một chuỗi ký tự dài và chia làm 3 phần: request line, request headers, message body.

    • Đầu request line là một trong các động từ của HTTP. Phổ biến nhất là GET va POST.
    • URL (người dùng nhập qua thanh địa chỉ trình duyệt) được đặt trong request line.
    • Request headers là các cặp biến : giá trị cung cấp thông tin về trình duyệt và một số yêu cầu khác cho server.
    • Giữa headers và body có một dòng trống.

    Trình duyệt có ba cách để gửi dữ liệu về server qua truy vấn HTTP:

    (1) Tạo chuỗi truy vấn (query string) và ghép vào Url.

    Ví dụ: https://tuhocict.com?s=razor+pages là một Url chứa chuỗi truy vấn s=razor+pages. Chuỗi truy vấn và Url phân tách bởi ký tự ? (dấu chấm hỏi). Chuỗi truy vấn tạo ra từ các cặp <tham số>=<giá trị>. Các cặp này phân tách bởi ký tự &.

    Phương pháp này thường dùng với phương thức GET.

    (2) Sử dụng route data: ghép trực tiếp tham số vào Url để trở thành một segment của Url.

    Ví dụ, trong url https://tuhocict.com/topic/razor/, các segment /topic/razor thực tế là một tham số cung cấp cho page chuyên hiển thị danh sách bài viết theo chủ đề.

    Phương pháp này được sử dụng nếu không có nhiều tham số phức tạp. Ngoài ra, phương pháp này cũng tạo ra các Url “thân thiện” với máy tìm kiếm (như Google, Bing, Yandex).

    Để thực hiện cách thức này cần dùng đến cơ chế rewrite của server kết hợp routing của framework. Bình thường PHP cơ bản không làm được cách này.

    (3) Gửi dữ liệu qua thân truy vấn HTTP (phần message body).

    Dữ liệu được tạo ra giống hệt như chuỗi truy vấn trong phương pháp 1) nhưng được ghép vào phần thân (body) của truy vấn HTTP.

    Phương pháp này thường dùng với phương thức POST để truyền dữ liệu kích thước lớn (như file). Cách thức truyền dữ liệu này sẽ được xem xét riêng trong bài học về xử lý form và truy vấn POST.

    Khi dữ liệu tới chương trình, bạn cần lấy dữ liệu ra để xử lý và phản ứng lại cho phù hợp. Thao tác này gọi chung là xử lý truy vấn.

    Truy vấn GET trong PHP

    Nếu URL trong truy vấn GET chứa query string, cơ chế xử lý của PHP tự động phân tích query string và đưa kết quả vào mảng $_GET. Các kết quả lưu trong mảng $_GET có khóa và giá trị tương ứng với mỗi cặp khóa/giá trị của query string.

    Ví dụ, với truy vấn /index.php?name=Donald Trump&age=74, PHP sẽ tự động tạo ra mảng $_GET như sau:

    $_GET = ['name' => 'Donald Trump', 'age' => 74];

    Mảng $_GET là một trong các biến superglobal – biến luôn luôn được tạo ra tự động khi chạy bất kỳ script nào. Nếu URL không có query string thì $_GET trống rỗng.

    Hãy cùng thực hiện một ví dụ nhỏ.

    (1) Tạo thư mục getquery trong htdocs.

    Nếu dùng PhpStorm bạn tạo project mới từ thư mục này và thực hiện các cấu hình PhpStorm cần thiết như đã học.

    (2) Tạo file index.php và viết code như sau cho index.php:

    <?php
    
    if (isset($_GET['name'])) {
        $name = $_GET['name'];
        echo "<h1>Hello, $name. Welcome to heaven!</h1>";
    } else {
        echo "<h1>Hell world from PHP</h1>";
    }

    (3) Chạy thử với các URL khác nhau:

    localhost/getquery/index.php
    localhost/getquery/index.php?name=Donald Trump
    localhost/getquery/index.php?age=74
    localhost/getquery/index.php?age=74&name=Donald Trump

    Chỉ trong trường hợp query string chứa ?name=… thì script mới phản hồi với lời chào mừng.

    Lệnh kiểm tra if (isset($_GET[‘name’])) { … } rất quan trọng để xác định xem một tham số mình mong đợi có nằm trong query string không nhằm xác định hành động tiếp theo. Như trong ví dụ trên, chỉ khi nào có tham số ‘name’ thì mới phát lời chào mừng.

    Một cách khác để kiểm tra tham số là sử dụng hàm is_null như sau:

    $name = $_GET['name'];
    if(!is_null($name)){
        // xử lý
    }

    Một số vấn đề liên quan đến xử lý truy vấn trong PHP

    (1) Xác định loại truy vấn

    Như đã nói, có hai loại truy vấn phổ biến nhất là GET và POST. Ngoài ra trong HTTP còn các loại truy vấn khác như DELETE, PUT, PATCH.

    Để kiểm tra xem một truy vấn thuộc loại nào, bạn có thể sử dụng $_SERVER[‘REQUEST_METHOD’] như sau:

    if($_SERVER['REQUEST_METHOD'] == 'GET' {
     // Xử lý truy vấn
    }

    Các giá trị khác bao gồm ‘HEAD’, ‘POST’, ‘PUT’.

    $_SERVER cũng là một biến superglobal.

    Kỹ thuật này quan trọng trong trường hợp bạn xác định rõ script chỉ phản ứng với một loại truy vấn nhất định. Một trong những trường hơp phổ biến là xây dựng các trang “tự phục vụ”. Chúng ta sẽ quay lại vấn đề này trong bài học về truy vấn POST.

    (2) Chuyển đổi kiểu

    Trong query string mọi thứ đều được xem là chuỗi ký tự (string). PHP hỗ trợ tự động biến đổi kiểu khi cần thiết (trong các phép toán), đặc biệt là biến đổi chuỗi về số.

    Hãy xem ví dụ sau:

    <?php
    // index.php
    function fact($n) {
        $p = 1;
        for($i = 1; $i <= $n; $i+=1)
            $p *= $i;
        return $p;
    }
    
    if (isset($_GET['number'])) {
        $number = $_GET['number'];
        $fact = fact($number);
        echo "<h1>$number! = $fact</h1>";
    } else {
        echo "<h1>Hell world from PHP</h1>";
    }

    Hãy thử với các query string:

    /index.php?number=4
    /index.php?number=4xyz
    /index.php?number=xyz

    Ở đây nếu tham số ‘number’ chỉ chứa chữ số (và có thể chuyển đổi về số), PHP sẽ tự động làm việc đó thay bạn. Nếu ‘number’ có dạng bất thường, ví dụ bắt đầu bằng số nhưng chứa thêm chữ cái 4xyz, PHP tự lấy số 4 để sử dụng. Nếu không thể chuyển đổi về số (number=xyz) để thực hiện trong phép toán, PHP sẽ để biến liên quan với giá trị mặc định 0.

    Quá trình này không sinh ra bất kỳ lỗi gì!

    (3) Lấy chính query string

    Mặc dù không phải là yêu cầu quá phổ biến, nếu cần thiết bạn có thể lấy chính chuỗi query string từ truy vấn:

    echo $_SERVER['QUERY_STRING'] ."<br />";

    Khi này nếu truy xuất URL http://localhost/getquery/index.php?name=Donald%20Trump&age=30 bạn sẽ thu được

    name=Donald%20Trump&age=30

    (4) Lấy chuỗi URI của truy vấn

    Bạn sử dụng cách viết sau:

    echo $_SERVER['REQUEST_URI'] ."<br/>";

    Khi này, với URL http://localhost/getquery/index.php?name=Donald%20Trump&age=30 bạn sẽ thu được

    /getquery/index.php?name=Donald%20Trump&age=30

    Kết luận

    Trong bài học này chúng ta đã làm quen với truy vấn HTTP và cấu trúc URL.

    Chúng ta cũng làm quen với cách thức lấy thông tin cơ bản từ truy vấn, bao gồm loại truy vấn, chuỗi truy vấn, URI của truy vấn.

    Chúng ta cũng học cách xử lý riêng truy vấn GET trong PHP.

    Nhìn chung cách làm việc với tham số của truy vấn trong PHP khá đơn giản. Ứng với mỗi loại truy vấn, PHP cung cấp một biến mảng superglobal chứa những thông tin thu được.

    Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần Thảo luận cuối trang.
    Nếu cần trao đổi riêng với chúng tôi, hãy gửi email hoặc nhắn tin qua form liên hệ.
    Nếu bài viết hữu ích với bạn, hãy giúp chúng tôi chia sẻ tới mọi người.
    Đăng ký theo dõi trang facebook để nhận thông tin về bài viết mới.
    Tắt Adblocker hoặc whitelist trang để hỗ trợ chúng tôi.
    Cảm ơn bạn!

    * Bản quyền bài viết thuộc về Tự học ICT. Đề nghị tôn trọng bản quyền. DMCA.com Protection Status
    Subscribe
    Notify of
    guest
    0 Thảo luận
    Inline Feedbacks
    View all comments