Kontakt forma - PHP osnove

 

1. Neophodne stvari
2. HTML kod forme
3. "Skupljanje" unetih podataka
4. Provera unetih podataka (obavezna polja)
4a. Provera unete e-mail adrese
4b. Flood zastita
4c. CAPTCHA zastita
5. Slanje maila i prikazivanje rezultata


 

1. Neophodne stvari

Da bi ste napisali PHP kod, potrebam vam je neki tekstualni editor - npr. Notepad. Code View kod DreamWeaver-a, Notepad++. ..

Da bi ste pokrenuli PHP kod, neophodan je web server (Apache) i PHP, koji mozete instalirati jedan po jedan, ili u okviru nekog All-in-one paketa (EasyPHP, XAMPP, Apache2Triad...).

Da bi ste poslali mail, neophodan je ili podešen mail server na localhostu (ili serveru na kome pokrećete formu), ili, kao lakša varijanta PHPmailer. Na velikoj većini free hostova je php funkcija mail() isključena, što je još jedan razlog za korišćenje PHPmailera. Neki mail serveri čak mailove poslate preko mail() funkcije prepoznaju kao spam. PHP mailer možete besplatno preuzeti sa http://sourceforge.net/projects/phpmailer

 

2. HTML kod forme

Postoji nekoliko načina za pisanje html koda forme, ovo je jedan način. Stranica na kojoj se kod nalazi se zove "kontakt.php" (mada samo ime nije toliko bitno), a kasnije će ta ista stranica poslužiti i da pošalje mail.

Kod:
<html>
<head>
<title>PHP Tutorijal: Kontakt forma</title>
</head>
<body>
<form action="kontakt.php" method="post">
Ime i prezime: <input type="text" name="value0" value=""><br>
E - mail adresa: <input type="text" name="value1" value=""><br>
Naslov poruke: <input type="text" name="value2" value=""><br>
Tekst poruke: <textarea name="value3" cols="10" rows="3"></textarea><br><br>
<input type="submit" value="Posalji" name="posalji">
</form>
</body>
</html>



