Bài 28: Hướng dẫn Validate Form trong PHP

Trong Lập trình chúng ta phải xác thực và làm sạch dữ liệu hay thường được gọi là validate form. Trong hướng dẫn này, bạn sẽ tìm hiểu cách validate form trong PHP.

Ở bài trước chúng ta đã tạo form để nhận dữ liệu của người dùng. Nhưng như mình đã nói. Dữ liệu của người dùng có thể “Không sạch”.

Vì thế, trong Lập trình web hay bất cứ lập trình ứng dụng nào khác. Chúng ta phải xác thực và làm sạch dữ liệu hay thường được gọi là validate form.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách validate form trong PHP.

Hướng dẫn Validate Form trong PHP
Hướng dẫn Validate Form trong PHP

Hướng dẫn Làm sạch và Xác thực dữ liệu (Validate) trong PHP

Bạn đã thấy trong các bài hướng dẫn trước, quá trình bắt và hiển thị dữ liệu của form đã gửi khá đơn giản.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách triển khai một form liên hệ đơn giản trên trang web của mình cho phép người dùng gửi nhận xét và phản hồi của họ qua email.

Chúng ta sẽ sử dụng cùng hàm PHP mail() để gửi email.

Chúng ta cũng sẽ triển khai một số tính năng bảo mật cơ bản như Làm sạchXác thực dữ liệu đầu vào của người dùng để chắc chắn rằng người dùng không thể chèn dữ liệu độc hại (ví dụ như tiêm injection) có thể làm tổn hại đến bảo mật trang web hoặc có thể phá vỡ trang web.

Sau đây là tập lệnh tất cả trong một của chúng ta, nó thực hiện những việc sau:

  • Nó sẽ yêu cầu người dùng nhập nhận xét ​​của mình về trang web.
  • Kịch bản tương tự hiển thị form liên hệ và xử lý dữ liệu form liên hệ đã gửi.
  • Kịch bản làm sạchxác thực dữ liệu đầu vào của người dùng. Nếu bất kỳ trường bắt buộc nào (được đánh dấu *) bị thiếu hoặc xác thực không thành công do nhập sai, tập lệnh sẽ hiển thị lại form với thông báo lỗi cho trường tương ứng.
  • Kịch bản ghi nhớ các trường mà người dùng đã điền và điền trước các trường đó khi biểu mẫu được hiển thị lại do lỗi xác thực.
  • Nếu dữ liệu được gửi bởi người dùng có thể chấp nhận được và mọi thứ đều ổn, nó sẽ gửi email đến quản trị viên trang web và hiển thị thông báo thành công cho người dùng.

Tạo file có tên là contact.php và lưu trong thư mục gốc dự án của bạn:

<?php
// Functions to filter user inputs
function filterName($field){
    // Làm sạch tên người dùng
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    
    // Xác thực tên người dùng
    if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
        return $field;
    } else{
        return FALSE;
    }
}    
function filterEmail($field){
    // Làm sạch Email
    $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
    
    // Xác thực Email
    if(filter_var($field, FILTER_VALIDATE_EMAIL)){
        return $field;
    } else{
        return FALSE;
    }
}
function filterString($field){
    // Làm sạch nội dung
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    if(!empty($field)){
        return $field;
    } else{
        return FALSE;
    }
}
 
// Khai báo biến và khởi tạo các giá trị trống
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
 
