Link GitHub: Atestat-CodeIgniter
Salutare si bine v-am regasit, astazi vom continua seria noastra de tutoriale despre cum puteti sa va construiti singuri atestatul de informatica.
Despre ce vom vorbi astazi? Astazi vom discuta despre baza de date a site-ului nostru. Am mentionat in episodul trecut ca trebuie sa va ganditi la structura acestuia.
Mai sus am descris in mare arhitectura site-ului nostru. Vom avea doua tabele principale: utilizatori si proprietati. Pentru a transpune aceasta imagine intr-un tabel SQL vom executa urmatoarele linii:
Tabelul Utilizatori:
CREATE TABLE `utilizatori` ( `ID` INT NOT NULL AUTO_INCREMENT , `nume` VARCHAR(25) NOT NULL , `prenume` VARCHAR(25) NOT NULL , `username` VARCHAR(25) NOT NULL , `parola` VARCHAR(25) NOT NULL , `email` VARCHAR(25) NOT NULL , `rol` INT NOT NULL , PRIMARY KEY (`ID`));
Tabelul Proprietati:
CREATE TABLE `proprietati` ( `ID` INT NOT NULL AUTO_INCREMENT , `locatie` INT NOT NULL , `tip` INT NOT NULL , `bedrooms` INT NOT NULL , `bathrooms` INT NOT NULL , `pret` INT NOT NULL , `suprafata` INT NOT NULL , `deInchiriat` INT NOT NULL , `descriere` TEXT NOT NULL , PRIMARY KEY (`ID`));
Tabelul Locatii_proprietati:
CREATE TABLE `locatii_proprietati` ( `ID` INT NOT NULL AUTO_INCREMENT , `denumire` VARCHAR(25) NOT NULL , PRIMARY KEY (`ID`));
Tabelul Tip_proprietati:
CREATE TABLE `tip_proprietati` ( `ID` INT NOT NULL AUTO_INCREMENT , `denumire` VARCHAR(25) NOT NULL , PRIMARY KEY (`ID`));
Tabelul Poze_proprietati:
CREATE TABLE `poze_proprietati` ( `ID` INT NOT NULL AUTO_INCREMENT , `id_casa` INT NOT NULL , `url_imagine` VARCHAR(25) NOT NULL , PRIMARY KEY (`ID`));
Tabelul Contact:
CREATE TABLE `contact` ( `ID` INT NOT NULL AUTO_INCREMENT , `nume` VARCHAR(25) NOT NULL , `email` VARCHAR(25) NOT NULL , `subiect` VARCHAR(25) NOT NULL , `mesaj` TEXT NOT NULL , PRIMARY KEY (`ID`));
Acum ca am creat tabelele, trebuie sa le umplem cu cateva date pentru a ne asigura ca totul functioneaza asa cum am planuit. Va las mai jos un exemplu de utilizator:
INSERT INTO `utilizatori` (`ID`, `nume`, `prenume`, `username`, `parola`, `email`, `rol`) VALUES ('1', 'popescu', 'andrei', 'andreip', 'andreip', '[email protected]', '1');
Models
Am discutat in tutorialul precedent despre arhitectura CodeIgniter si am lasat ultimul subiect “models” pentru a-l discuta astazi.
Clasa “models” a fost conceputa pentru a lucra cu informatiile din baza de date. De exemplu, noi vom avea pentru inceput 2 modele: unul pentru utilizatori si celalalt pentru proprietati. Asadar, trebuie sa avem doua fisiere separate care sa controleze informatiile din cele doua tabele.
Crearea unui model
Modelele sunt stocate in folderul applications/models. Urmatorul cod o sa va arate cum cream un model:
<?php Class User_model extends CI_Model { Public function __construct() { parent::__construct(); } } ?>
Fiecare model nou trebuie sa extinda clasa CI_Model (exact ca si in cazul controllerelor). Atunci cand iti denumesti modelul, ai grija sa il scrii cu litera mare la inceput. De asemenea, fisierul trebuie salvat ca si User_model.php la final.
Dupa ce am terminat de definit un model, acesta trebuie incarcat intr-un controller folosind linia:
$this->load->model('user_model');
Routing-ul in CodeIgniter
Inainte de a trece mai departe trebuie sa abordam inca un subiect important in CodeIgniter: rutarea.
CodeIgniter are un sistem prietenos de rutare, astfel incat iti poti gestiona destul de usor URL-urile. De obicei exista o relatie unu-la-unu intre un URL introdus de utilizator si controller-ul corespunzator.
De obicei un URL urmeaza urmatorul template:
http://127.0.0.1/clasa/functie/id/
- Primul segment reprezinta controller-ul care este invocat. In cazul acesta se va cauta controller-ul “clasa”
- Cel de-al doilea segment reprezinta functia din interiorul controller-ului “clasa” ce urmeaza sa o apelam. In cazul nostru se va apela functia (sau metoda) “functie” din interiorul controller-ului “clasa”
- Cel de-al treilea segment reprezinta parametrii ce vor fi transmisi catre functia “functie”.
Daca doresti sa schimbi acest “template” de rutare, CodeIgniter iti face munca mai usoara.
Customizarea regulilor de rutare
Exista un fisier particular unde poti sa te ocupi de toate aceste reguli. Fisierul este localizat in application/config/routes.php. Aici vei gasi un vector denumit $route in care poti sa iti customizezi diferite reguli. Denumirea pe care o dai in $route va stabili ce va fi controlat, iar ceea ce pui dupa egal va stabili unde va fi controlat.
De exemplu daca scrii
$route['paginafrumoasa'] = 'tutorial/functiaMihai';
Atunci cand accesezi http://127.0.0.1/paginafrumoasa CodeIngniter va executa functia “functiaMihai” din interiorul controller-ului “tutorial”
De asemenea trebuie sa ai grija la cele 3 route rezervate in CodeIgniter.
- $route[‘default_controller’] – Aceasta ruta indica ce controller va fi incarcat daca URL-ul este gol, de obicei aici definesti pagina “acasa” sau “index”. Te incurajez sa folosesti aceasta ruta, altfel pagina 404 va aparea.
- $route[‘404_override’] – Aceasta ruta indica ce controller va fi incarcat daca URL-ul ce a fost tastat nu este gasit. Functia default este localizata in application/views/errors
- $route[‘translate_uri_dashes’] – Dupa cum indica si numele, aceasta optiune iti ofera posibilitatea sa inlocuiesti dashurile (‘-‘ minusurile) din URL-uri cu underscoruri (‘_’). Aceasta optiune te salveaza de la mai multe erori, deoarece minusul nu este permis atunci cand declari denumirea unei functii. (de exemplu nu poti defini o functie “functia-Mihai()”)
Routele pot fi customizate folosind wildcard-uri sau regular expressions, dar tineti minte ca regulile voastre trebuie scrise dupa cele 3 reguli rezervate (descrise mai sus).
Wildcards
Putem folosii doua wildcard-uri descrise mai jos:
- (:num) – Va urmarii un segment care va contine numere
- (:any) – Va urmarii un segment care contine orice caracter
Exemplu:
$route['produs/:num']='catalog/cauta_produs';
In acest exemplu, daca in url se gaseste cuvantul “produs”, atunci orice numar ce vine dupa “/” se va duce ca si paramentru in functia “cauta_produs” din controller-ul “catalog”.
Configurarea bazei de date in CodeIgniter
Baza de date a site-ului poate fi configurata din fisierul application/config/database.php. De obicei trebuie sa setam baza de date in functie de stadiul proiectului nostru ( in dezvoltare / in productie / lansata).
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'database_name', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => TRUE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array() );
Conectarea catre baza de date
Ne putem conecta la baza de date prin doua metode:
- Conectarea automata – conectarea automata se poate realiza folosind fisierul application/config/autoload.php. Conectarea automata se va realiza de fiecare data cand o pagina se incarca, trebuie doar sa adaugam libraria bazei de date:
$autoload['libraries'] = array(‘database’);
- Conectarea manuala – Daca doresti sa realizezi conexiunea catre baza de date doar pe anumite pagini, putem sa realizam conexiunea manual de fiecare data folosind urmatoarea linie:
$this->load->database();
Inserarea
Pentru a insera un nou rand in baza noastra de date, putem folosii functia insert() folosind structura de mai jos.
- Syntaxa: insert([$table = ”[, $set = NULL[, $escape = NULL]]])
- Parametrii:
- $table (string) – Numele tabelului
- $set – Un vector asociativ pentru a lega coloana cu valoarea efectiva
- $escape
- Returneaza
- TRUE – daca s-a executat cu succes
- FALSE – daca esueaza
Urmatorul exemplu o sa va arate cum putem adauga un nou rand in tabelul utilizatori. Vectorul $data va contine informatiile ce urmeaza a fi inserate in tabelul utilizatori, trebuie doar sa dam acest vector ca si parametru in functia noastra si totul se va executa de la sine.
$data = array( 'nume' => 'Popescu', 'prenume' => 'Andrei', 'username'=> 'uzerprietenos', 'parola' => 'parola1', 'email' => 'emailsmecher', 'rol' => 1, ); $this->db->insert("utilizatori", $data);
Updatarea
Pentru a updata o linie in baza de date vom folosii functia update() impreuna cu where() exact ca in exemplul de mai jos.
Functia where()
Functia where() va decide care dintre campuri vor fi updatate
- Syntaxa: where($key[, $value = NULL[, $escape = NULL]])
- Parametrii:
- $key – Un vector asociativ pentru a lega coloana cu valoarea efectiva
- $value – Daca folosesti o singura valoare, aici transmiti cheia
- $escape
Functia update()
Si in final, functia update() va updata baza noastra de date
- Syntaxa: update([$table = ”[, $set = NULL[, $where = NULL[, $limit = NULL]]]])
- Parametrii:
- $table (string) – Numele tabelului
- $set – Un vector asociativ pentru a lega coloana cu valoarea efectiva
- $escape
$data = array( 'nume' => 'Nume Nou', ); $this->db->where('id', 2); $this->db->update('utilizatori', $data);
Aceasta linie se poate traduce in urmatorul query SQL: UPDATE utilizatori SET name = ‘Nume Nou’ WHERE id = 2
Stergerea
Pentru a sterge un rand din baza de date, folosim functia delete().
- Syntaxa: delete([$table = ”[, $where = ”[, $limit = NULL[, $reset_data = TRUE]]]])
- Parametrii:
- $table (string) – Numele tabelului
Hint: pentru a ne usura munca, vom folosi functia where() descrisa mai sus
$this->db->where('id', 1); $this->db->delete('utilizatori');
Selectarea (sau extragerea)
Pentru a selecta un rand din baza de date, folosim functia get() descrisa mai jos.
- Syntaxa: get([$table = ”[, $limit = NULL[, $offset = NULL]]])
- Parametrii:
- $table (string) – Numele tabelului
- $limit (int) – Putem limita numarul rezultatelor
Hint: la fel ca si in cazul delete(), vom folosii functia where()
$this->db->where('id', 2); $query = $this->db->get('utilizatori'); print_r($query->result());
Primul nostru model
Dupa ce am discutat notiunile introductive, a venit vremea sa cream primul nostru model. Asa ca facem un fisier nou in applications/models pe care il vom denumi User_model.php
<?php class User_model extends CI_Model { function __construct() { parent::__construct(); } function get_user($id) { $this->db->where('ID', $id); $query = $this->db->get('utilizatori'); return $query->result(); } function insert_user($data) { return $this->db->insert('utilizatori', $data); } }
Iar pentru a apela functia insert_user(), vom modifica controller-ul “Tutorial” dupa cum urmeaza:
<?php class Tutorial extends CI_Controller { public function __construct() { parent::__construct(); $this->load->database(); $this->load->model('user_model'); } public function index() { $this->load->view('paginamea'); } public function functiaMihai(){ $data = array( 'nume' => 'Popescu', 'prenume' => 'Andrei', 'username'=> 'uzerprietenos', 'parola' => 'parola1', 'email' => 'emailsmecher', 'rol' => 1, ); . $this->user_model->insert_user($data); } } ?>