Tiếp tục series học PHP căn bản, ở bài 13 này chúng ta sẽ học về 2 phương thức truyền tải dữ liệu thông dụng trong mô hình Client-Server đó là Get và Post. Các bạn có thể xem lại khái niệm của Client-Server.
Phương thức GET trong PHP
Khi người dùng phía client sử dụng phương thức GET gửi dữ liệu lên server thông qua các tham số (parameter) trên thanh địa chỉ URL của Browser. Các tham số trên URL bắt đầu bằng dấu chấm hỏi ( ? ) và được ngăn cách với nhau bởi dấu và ( & ). Server sẽ phân tích tất cả những thông tin đằng sau dấu hỏi (?) chính là phần dữ liệu mà Client gửi lên.
Ví dụ: ta có URL https://tanhongit.net/?p=7740&preview=true
Khi truy cập, từ Server sẽ hiểu giá trị p = 7740 và giá trị preview = true.
Đó là ví dụ về phần Client truy cập từ thanh địa chỉ URL. Chúng ta bây giờ sẽ chuyên sang các vấn đề trong code PHP.
Trong code khi các dữ liệu mà Client gửi lên bằng phương thức GET đều được lưu trong một biến toàn cục mà PHP tự tạo ra đó là biến $_GET. ( $_GET là một biến toàn cục lưu trữ dưới dạng mảng bất tuần tự.)
<?php $_GET = [ 'name' => 'TanHongIT', 'website' => 'tanhongit.net' ]; ?> //biến $_GET là một mảng chứa nhiều phần tử
Lưu ý về phương thức GET trong PHP
- Phương thức GET được giới hạn gửi tối đa chỉ 1024 ký tự.
- Không bao giờ sử dụng phương thức GET nếu gửi password hoặc thông tin nhay cảm lên Server.
- GET không thể gửi dữ liệu nhị phân, ví dụ như hình ảnh hoặc các loại tài liệu lên Server.
- Dữ liệu gửi bởi phương thức GET có thể được truy cập bằng cách sử dụng biến môi trường QUERY_STRING.
- PHP cung cấp mảng liên hợp $_GET để truy cập tất cả các thông tin đã được gửi bởi phương thức GET.
Ví dụ thực hành
Ví dụ 1: Bạn khởi tạo 1 file demo.php nằm trong thư mục WWW của WampServer hoặc tạo trong thư mục htdocs nếu bạn dùng Xampp, sau đó bạn dán đoạn code bên dưới vào.
<?php $_GET = [ 'title' => 'TanHongIT', 'website' => 'tanhongit.net' ]; ?> <!DOCTYPE html> <html lang="en"> <body> <form action="<?php $_PHP_SELF ?>" method="GET"> <?php foreach ($_GET as $key => $value){ echo $key . ' - ' . $value . '<br>'; } ?> <input type="submit"> </form> </body> </html>
khi truy cập vào http://localhost/demo.php?title=tanhongit&website=tanhongit.net
hoặc http://localhost//demo.php
thì kết quả đều ra như sau:
title - TanHongIT website - tanhongit.net
Ở ví dụ trên mình sử dụng phương thức GET ngay trong 1 file duy nhất, mình đã sử dụng vòng lặp Foreach để lấy toàn bộ key và value có trong biến $_GET là một mảng có nhiều phần tử.
GET còn có thể sử dụng để truyền dữ liệu từ file này sang file khác. hãy làm tiếp ví dụ 2.
Ví dụ 2: Tạo 2 file, 1 file có tên get_demo.php và một file demo.html
Đầu tiên, ở trong file demo.html ta sẽ tạo 1 form để lấy dữ liệu nhập vào từ bàn phím và gửi lên server.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div class="container"> <form action="get_demo.php" method="GET"> <!--thêm thuộc tính action chuyển hướng đến file get_demo.php --> <div class="form-group"> <label for="">Title</label> <input type="text" class="form-control" id="" placeholder="Nhập vào title..." name="title"> <!--tạo một trường có tên là title để truyền dữ liệu lên file get_demo.php--> </div> <div class="form-group"> <label for="">Website</label> <input type="text" class="form-control" id="" placeholder="Nhập vào url website..." name="web"> <!--tạo một trường có tên là web để truyền dữ liệu lên file get_demo.php--> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> </div> </body> </html>
Ở file demo.html mình có tạo 2 trường nhập liệu trong form có tên là title và web để truyền dữ liệu nhập từ bàn phím vào file get_demo.php
Tiếp theo ta viết code để phía Server xuất ra màn hình sau khi nó đã nhận dữ liệu được nhập vào từ file demo.html thông qua file get_demo.php
<?php echo 'Kết quả nhập liệu của bạn là: <br>'; echo 'Title: ' . $_GET['title'] . '<br>'; echo 'Website: ' . $_GET['web'];
Hãy test thử bằng cách chạy file demo.html lên theo đường link http://localhost/demo.html
sau đó nhập vào các trường dữ liệu và nhấn vào button Submit. Lập tức Server sẽ tự động chuyển link sang file get_demo.php và xuất ra thông tin bạn đã nhập liệu.
Ví dụ: http://localhost/get_demo.php?title=hello&web=chaomoinguoi.com
Kết quả nhận được sau khi Enter sẽ như hình dưới:
Phương thức POST trong PHP
Phương thức POST sẽ trái ngược với phương thức GET về tính bảo mật cũng như tốc độ.
Về phương thức GET, chúng ta có thể xem thông tin trên thanh địa chỉ URL, dữ liệu được gửi đi bằng GET sẽ thông qua các paramter trên URL. POST thì ngược lại, nó không gửi dữ liệu đi bằng paramter trên URL mà thông qua HTTP header, vì vậy việc bảo mật phụ thuộc vào giao thức HTTP mà website đó đang sử dụng.
Parameters được truyền trong request body nên có thể truyền dữ liệu lớn, hạn chế tùy thuộc vào cấu hình của Server. Không cache và bookmark được cũng như không được lưu lại trong browser history. POST không có bất kì hạn chế nào về kích thước dữ liệu sẽ gửi, có thể gửi dữ liệu nhị phân, hình ảnh.
Nội dung dữ liệu được gửi đi bằng phương thức POST sẽ luôn bị ẩn đi và chúng ta không thể thấy được.
Phương thức Post trong mô hình Client-Server
Các bạn hãy tìm hiểu và làm ví dụ bên dưới để hiểu cách phương thức POST truyền dữ liệu lên Server như thế nào nhé!
Phía Client gửi lên
Với phương thức GET, dữ liệu sẽ được thấy trên URL, nhưng phương thức POST thì hoàn toàn ngược lại, POST sẽ phải gửi dữ liệu qua form HTML và các giá trị sẽ được định nghĩa trong các thẻ input gồm các kiểu (textbox, radio, checkbox, password, textarea, hidden) và được nhận dang thông qua tên (name) của các thẻ input đó.
Bạn hãy tạo file demo.html trong thư mục WWW của WampServer hoặc tạo trong thư mục htdocs nếu bạn dùng Xampp và chèn đoạn code bên dưới vào.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div class="container"> <form action="post_demo.php" method="POST"> <!--thêm thuộc tính action chuyển hướng đến file post_demo.php và sử dụng phương thức method = post--> <div class="form-group"> <label for="">Title</label> <input type="text" class="form-control" id="" placeholder="Nhập vào title..." name="title"> <!--tạo một trường có tên (name) là title để truyền dữ liệu lên file post_demo.php--> </div> <div class="form-group"> <label for="">Website</label> <input type="text" class="form-control" id="" placeholder="Nhập vào url website..." name="web"> <!--tạo một trường có tên (name) là web để truyền dữ liệu lên file post_demo.php--> </div> <button type="submit" class="btn btn-primary">Submit</button> </form> </div> </body> </html>
Phần code trên mục đích dùng để nhập liệu từ phía Client để gửi lên Server. Giờ chúng ta sang phần Server.
Phía Server nhận dữ liệu và trả về
Tất cả các dữ liệu gửi bằng phương thức POST đều được lưu trong một biến toàn cục $_POST do PHP tự tạo ra, vì thế từ bây giờ bạn chỉ cần thao tác lấy hoặc gửi dữ liệu thông qua biến $_POST này là được.
Ở file demo.html mình có tạo 2 trường nhập liệu trong form có tên là title và web để truyền dữ liệu nhập từ bàn phím vào file post_demo.php. Tiếp theo ta sẽ code trên file post_demo.php để lấy dữ liệu và xuất ra màn hình.
<?php echo 'Kết quả nhập liệu của bạn là: <br>'; echo 'Title: ' . $_POST['title'] . '<br>'; echo 'Website: ' . $_POST['web'];
Hãy test thử bằng cách chạy file demo.html lên theo đường link http://localhost/demo.html
sau đó nhập vào các trường dữ liệu và nhấn vào button Submit. Lập tức Server sẽ tự động chuyển link sang file post_demo.php và xuất ra thông tin bạn đã nhập liệu.
Nhưng có một điều khác biệt ở đây bạn cần quan tâm đó là khi sử dụng GET, đường dẫn URL sẽ tiết lộ bất kỳ thông tin mà bạn đã nhập liệu, còn khi đã dùng POST thì bị ẩn.
Điều này chứng minh POST sẽ có tính bảo mật hơn GET và POST sẽ phù hợp với các chức năng về tạo dữ liệu, đăng ký, đăng nhập,…
Những lưu ý cần biết trong phương thức POST trong PHP
- Phương thức POST không có bất kì hạn chế nào về kích thước dữ liệu sẽ gửi.
- Phương thức POST có thể sử dụng để gửi ASCII cũng như dữ liệu nhị phân.
- Dữ liệu gửi bởi phương thức POST thông qua HTTP header, vì vậy việc bảo mật phụ thuộc vào giao thức HTTP. Bằng việc sử dụng Secure HTTP, bạn có thể chắc chắn rằng thông tin của mình là an toàn.
- PHP cung cấp mảng liên hợp $_POST để truy cập tất cả các thông tin được gửi bằng phương thức POST.
Kiểm tra isset với GET và POST trong PHP
Trước khi lấy một dữ liệu nào đó từ client bạn phải kiểm tra nó đã tồn tại không rồi mới lấy.Vì nếu không kiểm tra trước khi lấy, phía client chưa cung cấp đầy đủ dữ liệu mà server lại nhận thì sẽ có lỗi ngay. Vì thế ở những trường hợp mà ta không chắc chắn một biến luôn tồn tại hoặc một trường dữ liệu được nhập đầy đủ thì hãy kiểm tra nó trước khi gửi request.
Để kiểm tra ta sẽ dùng hàm isset(). Hàm isset() trong PHP có chức năng kiểm tra xem biến có tồn tại hay không. Nó sẽ trả về TRUE nếu biến đó có tồn tại và ngược lại FALSE nếu biến đó không tồn tại. Hàm isset() sẽ dùng cho cả 2 phương thức GET và POST.
Cú pháp: isset($bien);
Trong đó: $bien
là biến mà bạn muốn kiểm tra sự tồn tại.
Từ ví dụ về phần POST trong PHP ở trên, nếu bạn trực tiếp truy cập vào http://localhost/post_demo.php mà chưa nhập đầy đủ thông tin ở http://localhost/demo.html thì sẽ xuất hiện lỗi ngay.
Vậy từ ví dụ trên ta chỉ cần thêm vào file file post_demo.php như sau:
<?php echo 'Kết quả nhập liệu của bạn là: <br>'; if (isset($_POST['title']) && isset($_POST['web'])) { echo 'Title: ' . $_POST['title'] . '<br>'; echo 'Website: ' . $_POST['web']; }
Bây giờ bạn hãy thử truy cập lại http://localhost/post_demo.php , nếu chưa đươc nhập đủ dữ liệu ở http://localhost/demo.html thì nó sẽ không hiện gì cả, còn nhập đầy đủ các trường dữ liệu thì nó mới hiện lên cho ta xem.
Kết luận: Hàm isset() thật sự rất hữu ích đối với chúng ta trong việc ràng buộc dữ liệu nên các bạn hãy thường xuyên sử dụng để hiểu rõ và áp dụng dễ dàng hơn sau này nhé!
So sánh giống và khác nhau giữa GET và POST
GET và POST hầu như chẳng có gì giống nhau ngoài tác dụng là truyền tải dữ liệu lên Server.
Cho nên mình sẽ nói về những đặc điểm khác nhau của 2 phương thức này nhé!
- Giới hạn dữ liệu: GET giới hạn gửi tối đa chỉ 1024 ký tự. Còn POST không có bất kì hạn chế nào về kích thước dữ liệu sẽ gửi.
- Khả năng: Phương thức POST có thể sử dụng để gửi ASCII cũng như dữ liệu nhị phân, các loại tệp, hình ảnh còn GET thì không.
- Tốc độ: GET nhanh hơn rất nhiều so với POST về quá trình thực thi – vì dữ liệu gửi đi luôn được web browser lưu cached lại. Khi dùng phương thức POST thì server luôn thực thi và trả kết quả cho client, còn dùng GET thì web browser cached sẽ kiểm tra có kết quả tương ứng đó trong bộ nhớ cached chưa, nếu có thì trả về ngay mà không cần đưa tới server.
- Bảo mật: Phương thức POST bảo mật hơn GET vì dữ liệu được gửi ngầm, không xuất hiện trên URL, mắt thường không nhìn thấy được và dữ liệu cũng không được lưu lại. Trong khi đó với GET thì dữ liệu gửi đi được tường minh bạn có thể hiển thị lại được các dữ liệu này trên URL.
Link tham khảo: https://www.diffen.com/difference/GET-vs-POST-HTTP-Requests
Khi nào nên dùng GET và POST trong PHP
Cả 2 phương thức đều có những ưu và nhược điểm khác nhau, vậy khi nào chúng ta nên dùng GET và khi nào nên dùng POST.
Phương thức GET có tốc độ thực thi nhanh như độ bảo mật lại rất kém nên GET chỉ nên dùng cho các công việc lấy dữ liệu từ server về client, như vậy quá trình truy xuất sẽ nhanh hơn.
Đối với POST sẽ có độ bảo mật cao nên phù hợp với các công việc tạo dữ liệu, upload, truyền tải thông tin lên server, những công việc mang tính bảo mật cao.
Ví dụ:
- Khi upload hình ảnh lên web thì ta sẽ dùng POST, còn khi muốn tải ảnh từ Web server về ta sẽ dùng GET.
- Khi đăng ký, đăng nhập hoặc comment vào một website ta sẽ dùng POST, còn khi lấy tin bài viết từ web ra thì ta dùng GET.
- Khi request sử dụng câu lệnh select thì dùng GET, khi request có sử dụng lệnh insert update, delete thì nên dùng POST.
- Ngoài ra khi cần xử lý các thông tin nhạy cảm ví dụ như email, password thì bạn phải sử dụng POST.
Kết thúc
Qua bài viết trên mình đã nếu ra những nội dung liên quan đến 2 phương thức method truyền tải dữ liệu thông dụng trong PHP là GET và POST. Các bạn cần phải hiểu rõ những tính chất của mỗi phương thức này và khi nào nên dùng nó tùy vào từng trường hợp cụ thể.
Nhưng có một điều lưu ý rằng những nội dung, dữ liệu quan trọng hoặc cần truyền tải một loại thông tin gì đó lên server thì ta phải dùng POST để tăng tính bảo mật cho Website nhé!
Xem thêm:
- Bài 5: Biểu Thức Điều Kiện Trong PHP (Lệnh if, else, switch)
- Bài 6: Các loại Vòng lặp trong PHP (for, while, do while)
- Bài 7: Vòng lặp Foreach trong PHP (Các loại vòng lặp phần 2)
- Bài 8: lệnh Break, Continue và các hàm (function) exit, die thường dùng trong PHP
- Bài 10: Mảng (Array) Trong PHP
- Bài 11: Các hàm xử lý mảng (Array) trong PHP
via tanhongit.net