// Xử lý dữ liệu biểu mẫu khi biểu mẫu được gửi
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Xác thực tên người dùng
    if(empty($_POST["name"])){
        $nameErr = "Nhập tên của bạn.";
    } else{
        $name = filterName($_POST["name"]);
        if($name == FALSE){
            $nameErr = "Nhập tên hợp lệ.";
        }
    }
    
    // Xác thực Email
    if(empty($_POST["email"])){
        $emailErr = "Nhập địa chỉ Email.";     
    } else{
        $email = filterEmail($_POST["email"]);
        if($email == FALSE){
            $emailErr = "Nhập email hợp lệ.";
        }
    }
    
    // Xác thực tiêu đề
    if(empty($_POST["subject"])){
        $subject = "";
    } else{
        $subject = filterString($_POST["subject"]);
    }
    
    // Xác thực nội dung
    if(empty($_POST["message"])){
        $messageErr = "Điền nhận xét.";     
    } else{
        $message = filterString($_POST["message"]);
        if($message == FALSE){
            $messageErr = "Điền nhận xét hợp lệ.";
        }
    }
    
    // Check input errors before sending email
    if(empty($nameErr) && empty($emailErr) && empty($messageErr)){
        // Địa chỉ Email người nhận
        $to = 'webmaster@example.com';
        
        // Tạo tiêu đề Email
        $headers = 'From: '. $email . "\r\n" .
        'Reply-To: '. $email . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
        
        // Gửi Email
        if(mail($to, $subject, $message, $headers)){
            echo '<p class="success">Nhận xét của bạn gửi thành công!</p>';
        } else{
            echo '<p class="error">Không thể gửi. Vui lòng thử lại sau!</p>';
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Contact Form</title>
    <style type="text/css">
        .error{ color: red; }
        .success{ color: green; }
    </style>
</head>
<body>
    <h2>Contact Us</h2>
    <p>Please fill in this form and send us.</p>
    <form action="contact.php" method="post">
        <p>
            <label for="inputName">Name:<sup>*</sup></label>
            <input type="text" name="name" id="inputName" value="<?php echo $name; ?>">
            <span class="error"><?php echo $nameErr; ?></span>
        </p>
        <p>
            <label for="inputEmail">Email:<sup>*</sup></label>
            <input type="text" name="email" id="inputEmail" value="<?php echo $email; ?>">
            <span class="error"><?php echo $emailErr; ?></span>
        </p>
        <p>
            <label for="inputSubject">Subject:</label>
            <input type="text" name="subject" id="inputSubject" value="<?php echo $subject; ?>">
        </p>
        <p>
            <label for="inputComment">Message:<sup>*</sup></label>
            <textarea name="message" id="inputComment" rows="5" cols="30"><?php echo $message; ?></textarea>
            <span class="error"><?php echo $messageErr; ?></span>
        </p>
        <input type="submit" value="Send">
        <input type="reset" value="Reset">
    </form>
</body>
</html>

Giải thích code Validate Form trong PHP

Bạn có thấy, đây là đoạn mã Validate form đơn giản nhất. Chúng ta sẽ đi vào giải thích cụ thể:

  • filterName() function (line no-03) xác nhận giá trị đầu vào là tên người dùng. Tên hợp lệ chỉ có thể chứa các ký tự chữ cái (a-z, A-Z).
  • filterEmail() function (line no-14) xác nhận giá trị đầu vào như địa chỉ email.
  • filterString() function (line no-25) chỉ làm sạch giá trị đầu vào bằng cách loại bỏ thẻ HTML và các ký tự đặc biệt.
  • Thuộc tính action="contact.php" (line no-111) bên trong thẻ <form> chỉ định rằng tệp contact.php sẽ được thực thi khi người dùng nhấn nút gửi.
  • Mã PHP bên trong giá trị thuộc tính của thẻ <input> và textarea, ví dụ:
    <?php echo $name; ?> Hiển thị giá trị được điền sẵn khi biểu mẫu được hiển thị lại xảy ra lỗi xác thực.
  • Mã PHP bên trong class .error, ví dụ <span class=”error”><?php echo $nameErr; ?></span> Hiển thị lỗi theo trường tương ứng.

Phần còn trong mã Validate form trong PHP chúng ta đã tìm hiểu trong các chương trước. Để tìm hiểu thêm về vệ sinh và xác thực các bộ lọc, vui lòng xem tham khảo thêm PHP Fillter tại trang chủ của PHP tại đây

Tham khảo: Code hướng dẫn Validate form bằng PHP