PHP - Form Validation (Provjera obrazca)


Provjera valjanosti podataka obrazca

Kao što ste vidjeli u prethodnoj lekciji, postupak hvatanja i prikazivanja poslanih podataka obrazca prilično je jednostavan. U ovoj lekciji naučićete kako na svojoj web lokaciji implementovati jednostavan obrazac za kontakt koji omogućava korisniku da svoj komentar i povratne informacije pošalje e-poštom. Koristićemo istu PHP funkciju mail() za slanje e-pošte. Takođe ćemo implementovati neke osnovne sigurnosne provjere kao što su sanacija i provjera korisničkog unosa, tako da korisnik ne može umetnuti potencijalno štetne podatke koji ugrožavaju sigurnost web stranice ili mogu pokvariti aplikaciju. Slijedi naša sve u jednom PHP skripta koja radi sljedeće stvari:

  • Tražit će od korisnika da unose njegove komentare o web mjestu.
  • Ista skripta prikazuje obrazac za kontakt i obrađuje poslane podatke obrazca.
  • Skripta dezinfikuje i provjerava korisničke unose. Ako bilo koje potrebno polje (označeno sa *) nedostaje ili provjera nije uspjela zbog neispravnih unosa, skripta ponovno prikazuje obrazac s porukom greške za odgovarajuće polje obrazca.
  • Skripta pamti koja polja je korisnik već ispunio i unaprijed ih popunjava kada se obrazac ponovno prikaže zbog greške u provjeri.
  • Ako su podaci koje je korisnik dostavio prihvatljivi i sve bude uredu, on će poslati e-poruku administratoru web stranice i prikazati korisniku poruku o uspjehu.

Upišite sljedeći kod u datoteku "contact.php" i spremite u osnovni direktorij projekta:

<?php
// Funkcije za filtriranje korisničkih unosa
function filterName($field){
    // Sanitizirajte korisničko ime
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    
    // Potvrdite korisničko ime
    if(filter_var($field, FILTER_VALIDATE_REGEXP, array("options"=>array("regexp"=>"/^[a-zA-Z\s]+$/")))){
        return $field;
    } else{
        return FALSE;
    }
}    
function filterEmail($field){
    // Sanitizirajte e-mail adresu
    $field = filter_var(trim($field), FILTER_SANITIZE_EMAIL);
    
    // Potvrdite adresu e-pošte
    if(filter_var($field, FILTER_VALIDATE_EMAIL)){
        return $field;
    } else{
        return FALSE;
    }
}
function filterString($field){
    // Sanitiziranje stringa
    $field = filter_var(trim($field), FILTER_SANITIZE_STRING);
    if(!empty($field)){
        return $field;
    } else{
        return FALSE;
    }
}
 
// Definišite varijable i inicijalizirajte praznim vrijednostima
$nameErr = $emailErr = $messageErr = "";
$name = $email = $subject = $message = "";
 
// Obrada podataka obrazca kada se obrazac preda
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Potvrdite korisničko ime
    if(empty($_POST["name"])){
        $nameErr = "Unesite svoje ime.";
    } else{
        $name = filterName($_POST["name"]);
        if($name == FALSE){
            $nameErr = "Unesite ispravno ime.";
        }
    }
    
    // Potvrdite adresu e-pošte
    if(empty($_POST["email"])){
        $emailErr = "Unesite svoju adresu e-pošte.";     
    } else{
        $email = filterEmail($_POST["email"]);
        if($email == FALSE){
            $emailErr = "Molimo Vas da unesete validnu email adresu.";
        }
    }
    
    // Potvrdite temu poruke
    if(empty($_POST["subject"])){
        $subject = "";
    } else{
        $subject = filterString($_POST["subject"]);
    }
    
    // Potvrdite komentar korisnika
    if(empty($_POST["message"])){
        $messageErr = "Unesite svoj komentar.";     
    } else{
        $message = filterString($_POST["message"]);
        if($message == FALSE){
            $messageErr = "Unesite valjani komentar.";
        }
    }
    
    // Prije slanja e-pošte provjerite greške u unosu
    if(empty($nameErr) && empty($emailErr) && empty($messageErr)){
        // Adresa e-pošte primatelja
        $to = 'webmaster@example.com';
        
        // Kreirajte zaglavlja e-pošte
        $headers = 'From: '. $email . "\r\n" .
        'Reply-To: '. $email . "\r\n" .
        'X-Mailer: PHP/' . phpversion();
        
        // Slanje e-maila
        if(mail($to, $subject, $message, $headers)){
            echo '<p class="success">Vaša poruka je uspješno poslana!</p>';
        } else{
            echo '<p class="error">Nije moguće poslati e-poštu. Molimo pokušajte ponovo!</p>';
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Kontakt forma</title>
    <style type="text/css">
        .error{ color: red; }
        .success{ color: green; }
    </style>
</head>
<body>
    <h2>Kontaktirajte nas</h2>
    <p>Molimo ispunite ovaj obrazac i pošaljite nam.</p>
    <form action="contact.php" method="post">
        <p>
            <label for="inputName">Ime:<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">Tema:</label>
            <input type="text" name="subject" id="inputSubject" value="<?php echo $subject; ?>">
        </p>
        <p>
            <label for="inputComment">Poruka:<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>

Objašnjenje koda

Možete se pitate o čemu se radi u ovome kodu ? OK, idemo pogledati o čemu se radi.

  • Funkcija filterName() potvrđuje ulaznu vrijednost kao ime osobe. Važeće ime može da sadrži samo abecedne znakove (a-z, A-Z).
  • Funkcija filterEmail() potvrđuje ulaznu vrijednost kao adresu e-pošte.
  • Funkcija filterString() sanira ulaznu vrijednost samo uklanjanjem HTML tagova i posebnih znakova. Ne potvrđuje ulaznu vrijednost ni prema čemu.
  • Atribut action="contact.php" unutar oznake <form> navodi da ista datoteka contact.php prikazuje obrazac, kao i obrađuje podatke obrazca.
  • PHP kod unutar atributa vrijednosti <input> i <textarea> npr. <? php echo $ name; ?> prikazuje unaprijed ispunjenu vrijednost kada se obrazac ponovno prikaže nakon pogrešne provjere.
  • PHP kod unutar klase .error, npr. <span class = "error"> <? php echo $ nameErr; ?> </span> prikazuje grešku u odgovarajućem polju.