PHP Tutorijal (Forma) 2. Deo
Strana 1 od 1
PHP Tutorijal (Forma) 2. Deo
4a. Provera unete e-mail adrese
Za proveru validnosti e-mail adrese napisao sam jednu funkciju koju uvek primenjujem. Znam da nije savrsena (uostalom, uvek mozete napisati da je vas e-mail npr. ja.sam@svjetskimega.car) ali malo dodatne paznje nije na odmet.
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 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
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>
Zavrsena provera obaveznih podataka, kao i validnosti e-mail adrese. Idemo dalje.
4b. Flood zastita
Ono sto bi trebalo spreciti je da kontakt bude poslat vise puta slucajno, ili namerno - u vidu spama. Zato cemo posetiocima uvesti ogranicenje u vidu slanja jedne poruke u 5 minuta. Medjutim, ovaj deo je nemoguce odvojiti od objasnjenja slanja poruke, jer zabrana tece od onog trenutka kad je poruka poslata. Zato cemo se kasnije vratiti na taj deo.
4c. CAPTCHA zastita
Zloupotreba kontakt forme od strane spamera je ne samo moguca, vec i vrlo realna ukoliko se ne zastitite. Jedan od nacina zastite (ne potpuno pouzdan, ali sasvim dovoljno) je CAPTCHA zastita (CAPTCHA je skracenica za Completely Automated Public Turing test to tell Computers And Humans Apart) i sluzi za razlikovanje ljudi od "botova". Na kom principu radi? Sigurno ste videli, prilikom popunjavanja neke forme slicicu sa brojevima i slovima, gde se od vas trazi da taj kod upisete u odgovarajuce polje. To je za coveka lak zadatak, ali ne i za bota, i vecina padne na tom testu. Zastita je bolja ukoliko koristite nestandardne fontove i izoblicavate slova. Kako se za kreiranje slika "u letu" (ne preporucuje se koriscenje gotovih slika zbog konacnog broja kombinacija) koristi GD biblioteka, a to spada u malo naprednije koriscenje PHPa, o tome ce biti reci u nekom narednom tutorialu. Za sada je dovoljno da znate da i to treba uraditi.
5. Slanje maila i prikazivanje rezultata
Forma je popunjena, podaci prosledjeni, prosli 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 pocetku: class.phpmailer.php i class.smtp.php. Neophodan vam je i mail nalog kome mozete pristupiti preko smtp servera. Takodje, sada cemo se vratiti i na flood zastitu, videcete 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>
i time ste zavrsili kontakt formu. Ostaje samo da dizajn forme dovedete u red, ali to je cist html (i malo css-a), te se u objasnjavanje toga necu upustati.
Za proveru validnosti e-mail adrese napisao sam jednu funkciju koju uvek primenjujem. Znam da nije savrsena (uostalom, uvek mozete napisati da je vas e-mail npr. ja.sam@svjetskimega.car) ali malo dodatne paznje nije na odmet.
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 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
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>
Zavrsena provera obaveznih podataka, kao i validnosti e-mail adrese. Idemo dalje.
4b. Flood zastita
Ono sto bi trebalo spreciti je da kontakt bude poslat vise puta slucajno, ili namerno - u vidu spama. Zato cemo posetiocima uvesti ogranicenje u vidu slanja jedne poruke u 5 minuta. Medjutim, ovaj deo je nemoguce odvojiti od objasnjenja slanja poruke, jer zabrana tece od onog trenutka kad je poruka poslata. Zato cemo se kasnije vratiti na taj deo.
4c. CAPTCHA zastita
Zloupotreba kontakt forme od strane spamera je ne samo moguca, vec i vrlo realna ukoliko se ne zastitite. Jedan od nacina zastite (ne potpuno pouzdan, ali sasvim dovoljno) je CAPTCHA zastita (CAPTCHA je skracenica za Completely Automated Public Turing test to tell Computers And Humans Apart) i sluzi za razlikovanje ljudi od "botova". Na kom principu radi? Sigurno ste videli, prilikom popunjavanja neke forme slicicu sa brojevima i slovima, gde se od vas trazi da taj kod upisete u odgovarajuce polje. To je za coveka lak zadatak, ali ne i za bota, i vecina padne na tom testu. Zastita je bolja ukoliko koristite nestandardne fontove i izoblicavate slova. Kako se za kreiranje slika "u letu" (ne preporucuje se koriscenje gotovih slika zbog konacnog broja kombinacija) koristi GD biblioteka, a to spada u malo naprednije koriscenje PHPa, o tome ce biti reci u nekom narednom tutorialu. Za sada je dovoljno da znate da i to treba uraditi.
5. Slanje maila i prikazivanje rezultata
Forma je popunjena, podaci prosledjeni, prosli 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 pocetku: class.phpmailer.php i class.smtp.php. Neophodan vam je i mail nalog kome mozete pristupiti preko smtp servera. Takodje, sada cemo se vratiti i na flood zastitu, videcete 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>
i time ste zavrsili kontakt formu. Ostaje samo da dizajn forme dovedete u red, ali to je cist html (i malo css-a), te se u objasnjavanje toga necu upustati.
Strana 1 od 1
Dozvole ovog foruma:
Ne možete odgovarati na teme u ovom forumu
|
|
12/10/2010, 21:37 od Branko67
» Centar za masazu osoba sa invaliditetom potrebna pomoc
18/2/2010, 03:57 od Branko67
» Hasanaginica Seminarski
16/1/2010, 09:12 od Kima
» Sandy Rivera
16/3/2009, 22:14 od Kima
» Problemi i Pitanja
1/3/2009, 23:26 od Kima
» Tutoriali za 3D
1/3/2009, 23:24 od Kima
» Stole Nigrutin version no.1
25/1/2009, 07:09 od Kima
» ZAŠTO JE PILE PREŠLO ULICU?
20/1/2009, 20:25 od Vuj1ca
» Izrada Web sajtova
9/1/2009, 18:16 od Kima