I to je kompletan html kod kontakt forme. Možete dodavati još polja po svojoj želji, samo treba paziti da se imena polja (atribut name) nalaze u formatu "value#" (gde # oznacava redni broj).

 


3. "Skupljanje" unetih podataka

Sada je potrebno prihvatiti podatke koji su poslati preko POST metode. I dalje se nalazimo na kontakt.php stranici, samo sad već pisemo u PHP-u.
Tekst iza // je komentar, i on se ne izvršava. Služi samo da vam objasni šta se radi kojom linijom koda, i možete ga izbrisati kad god želite.

Kod:
<?php
if (isset($_POST['posalji'])) { //provera da li je forma popunjena
for ($i=0;$i<=3;$i++) { //broj 3 označava koliko polja imamo
$label = "value" . $i; //pripremamo "ime" polja
if (isset($_POST[$label]) and !empty($_POST[$label])) { //provera da li je polje popunjeno
$value[$i] = $_POST[$label]; //ako jeste, prihvatamo podatke
}
else {
$value[$i] = ""; //ako nije, dodeljujemo "praznu" vrednost promenljivoj
}
}
}
?>
<html>
<head>
<title>PHP Tutorijal: Kontakt forma</title>
</head>
<body>
<form action="kontakt.php" method="post">
Ime i prezime: <input type="text" name="value0" value=""><br>
E - mail adresa: <input type="text" name="value1" value=""><br>
Naslov poruke: <input type="text" name="value2" value=""><br>
Tekst poruke: <textarea name="value3" cols="10" rows="3"></textarea><br><br>
<input type="submit" value="Posalji" name="pošalji">
</form>
</body>
</html>



Time su svi uneti podaci prikupljeni u niz $value[], a sledeci korak je provera da li su neophodni podaci uneti.

 


4. Provera unetih podataka (obavezna polja)

I za ovo postoji nekoliko načina. Ukoliko je broj polja relativno mali (<5) možete svako polje proveriti ručno, a ako nije, automatizovanje koda puno znači. Najbolje je da se u startu naviknete da pišete što manje koda koji radi isti posao kao i dugački kod, kako bi kasnije, kada okolnosti to budu zahtevale, uz male izmene postojećeg koda dobili ono sto vam treba.

Takođe, u samoj formi je dodato da, ukoliko postoji greska prilikom popunjavanja, u poljima ostanu unete vrednosti, kako posetioci ne bi morali da više puta popunjavaju formu.

Kod:
<?php
$value = array("","","","");
$allset = false; //forma nije spremna za slanje
$error = ""; //nema gresaka u popunjavanju forme
if (isset($_POST['posalji'])) { //provera da li je forma popunjena
$allset = true; //pretpostavljamo da su svi uneti podaci tačni
for ($i=0;$i<=3;$i++) { //broj 3 označava koliko polja imamo
$label = "value" . $i; //pripremamo "ime" polja
if (isset($_POST[$label]) and !empty($_POST[$label])) { //provera da li je polje popunjeno
$value[$i] = $_POST[$label]; //ako jeste, prihvatamo podatke
}
else {
$value[$i] = ""; //ako nije, dodeljujemo "praznu" vrednost promenljivoj
}
}
$obavezna = array("0","1","3"); //brojevi obaveznih polja
$o = count($obavezna) - 1; //brojanje obaveznih polja
for ($i=0;$i<=$o;$i++) {
$op = $obavezna[$i]; //uzimamo broj obaveznog polja
if ($value[$op] == "") { //provera da li je polje prazno
$allset = false; //forma nije spremna za slanje
$error = "Niste popunili sva obavezna polja."; //objasnjenje greske
}
}
}
?>
<html>
<head>
<title>PHP Tutorijal: Kontakt forma</title>
</head>
<body>
<form action="kontakt.php" method="post">
Ime i prezime: <input type="text" name="value0" value="<?php echo $value[0]; ?>"><br>
E - mail adresa: <input type="text" name="value1" value="<?php echo $value[1]; ?>"><br>
Naslov poruke: <input type="text" name="value2" value="<?php echo $value[2]; ?>"><br>
Tekst poruke: <textarea name="value3" cols="10" rows="3"><?php echo $value[3]; ?></textarea><br><br>
<input type="submit" value="Posalji" name="posalji">
</form>
</body>
</html>



I time je provera da li su popunjena sva obavezna polja završena. Sada bi trebalo proveriti da li je uneti e-mail u validnom formatu.



4a. Provera unete e-mail adrese

Kod:
<?php
function IsValid($mail) {
$et = strpos($mail,"@"); //provera na kojoj se poziciji nalazi znak @
if ($et >= 1) { //ako ima neceg ispred @
$rest = substr($mail,$et + 1,strlen($mail) - $et); //uzimamo ostatak adrese, iza @
$dot = strpos($rest,"."); // trazimo prvo pojavljivanje tacke iza @
if ($dot >= 2) { //ako ima bar 2 slova ispred tacke
$dotrest = strlen(substr($rest,$dot + 1,strlen($rest) - $dot)); //koliko slova ima iza tačke
if ($dotrest >= 2) { //ako ima više od ili jednako 2
return true; //mail je validan
}
else {
return false; //ima manje od 2, nije validan
}
}
else {
return false; //manje od 2 slova ispred tacke, nije validan
}
}
else {
return false; //nema niceg ispred @, nije validan
}
}
$value = array("","","","");
$allset = false; //forma nije spremna za slanje
$error = ""; //nema gresaka u popunjavanju forme
if (isset($_POST['posalji'])) { //provera da li je forma popunjena
$allset = true; //pretpostavljamo da su svi uneti podaci tacni
for ($i=0;$i<=3;$i++) { //broj 3 oznacava koliko polja imamo
$label = "value" . $i; //pripremamo "ime" polja
if (isset($_POST[$label]) and !empty($_POST[$label])) { //provera da li je polje popunjeno
$value[$i] = $_POST[$label]; //ako jeste, prihvatamo podatke
}
else {
$value[$i] = ""; //ako nije, dodeljujemo "praznu" vrednost promenljivoj
}
}
if (!IsValid($value[1])) { //provera da li je adresa validna
$allset = false; //forma nije spremne za slanje
$error = "Uneta e-mail adresa nije validna."; // objasnjenje greske
}
$obavezna = array("0","1","3"); //brojevi obaveznih polja
$o = count($obavezna) - 1; //brojanje obaveznih polja
for ($i=0;$i<=$o;$i++) {
$op = $obavezna[$i]; //uzimamo broj obaveznog polja
if ($value[$op] == "") { //provera da li je polje prazno
$allset = false; //forma nije spremna za slanje
$error = "Niste popunili sva obavezna polja."; //objasnjenje greske
}
}
}
?>
<html>
<head>
<title>PHP Tutorijal: Kontakt forma</title>
</head>
<body>
<form action="kontakt.php" method="post">
Ime i prezime: <input type="text" name="value0" value="<?php echo $value[0]; ?>"><br>
E - mail adresa: <input type="text" name="value1" value="<?php echo $value[1]; ?>"><br>
Naslov poruke: <input type="text" name="value2" value="<?php echo $value[2]; ?>"><br>
Tekst poruke: <textarea name="value3" cols="10" rows="3"><?php echo $value[3]; ?></textarea><br><br>
<input type="submit" value="Posalji" name="posalji">
</form>
</body>
</html>


Završena provera obaveznih podataka, kao i validnosti e-mail adrese.

4b. Flood zaštita

Ono što bi trebalo sprečiti je da kontakt bude poslat više puta slučajno, ili namerno - u vidu spama. Zato ćemo posetiocima uvesti ograničenje u vidu slanja jedne poruke u 5 minuta. Međutim, ovaj deo je nemoguće odvojiti od objašnjenja slanja poruke, jer zabrana teče od onog trenutka kad je poruka poslata. Zato ćemo se kasnije vratiti na taj deo.

4c. CAPTCHA zaštita

Zloupotreba kontakt forme od strane spamera je ne samo moguća, već i vrlo realna ukoliko se ne zaštitite. Jedan od načina zaštite (ne potpuno pouzdan, ali sasvim dovoljno) je CAPTCHA zaštita (CAPTCHA je skraćenica za Completely Automated Public Turing test to tell Computers And Humans Apart) i služi za razlikovanje ljudi od "botova". Na kom principu radi? Sigurno ste videli, prilikom popunjavanja neke forme sličicu sa brojevima i slovima, gde se od vas traži da taj kod upisete u odgovarajuće polje. To je za čoveka lak zadatak, ali ne i za bota, i većina padne na tom testu. Zaštita je bolja ukoliko koristite nestandardne fontove i izobličavate slova. Kako se za kreiranje slika "u letu" (ne preporučuje se korisćenje gotovih slika zbog konačnog broja kombinacija) koristi GD biblioteka, a to spada u malo naprednije korišćenje PHP-a.

5. Slanje maila i prikazivanje rezultata

Forma je popunjena, podaci prosleđeni, prošli kroz proveru, i sada dolazimo do dela u kome treba poslati mail. Sada su Vam potrebna 2 fajla koje ste (nadam se) skinuli jos na početku: class.phpmailer.php i class.smtp.php. Neophodan vam je i mail nalog kome možete pristupiti preko smtp servera. Takođe, sada ćemo se vratiti i na flood zaštitu, videćete u kodu gde se to nalazi. Evo koda:

Kod:
<?php
session_start(); //startujemo sesiju
function IsValid($mail) {
$et = strpos($mail,"@"); //provera na kojoj se poziciji nalazi znak @
if ($et >= 1) { //ako ima neceg ispred @
$rest = substr($mail,$et + 1,strlen($mail) - $et); //uzimamo ostatak adrese, iza @
$dot = strpos($rest,"."); // trazimo prvo pojavljivanje tacke iza @
if ($dot >= 2) { //ako ima bar 2 slova ispred tacke
$dotrest = strlen(substr($rest,$dot + 1,strlen($rest) - $dot)); //koliko slova ima iza tacke
if ($dotrest >= 2) { //ako ima vise od ili jednako 2
return true; //mail je validan
}
else {
return false; //ima manje od 2, nije validan
}
}
else {
return false; //manje od 2 slova ispred tacke, nije validan
}
}
else {
return false; //nema niceg ispred @, nije validan
}
}
$value = array("","","","");
$allset = false; //forma nije spremna za slanje
$error = ""; //nema gresaka u popunjavanju forme
$poslato = false;// forma nije poslata (jos uvek)
if (isset($_POST['posalji'])) { //provera da li je forma popunjena
$allset = true; //pretpostavljamo da su svi uneti podaci tacni
for ($i=0;$i<=3;$i++) { //broj 3 oznacava koliko polja imamo
$label = "value" . $i; //pripremamo "ime" polja
if (isset($_POST[$label]) and !empty($_POST[$label])) { //provera da li je polje popunjeno
$value[$i] = $_POST[$label]; //ako jeste, prihvatamo podatke
}
else {
$value[$i] = ""; //ako nije, dodeljujemo "praznu" vrednost promenljivoj
}
}
if (!IsValid($value[1])) { //provera da li je adresa validna
$allset = false; //forma nije spremne za slanje
$error = "Uneta e-mail adresa nije validna."; // objasnjenje greske
}
$obavezna = array("0","1","3"); //brojevi obaveznih polja
$o = count($obavezna) - 1; //brojanje obaveznih polja
for ($i=0;$i<=$o;$i++) {
$op = $obavezna[$i]; //uzimamo broj obaveznog polja
if ($value[$op] == "") { //provera da li je polje prazno
$allset = false; //forma nije spremna za slanje
$error = "Niste popunili sva obavezna polja."; //objasnjenje greske
}
}
if ($allset) { //ako je forma spremna za slanje
if (isset($_SESSION['floodstop'])) { //provera da li je poruka poslata u toku sesije
$slanje = $_SESSION['floodstop']; //"uzimamo" vreme kad je poslata
$sada = time(); //"uzimamo" trenutno vreme
$vreme = $sada - $slanje; //razlika u vremenu
}
else {
$vreme = 300; //ako nije, neka razlika bude 5 minuta
}
if ($vreme >= 300) { //ako poruka nije poslata u zadnjih 5 minuta
require("class.phpmailer.php");
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->Host = "mail.server.com"; //podesavanje servera
$mail->SMTPAuth = true; //server zahteva password
$mail->Username = "username@server.com"; //korisnicko ime
$mail->Password = "123456"; //password

$mail->From = $value[1]; //mail posiljaoca
$mail->FromName = $value[0]; //ime posiljaoca
$mail->AddAddress("kontakt@server.com"); //adresa na koju se salje
$mail->Subject = $value[2]; //subject maila
$mail->Body = stripslashes($value[3]); //tekst poruke
$mail->CharSet = "utf-8"; //"ukljucuje" cirlicna slova, kao i latinicna sa kvacicama

$mail->WordWrap = 50;
$mail->IsHTML(true);
          $mail- >AltBody="Ova poruka koristi HTML enkoding, da bi ste je videli morate da ukljucite HTML podrsku u Vasem mail klijentu!";

if ($mail->Send()) {
$poslato = true; //poruka je poslata
$_SESSION['floodstop'] = time(); //belezimo vreme slanja
}
else {
$error = "Mail nije poslat. Pokusajte ponovo."; //objasnjenje greske
}
}
else { //ako jeste poslata u zadnjih 5 minuta
$error = "Nije moguce poslati poruku u razmaku manjem od 5 minuta."; //objasnjenje greske
}
}
}
?>
<html>
<head>
<title>PHP Tutorijal: Kontakt forma</title>
</head>
<body>
<?php
if ($poslato) { //ako je poruka poslata
?>
Vasa poruka je uspesno poslata.
<?php
}
else { //ako nije poslata, prikazacemo formu
if (!empty($error)) { //ako postoji greska
echo "<div>$error</div>"; //prikazacemo je
}
?>
<form action="kontakt.php" method="post">
Ime i prezime: <input type="text" name="value0" value="<?php echo $value[0]; ?>"><br>
E - mail adresa: <input type="text" name="value1" value="<?php echo $value[1]; ?>"><br>
Naslov poruke: <input type="text" name="value2" value="<?php echo $value[2]; ?>"><br>
Tekst poruke: <textarea name="value3" cols="10" rows="3"><?php echo $value[3]; ?></textarea><br><br>
<input type="submit" value="Posalji" name="posalji">
</form>
<?php
} //kraj prikazivanja forme
?>
</body>
</html>


Time ste završili kontakt formu. Ostaje samo da dizajn forme dovedete u red, ali to je čist html (i malo css-a).