Zend Framework – Céges Demo portál – Regisztráció – Űrlapfeldolgozás XII. rész

Kész van, a regisztrációs űrlap, van adatbázis, meg adatbázis-kapcsolat, adatfeldolgozás, most már a regisztráció maga hiányzik csak. Regisztrációs űrlapunkat a index/process-regisztracio vezérlő/eseménypárunk dolgozza fel. Hozzunk létre IndexControllerünk processRegisztracioAction() eseményét:

public function processRegisztracioAction()
{
}

A kapcsolati űrlap feldolgozásához hasonlóan, szedjük ki a $_POST[] tömbből az adatokat. Kiszedjük a felhasználó e-mail címét, a beütött Captcha kódot, ahogy ezt korábban is tettük:

$entered_captcha = Zend_Filter::get($this->getRequest()->getPost('entered_coded'), 'StripTags');
$r_email = Zend_Filter::get($this->getRequest()->getPost('r_email'), 'StripTags');

A jelszó beviteli mezőnél speciális szűrőket, Zend Framework szűrőket használunk, amellyel kiszűrjük a rosszindulatú felhasználók által begépelt html és egyéb kódokat, amellyel portálunk feltörését gátoljuk meg valamilyen szinten:

$passwordFilter = new Zend_Filter();
$passwordFilter->addFilter(new Zend_Filter_HtmlEntities())
->addFilter(new Zend_Filter_StripTags());
$r_password = $passwordFilter->filter($this->getRequest()->getPost('r_password'), 'StripTags');

Ha ezzel megvagyunk, leellenőrizzük minden mező kitöltésre került e?

if($r_email=='' || $r_password=='' || $entered_captcha==''){
//ha van olyan mező ami nincs kitöltve akkor "Kérem töltsön ki minden mezőt!"
//felírat jelenjen meg
$this->_helper->flashMessenger->addMessage("Kérem töltsön ki minden mezőt!");
$this->_redirect('index/regisztracio');
}

ha minden mező ki van töltve egy megszokott captcha ellenőrzés:

//minden mező ki van töltve
$captchaSession = new Zend_Session_Namespace('captcha');
if($captchaSession->captcha) {
$captchakod = $captchaSession->captcha;
}
if ($entered_captcha != $captchakod) {
$this->_helper->flashMessenger->addMessage("A captcha kód nem megfelelő!");
$this->_redirect('/index/regisztracio');
}

Ha megegyezik akkor, megnézzük valid-e azaz megfelel-e a megadott email cím, az email cím formátumnak:

