PHP : Form Validation

Membersihkan dan Memvalidasi Formulir Data

Seperti yang kalian lihat dalam tutorial sebelumnya, proses menangkap dan menampilkan data formulir yang dikirimkan cukup sederhana. Dalam tutorial ini kalian akan belajar cara menerapkan formulir kontak sederhana di situs web kalian yang memungkinkan pengguna untuk mengirim komentar dan feedback mereka melalui email. Kami akan menggunakan fungsi PHP mail() yang sama untuk mengirim email.

Kami juga akan menerapkan beberapa fitur keamanan dasar seperti sanitasi dan validasi input pengguna sehingga pengguna tidak dapat memasukkan data berbahaya yang membahayakan keamanan situs web atau mungkin merusak aplikasi.

Berikut ini adalah skrip PHP lengkap kita yang melakukan hal-hal berikut:

  • Ini akan meminta pengguna untuk memasukkan komentarnya tentang situs web.
  • Skrip yang sama menampilkan formulir kontak dan memproses data formulir yang dikirimkan.
  • Script membersihkan dan memvalidasi input pengguna. Jika bidang yang diperlukan (ditandai dengan *) tidak ada atau validasi gagal karena input yang salah, skrip akan menampilkan kembali formulir dengan pesan kesalahan untuk bidang formulir yang sesuai.
  • Skrip mengingat bidang mana yang telah diisi pengguna, dan mengisi ulang bidang tersebut saat formulir ditampilkan kembali karena kesalahan validasi.
  • Jika data yang dikirimkan oleh pengguna dapat diterima dan semuanya berjalan baik itu akan mengirim email ke administrator situs web dan menampilkan pesan sukses kepada pengguna.

Ketikkan kode berikut dalam file “contact.php” dan simpan di direktori root proyek kalian:

<?php
// Functions to filter user inputs
function filterName($field){
    // Sanitize user name
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    
    // Validate user name
    if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
        return $field;
    } else{
        return FALSE;
    }
}    
function filterEmail($field){
    // Sanitize e-mail address
    $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
    
    // Validate e-mail address
    if(filter_var($field, FILTER_VALIDATE_EMAIL)){
        return $field;
    } else{
        return FALSE;
    }
}
function filterString($field){
    // Sanitize string
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    if(!empty($field)){
        return $field;
    } else{
        return FALSE;
    }
}
 
// Define variables and initialize with empty values
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
 
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Validate user name
    if(empty($_POST["name"])){
        $nameErr = "Please enter your name.";
    } else{
        $name = filterName($_POST["name"]);
        if($name == FALSE){
            $nameErr = "Please enter a valid name.";
        }
    }
    
    // Validate email address
    if(empty($_POST["email"])){
        $emailErr = "Please enter your email address.";     
    } else{
        $email = filterEmail($_POST["email"]);
        if($email == FALSE){
            $emailErr = "Please enter a valid email address.";
        }
    }
    
    // Validate message subject
    if(empty($_POST["subject"])){
        $subject = "";
    } else{
        $subject = filterString($_POST["subject"]);
    }
    
    // Validate user comment
    if(empty($_POST["message"])){
        $messageErr = "Please enter your comment.";     
    } else{
        $message = filterString($_POST["message"]);
        if($message == FALSE){
            $messageErr = "Please enter a valid comment.";
        }
    }
    
    // Check input errors before sending email
    if(empty($nameErr) &amp;&amp; empty($emailErr) &amp;&amp; empty($messageErr)){
        // Recipient email address
        $to = 'webmaster@example.com';
        
        // Create email headers
        $headers = 'From: '. $email . "\r\n" .
        'Reply-To: '. $email . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
        
        // Sending email
        if(mail($to, $subject, $message, $headers)){
            echo '<p class="success">Your message has been sent successfully!</p>';
        } else{
            echo '<p class="error">Unable to send email. Please try again!</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>
Penjelasan Kode

Kalian mungkin berpikir tentang apa kode itu. OK, mari kita langsung ke dalamnya.

  • Fungsi filterName() (baris no-03) memvalidasi nilai input sebagai nama orang. Nama yang valid hanya dapat berisi karakter alfabet (a-z, A-Z).
  • Fungsi filterEmail() (baris no-14) memvalidasi nilai input sebagai alamat email.
  • Fungsi filterString() (baris no-25) hanya membersihkan nilai input dengan menghilangkan tag HTML dan karakter khusus. Itu tidak memvalidasi nilai input terhadap apa pun.
  • Atribut action=”contact.php” (baris no-111) di dalam tag <form> menentukan bahwa file contact.php yang sama menampilkan formulir serta memproses data formulir.
  • Kode PHP di dalam atribut nilai <input> dan <textarea> mis. <?php echo $name; ?> menampilkan nilai prefilled ketika form ditampilkan kembali setelah kesalahan validasi.
  • Kode PHP di dalam kelas .error mis. <span class=”error”> <?php echo $nameErr; ?> </span> kesalahan tampilan untuk bidang terkait.