Thuật ngữ "Xác thực biểu mẫu" đề cập đến quá trình xác định xem dữ liệu mà người dùng nhập vào các phần tử biểu mẫu khác nhau có chấp nhận được cho việc xử lý tiếp theo hay không. Việc xác thực dữ liệu trước khi xử lý tiếp theo giúp tránh các ngoại lệ và lỗi thời gian chạy có thể xảy ra.
Kiểm tra dữ liệu có thể được thực hiện cả ở phía khách hàng và phía máy chủ. Khi khách hàng gửi biểu mẫu, dữ liệu biểu mẫu sẽ được chặn bởi tập lệnh PHP đang chạy trên máy chủ. Sử dụng các hàm khác nhau có sẵn trong PHP, việc kiểm tra dữ liệu biểu mẫu ở phía máy chủ có thể được thực hiện.
Các điều khiển đầu vào mới theo các thông số kỹ thuật HTML5 có tính năng xác thực tích hợp sẵn. Ví dụ, một phần tử đầu vào có kiểu 'email', mặc dù là một trường văn bản, nhưng được tùy chỉnh để chấp nhận một chuỗi phù hợp với giao thức địa chỉ email.
Việc xác thực diễn ra trước khi dữ liệu được gửi đến máy chủ. Điều tương tự cũng đúng với các loại đầu vào khác như URL, số, v.v.
Dưới đây là một mẫu biểu mẫu HTML với các phần tử đầu vào kiểu số, kiểu email và kiểu URL. Nếu bạn nhập dữ liệu không đúng định dạng yêu cầu, một thông báo lỗi phù hợp sẽ xuất hiện khi bạn cố gắng gửi biểu mẫu.
<h1>Input Validation</h1> <form> <p><Label for "name">Enter your name</label> <input type = "text" id="name" name="name"></p> <p><label for="age">Enter age</label> <input type = "text" id = "age" name="age"></p> <p><label for="email">Enter your email:</label> <input type="text" id="email" name="email"></p> <p><label for="URL">Enter your website<label> <input type = "text" id="URL" name="url"></p> <input type="submit"> </form>
Trường văn bản kiểu số hiển thị các mũi tên tăng/giảm ở bên phải. Chỉ chấp nhận số, và có thể được tăng hoặc giảm.
Nếu dữ liệu trong trường email không hợp lệ, bạn sẽ nhận được thông báo lỗi hiển thị như bên dưới.
Tương tự, bất kỳ định dạng không chính xác nào cho URL cũng sẽ hiển thị lỗi như hình dưới đây −
Xác thực trên phía máy chủ với PHP xuất hiện, hoặc khi dữ liệu biểu mẫu vượt qua xác thực phía khách hàng, hoặc không có xác thực nào ở phía khách hàng cả.
Trong mẫu HTML được sử dụng trong ví dụ trên, hãy xóa tất cả các loại nhập đặc biệt và sử dụng tất cả các trường văn bản có kiểu văn bản. Mẫu được gửi bằng phương thức POST tới hello.php trên máy chủ.
<form action="hello.php" method="POST"> <p><Label for "name">Enter your name</label> <input type = "text" id="name" name="name"></p> <p><label for="age">Enter age</label> <input type = "text" id = "age" name="age"></p> <p><label for="email">Enter your email:</label> <input type="text" id="email" name="email"></p> <p><label for="URL">Enter your website<label> <input type = "text" id="URL" name="url"></p> <input type="submit"> </form>
Nếu người dùng (có thể vô tình) nhấn nút gửi, bạn có thể yêu cầu PHP hiển thị lại biểu mẫu. Bạn cần kiểm tra xem mảng $_POST đã được khởi tạo bằng hàm isset() hay chưa. Nếu chưa, hàm header() sẽ chuyển hướng điều khiển trở lại biểu mẫu.
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { if (isset($_POST)) { header("Location: hello.html", true, 301); exit(); } // form processing if the form is not empty } ?>
Bạn cũng có thể kiểm tra xem có trường nào bị bỏ trống vào thời điểm gửi biểu mẫu hay không.
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { foreach($_POST as $k=>$v) { if (empty($v)==true) { echo "One or more fields are empty \n"; echo "<a href = 'hello.html'>Click here to go back </a>"; exit; } else echo "$k => $v \n"; } } ?>
Trong biểu mẫu HTML, trường nhập cho tên có kiểu văn bản, do đó nó có thể chấp nhận bất kỳ ký tự nào. Tuy nhiên, chúng ta muốn nó phải là số. Điều này có thể được đảm bảo bằng cách sử dụng hàm is_numeric().
<?php if (is_numeric($_POST["age"])==false) { echo "Age cannot be non-numeric \n"; echo "<a href = 'hello.html'>Click here to go back</a>"; } ?>
PHP cũng có hàm is_string() để kiểm tra xem một trường có chứa chuỗi hay không. Hai hàm khác, trim() và htmlspecialchars(), cũng rất hữu ích cho việc xác thực biểu mẫu.
trim() − Loại bỏ khoảng trắng ở đầu và cuối của một chuỗi.
htmlspecialchars() − Chuyển đổi các ký tự đặc biệt thành thực thể HTML để ngăn chặn các cuộc tấn công xuyên trang (XSS).