$emailValidator = new Zend_Validate_EmailAddress();
if ($emailValidator->isValid($r_email)) {
...

ha nem:

else{
//minden más esetben
$this->_helper->flashMessenger->addMessage("Az email cím nem felel meg!");
$this->_redirect('index/regisztracio');
}

ha valid az email cím, a captcha kód is megfelelő, ki van töltve minden mező akkor le kell, még ellenőriznünk, hogy a megadott email cím nem szerepel e már adatbázisunkban. Ha szerepel, nem szabad engedni a regisztrációt, ha nincs benne természetesen megengedjük. Én ezt egy a Regisztracio.php Model objektumom emailkontroll() nevű metódusával oldom meg:

public function emailkontroll($email)
{
$db = Globals::getDBConnection();
$sql = 'SELECT * FROM felhasznalok WHERE felh_email = ?';
if ($result = $db->fetchRow($sql, array($email))) {
if ($result) {
//ha van az adatbázisban akkor false érték
return false;
} else {
//ha nincs true mivel beleírható
return true;
}
} // if ($result = $db->fetchRow($sql, array($email)))
return false;
}

A commentekből kiderül, ha benne van az adatbázisban az email cím már akkor false, különben true értékkel térünk vissza (fetchRow() metódus segítségével egy sort kérünk le csak az adatbázisból, ha van visszaadott sor akkor létezik az email cím).

Nos ha valid, az email cím akkor a fenti metódus segítségével, le kell ellenőrizni létezik e már az adott email cím az adatbázisban, ha nem akkor le kell menteni az adatokat és erről a felhasználót értesíteni. Nézzük meg, hogyan kell ezt véghez vinni az IndexController processRegisztracioAction() eseményében:

szóval ha valid az email cím:

//ha valid
if(Regisztracio::emailkontroll()){
$regisztralo = new Regisztracio();
$regisztralo->felh_email = $r_email;
$regisztralo->felh_passw = md5($r_password);
$regisztralo->save();
$this->_helper->flashMessenger->addMessage("Sikeres regisztráció!");
$this->_redirect('index/regisztracio');
}
else{
$this->_helper->flashMessenger->addMessage("Ezzel az e-mail címmel már beregisztráltak!");
$this->_redirect('index/regisztracio');
}

Ha nem létezik az email cím az adatbázisban akkor, létrehozunk egy Regisztracio() Model objektumot amit korábban megírtunk, átadjuk a megfelelő adatokat neki, majd a save() metódusának segítségével adatbázisba mentjük az adatokat. A jelszót MD5 kódolással tároljuk az adatbázisban. Az MD5 állítólag 5-6 jegyű kódolandó adat után már feltörhetetlen(2007-es állás szerint azóta lehet felfejlődött a világ és már 8at kell megadni a teljes biztonság érdekében), ez egy hash kódoló, ugyanarra a karaktersorozatra ugyanazt a kódot állítja elő mindig, ha majd felhasználót akarunk bejelentkeztetni az oldalra, akkor figyelnünk kell arra, hogy a jelszót amit begépelt lekódoljuk MD5 kódolással és csak utána hasonlítsuk össze az adatbázisban lévővel, ha nem így teszünk egy kódolatlan és egy kódolt jelszót hasonlítunk majd össze, ami akkor sem fog megegyezni, ha ugyanarról a jelszóról van szó!

Most lássuk egyben a regisztrációs űrlapot feldolgozó eseményt:

public function processRegisztracioAction()
{
$entered_captcha = Zend_Filter::get($this->getRequest()->getPost('entered_coded'), 'StripTags');
$r_email = Zend_Filter::get($this->getRequest()->getPost('r_email'), 'StripTags');
$passwordFilter = new Zend_Filter();
$passwordFilter->addFilter(new Zend_Filter_HtmlEntities())
->addFilter(new Zend_Filter_StripTags());
$r_password = $passwordFilter->filter($this->getRequest()->getPost('r_password'), 'StripTags');
if($r_email=='' || $r_password=='' || $entered_captcha==''){
//ha van olyan mező ami nincs kitöltve akkor "Kérem töltsön ki minden mezőt!"
//felírat jelenjen meg
$this->_helper->flashMessenger->addMessage("Kérem töltsön ki minden mezőt!");
$this->_redirect('index/regisztracio');
}
else{
//minden mező ki van töltve
$captchaSession = new Zend_Session_Namespace('captcha');
if($captchaSession->captcha) {
$captchakod = $captchaSession->captcha;
}
if ($entered_captcha != $captchakod) {
$this->_helper->flashMessenger->addMessage("A captcha kód nem megfelelő!");
$this->_redirect('/index/regisztracio');
}
else{
$emailValidator = new Zend_Validate_EmailAddress();
if ($emailValidator->isValid($r_email)) {
//ha valid
if(Regisztracio::emailkontroll()){
$regisztralo = new Regisztracio();
$regisztralo->felh_email = $r_email;
$regisztralo->felh_passw = md5($r_password);
$regisztralo->save();
$this->_helper->flashMessenger->addMessage("Sikeres regisztráció!");
$this->_redirect('index/regisztracio');
}
else{
$this->_helper->flashMessenger->addMessage("Ezzel az e-mail címmel már beregisztráltak!");
$this->_redirect('index/regisztracio');
}
}
else{
//minden más esetben
$this->_helper->flashMessenger->addMessage("Az email cím nem felel meg!");
$this->_redirect('index/regisztracio');
}
}
return true;
}
}

Használat előtt érdemes még megnézni, hogy a config.ini fájlunkban megadott adatbázis, adatbázis felhasználó létezik e?

Ha kapunk egy Error! Fault in Process! hibaüzenetet, akkor nézzük meg tmp könyvtárunk error.log fájlunk alját, ott találjuk a hiba leírását.

Advertisements

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s