Bár a dolgok “belseje”, mégis nézzük csak meg, hogy a model rétegnek mit kell tudnia. A models/Reservations_model.php
file tartalmazza az adatbázis beszúrást, azt a bizonyos DB INSERT-et a címből.
<?php
class Reservations_model extends CI_Model {
public function insert_reservation() {
$date = date('Y-m-d H:i:s');
$data = array(
'name' => $this->input->post('name'),
'email' => $this->input->post('email'),
'phone' => $this->input->post('phone'),
'message' => $this->input->post('message'),
'checkin' => $this->input->post('checkin'),
'checkout' => $this->input->post('checkout'),
'apartment_id' => 1,
'created_at' => $date,
'updated_at' => $date,
'locale' => $this->session->userdata('site_lang')
);
return $this->db->insert('reservations', $data);
}
}
Az insert során vesszük a HTTP POST asszociatív tömbből a megfelelő értékeket, néhányat pedig “generálunk”, illetve “kiszámítunk”. Ilyen az apartment_id
, a created_at
, az updated_at
és a locale
(nyelv).
Ezt a model metódust a controller-ből fogjuk hívni. Picit megbonyolítottam ezt a controller-t, ahogy az látszani fog. Tettem bele egy viszonyag egyszerű validációt. A validáció vagyis ellenőrzés arra szolgál, hogy a formban – ahogy az példánkban látható – ne lehessen a név, email, foglalás tól-ig adatok megadása nélkül elküldeni a foglalást. 🙂
Nézzük a controllers/Apartments.php
vezérlőnket! Kiegészítjük a booking()
és a book()
metódusokkal.
public function booking()
{
$data = array();
$data['validation_errors'] = '';
if (!empty($this->session->flashdata('validation_errors'))) {
$data['validation_errors'] = $this->session->flashdata('validation_errors');
}
$this->template->set('title', $this->lang->line('menu_booking'));
$this->template->load('menu_layout', 'contents', 'booking', $data);
}
public function book()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
$this->form_validation->set_rules('checkin', 'Check-in', 'required');
$this->form_validation->set_rules('checkout', 'Check-out', 'required');
if ($this->form_validation->run() === FALSE) {
$this->session->set_flashdata('validation_errors', validation_errors());
redirect($_SERVER['HTTP_REFERER']);
} else {
$this->load->model('reservations_model');
$this->reservations_model->insert_reservation();
$data = array();
$this->template->set('title', $this->lang->line('menu_booking'));
$this->template->load('menu_layout', 'contents', 'booking_accepted', $data);
}
}
Látható, hogy a book()
metódusban hívjuk a modellünket, majd a booking_accepted
oldalra irányítjuk a klienst. 🙂
Végül nézzük a két view-nkat. Előbb vegyük a formunkat tartalmazó views/booking.php
állományt.
<?php
$my_base_url = '/apartman/';
?>
<div class="row">
<div class="col-sm-2">
<div id="fh5co-logo"><a href="index.html">Apartman<span>.</span></a></div>
</div>
<div class="col-sm-10 text-right menu-1">
<ul>
<li><a href="photos"><?php echo $this->lang->line('menu_photos'); ?></a></li>
<li class="active"><a href="booking"><?php echo $this->lang->line('menu_booking'); ?></a></li>
<li><a href="contact"><?php echo $this->lang->line('menu_contact'); ?></a></li>
</ul>
</div>
</div>
</div>
</div>
</nav>
<div class="container">
<div id="fh5co-intro">
<div class="row animate-box">
<div class="col-md-8 col-md-offset-2 col-md-pull-2">
<h2><?php echo $this->lang->line('menu_booking'); ?></h2>
</div>
</div>
</div>
<div id="fh5co-contact">
<div class="row">
<div class="col-md-4 animate-box">
<h3>Contact Information</h3>
<ul class="contact-info">
<li><i class="icon-location4"></i>1117 Budapest, Irinyi J. utca 42.</li>
<li><i class="icon-phone3"></i>+ 1235 2355 98</li>
<li><i class="icon-location3"></i><a href="#">info@yoursite.com</a></li>
<li><i class="icon-globe2"></i><a href="#">www.yoursite.com</a></li>
</ul>
</div>
<div class="col-md-8 animate-box">
<div class="form-wrap">
<div class="row">
<form action="book" method="POST">
<?php if ($validation_errors) { ?>
<div class="col-md-12">
<div class="form-group">
<h3><font color="red"><?php echo $validation_errors; ?></font></h3>
</div>
</div>
<?php } ?>
<div class="col-md-12">
<div class="form-group">
<input type="text" name="name" class="form-control" placeholder="Name">
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<input type="text" name="email" class="form-control" placeholder="Email">
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<input type="text" name="phone" class="form-control" placeholder="Phone">
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<textarea name="message" class="form-control" id="" cols="30" rows="15" placeholder="Message"></textarea>
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<input type="text" name="checkin" class="form-control" placeholder="Check-in">
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<input type="text" name="checkout" class="form-control" placeholder="Check-out">
</div>
</div>
<div class="col-md-12">
<div class="form-group">
<input type="submit" value="Book" class="btn btn-primary btn-modify">
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div><!-- END container -->
Ebben a fontos talán a $validation_errors változó kiíratása, illetve maga a form. Azt, hogy mi az action-je, és mi a metódus, az alábbi sor írja le.
<form action="book" method="POST">
Érdemes még megnézni a form egy mezőjének definiálását is.
<input type="text" name="name" class="form-control" placeholder="Name">
Ez annyit jelent, hogy szöveg beviteli mező, name névvel, ahol a vakszöveg a “Name” felirat lesz.
Fontos továbbá az elküldő gomb megadása is, més a form tag-en belül. A tag amúgy, HTML tag, azaz egy két kacsacsőr közé rejtett literál (sztring), amiben nincs további kacsacsőr karakter. Példa nyitó és záró tag-ekre: <form></form>
. 🙂
<input type="submit" value="Book" class="btn btn-primary btn-modify">
Ez egy submit button – elküldő gomb, “Book” felirattal.
Ezt a formot a submit gomb megnyomása után a book()
metódus fogja “megkapni” a controller-ben egy HTTP POST metódushívás után. A form mezőit egy a name
attribútumokban megadott nevekkel kulcsolt asszociatív tömb fogja tartalmazni. Ennyi az egész! 🙂
Látható az adatbázisunkban, hogy a megfelelő rekord bekerült a reservations táblába (SQL konzol hozzáférés mysql -u apartman -p apartman_devel parancs kiadásával).
mysql> select * from reservations;
+----+-----------------+------------+------------+------------+------------+-----------------------+----------+--------------+---------+---------------------+---------------------+
| id | name | email | phone | checkin | checkout | message | approved | apartment_id | locale | created_at | updated_at |
+----+-----------------+------------+------------+------------+------------+-----------------------+----------+--------------+---------+---------------------+---------------------+
| 5 | Gergely Vámosi | mail@to.me | 0123456789 | 2020-07-29 | 2020-08-01 | Szeretnék egy szobát! | NULL | 1 | english | 2020-07-29 01:33:20 | 2020-07-29 01:33:20 |
+----+-----------------+------------+------------+------------+------------+-----------------------+----------+--------------+---------+---------------------+---------------------+
1 row in set (0.00 sec)
Nézzük meg még a views/booking_accepted.php
oldalt. Ez arról ad tájékoztatást az apartmant lefoglalni szándékozó ügyfélnek, hogy sikeres a foglalása!
<?php
$my_base_url = '/apartman/';
?>
<div class="row">
<div class="col-sm-2">
<div id="fh5co-logo"><a href="index.html">Apartman<span>.</span></a></div>
</div>
<div class="col-sm-10 text-right menu-1">
<ul>
<li><a href="photos"><?php echo $this->lang->line('menu_photos'); ?></a></li>
<li class="active"><a href="booking"><?php echo $this->lang->line('menu_booking'); ?></a></li>
<li><a href="contact"><?php echo $this->lang->line('menu_contact'); ?></a></li>
</ul>
</div>
</div>
</div>
</div>
</nav>
<div class="container">
<div id="fh5co-intro">
<div class="row animate-box">
<div class="col-md-8 col-md-offset-2 col-md-pull-2">
<h2><?php echo $this->lang->line('menu_booking'); ?></h2>
</div>
</div>
</div>
<div id="fh5co-contact">
<div class="row">
<div class="col-md-4 animate-box">
<h3>Thanks for booking!</h3>
</div>
</div>
</div>
</div><!-- END container -->
Vegyük kicsit górcső alá a biztonságot! Hisz adatot közlünk a szerverrel, bármit beírhatunk a weblapon az űrlapba, amit pár szűrőn áteresztve adatbázisban tárolunk!
Először is érdemes megvizsgálni azt, hogy mit írhatunk be a mezőkbe: speciális karakterek, többek között a HTML formátum speciális jelei, a <>” és ‘ jelek. Aztán az ún. SQL injection veszélyei, amikor is az adatbáziselérésen keresztül speciális, például rosszakaratú SQL parancsokat tudunk kiadni, ami akár lehet egy ;DELETE FROM <TÁBLANÉV> pontosvessző után beszúrt parancs is akár. Szerencsés esetben ezeknek az eseteknek a kiszűrését a keretrendszerünk biztosítja. 🙂
Érdemes továbbá megvizsgálni az esetleges ún. CSRF – Cross-site request forgery veszélyét is. Bővebben a https://hu.wikipedia.org/wiki/Cross-site_request_forgery cím alatt olvashatunk róla. Röviden arról van szó, hogy a böngészőn keresztül nem kívánt parancsok hajthatók végre egy weblapon a felhasználó tudta nélkül. Ebbe a témakörbe tartozik egyébként még az XSS – Cross-site scripting is. A CSRF ellen egyébként többnyire egy minden formhoz (űrlapohoz) egyedileg generált azonosító, egy speciális kód véd, ami üzenetváltásonként újragenerált (töken). Ez véd többek között egy form újraküldése ellen, azaz adott esetben egy művelet (pl. fizetés) adott esetben rossz szándékú újbóli végrehajtása ellen. Az XSS csupán egy weblap funkcióinak más weblapbóli történő meghívása. 🙂 Játék. A baj, ha nem barátágos.
Aztán ott van az úgynevezett Captcha-teszt szükségessége is. Bővebben a https://hu.wikipedia.org/wiki/Captcha címen olvashatunk róla. Itt arról van szó, hogy weblapunk az emberi felhasználót megkülönböztesse egy generált robot, azaz gépi hozzáféréstől. Csak valós emberektől szeretnénk apartman foglalást elfogadni! Semmi esetre sem rossz szándékú hekkerek által készített programoktól. Ismerősök ugye az elhanyagolt facebook profilok mindenféle “fake” felhasználó általi “hello, ismerjük egymást” üzenetei? Főleg attraktív “csajoktól”? 🙂
És akkor lássuk a http://localhost/apartman/index.php/apartments/booking oldalt!
