Vodič je stariji od 2 godine i možda nije u potpunosti aktualan. Za provjeru, koristite “pitaj učitelja”.

Kako napraviti PHP Blog 2.dio – ActiveRecord

Kako napraviti PHP Blog 2.dio – ActiveRecord
Autor članka: Igor Benić
Kategorije: Programiranje
Datum objave: 31.03.2014

U prošlom tutorijalu napravili smo temelj za izradu članaka. U ovome tutorijalu upoznati ćemo se sa ActiveRecord-om.


Pogledaj sve tutorijale iz ovog serijala:
Kako napraviti PHP Blog – 1.dio
Kako napraviti PHP Blog – 2.dio
Kako napraviti PHP Blog – 3.dio

Što je to ActiveRecord?

ActiveRecord je biblioteka koja je napravljena na temelju Ruby on Rails implementaciji kod upravljanja sa bazama podataka. ActiveRecord pojednostavljuje interakciju sa SQL upitima te olakšava i ubrzava rad sa bazama podataka. Dovoljno je samo pogledati upute na stranici ActiveRecord-a i moguće je upravljati svojom bazom podataka u par minuta.

Podržane baze podataka jesu:

  • MySQL
  • SQLite
  • Postgres
  • Oracle

Za praćenje tutorijala potrebno je skinuti stabilnu verziju ove biblioteku koja se može skinuti na ovoj stranici. Raspakirajte ga te raspakirani folder ( folder koji sadrži ostale datoteke i direktorije za activerecord ) spremite u putanja_do/xampp/htdocs.

Raspakirani folder

Ukoliko otvorite taj folder sada bi trebali vidjeti sljedeće:

ActiveRecord Folder

Otvorite sljedeću datoteku examples/simple/simple_with_option.php u vašem programu za izradu web aplikacija/stranica. Sada je potrebno promijeniti varijable sa našim podacima:

<?php
require_once dirname(__FILE__) . '/../../ActiveRecord.php';

class Book extends ActiveRecord\Model
{
    // explicit table name since our table is not "books"
    static $table_name = 'posts';

    // explicit pk since our pk is not "id"
    static $primary_key = 'id';

    // explicit connection name since we always want production with this model
    static $connection = 'development';

    // explicit database name will generate sql like so => db.table_name
    static $db = 'blog';
}

$connections = array(
    'development' => 'mysql://root:@localhost/blog',
    'production' => 'mysql://root: @localhost/blog'
);

// initialize ActiveRecord
ActiveRecord\Config::initialize(function($cfg) use ($connections)
{
    $cfg->set_model_directory('.');
    $cfg->set_connections($connections);
});

print_r(Book::first()->attributes());
?>

Ukoliko spremite ovakav kod i odete na adresu: http://localhost/php-activerecord/examples/simple/simple_with_options.php i dobiti ćemo izlistano polje sa vrijednostima prvog članka.

A što se događa gore u kodu?!

Sada da malo objasnimo što se događa gore u kodu kako bi svi mogli razumijeti.

Prvo dohvaćamo datoteku u kojoj se nalazi definicija same biblioteke odnosno od kuda počinju sve funkcije i sl. Zatim se definira klasa, koju smo mi ostavili kao što je na početku definirana, sa nazivom Books koja nasljeđuje sve atribute i metode iz klase Model koja spada pod ActiveRecord. Unutar klase smo zatim dodatno definirali varijable koje su prebrisale vrijednost iz klase Model kako bi mogli pristupati našoj bazi podataka. Odredili smo koju tablicu gleda, koju bazu podataka gleda, koji je primary key u tablici te koju konekciju koristimo. Ovdje je namješteno da se koristi development konfiguracija za konekciju.

Nakon toga definirano je polje u koje se spremaju konfiguracije za konekciju. Zatim se inicijalizira sam ActiveRecord kako bi se konektirali na našu bazu podataka i pristupili našoj tablici posts.

Na zadnjoj liniji ispisuju se vrijednosti polja od prvog članka.

Ispisivanje

Ukoliko hoćemo vidjeti drugi članak dovoljno je napisati

print_r(Book::find(2)->attributes());
Ukoliko hoćemo ispisati sve članke dovoljno je napraviti sljedeće:

$sviClanci = Book::all();
foreach ($sviClanci as $clanak) {
    echo $clanak->naslov . "<br/>";
}

Ovdje smo u varijablu sviClanci spremili sve članke koje smo dobili preko Book:all(). Zatim smo za svaki članak ispisali naslov u novom redu. Ovdje se može primijetiti kako smo samo naredbom ->naslov dobili upravo ono polje koje smo nazvali naslov. Da bi ovo sve dobili bez ove biblioteke bilo bi nam potrebno puno više linija koda i funkcija.

Unos

Unos podataka je još lakši. Sve što je potrebno je inicijalizirati novi objekt, dodijeliti vrijednost atributa istih naziva kao polja u tablici te spremiti objekt. To ćemo upravo napraviti sljedećim naredbama.

$noviPost = new Book;
$noviPost->naslov = "Novi Post";
$noviPost->tekst = "Ovo je novi tekst";
$noviPost->sazetak = "Ovo je novi sazetak";
$noviPost->save();

Ukoliko sada izvrtimo opet ovu skriptu (ukoliko ste pratili već ste dosta popunili našu datoteku :) ), dobili smo sljedeće:

Novi unos preko ActiveRecord-a

Preko phpmyAdmina možemo vidjeti da smo dobili upravo taj novi članak koji je unesen putem skripta u samo par linija kod-a. Čak nismo trebali znati niti jedan dio SQL upita kako bi to izvršili.

Mijenjanje postojećeg članka

Kako bih sada mijenjao postojeći članak, a pritom izbjegao unošenje ponovnog članka prvo ću zakomentirati dio gdje se unosi članak ( početak sa /*, a završetak tog dijela sa */ ). Sada ćemo prvo pronaći jedan članak. Neka to bude zadnji uneseni članak kojeg možemo dobiti na nekoliko načina. Ja ću koristiti trenutno najjednostavniji sa naredbom last().

$alterPost = Book::last();
$alterPost->naslov = "Novi, promijenjeni Post";
$alterPost->save();

Ukoliko sada ponovno izvrtite skriptu, a pod time mislim na refresh stranice i provjerite svoj phpMyAdmin trebali bi vidjeti promijenjeni naslov zadnjeg članka (Naslov će se pri prvoj vrtnji ispisati kao da se nije promijenio zato jer se ispisuje prije nego što se sam članak mijenja).

Promijenjei Članak

Brisanje

Zadnja funkcija koju ćemo pokazati u ovome tutorijali je brisanje članka. Kao i prošli put, da nas ne bi bunilo zakomentirati ću dio gdje sam mijenjao vrijednosti članka i započeti pisati kod za brisanje samog članka. Isto ćemo koristiti zadnje uneseni članak.

$deletePost = Book::last();
$deletePost->delete();

Jednostavno i jasno, uzimamo zadnji zapis u bazi podataka, u ovom slučaju zadnji članak i obrišemo ga. Sada kada izvrtimo skriptu, ispisati će se promijenjeni naslov samo zato jer se ispisuje prije brisanja. Ukoliko sada pogledamo phpMyAdmin vidjet ćemo da se naš posljednji članak obriše.

PAŽNJA! Ukoliko izvrtite nekoliko puta skriptu sa ovim dijelom koda, obrisati ćete sve članke, tako da pokušajte samo jedanput izvrtiti skriptu.

Zaključak

ActiveRecord je odlična biblioteka koja, kao što ste mogli vidjeti, olakšava interakciju sa bazom i izvršavanje radnji sa istom. Za sve ove prikazane radnje potrebno bi nam bilo na desetke linija koda kako bi dobili željene rezultate, dok ovdje možemo lako to izvršavati bez pretjeranog razmišljanja. Dobra praksa je još provjeravati prilikom unošenja sve dobivene podatke kako ne bi došlo do kakvih greški u sustavu koji se mogu dogoditi prilikom namjernog napada na stranicu.

Cijeli kod:

<?php
require_once dirname(__FILE__) . '/../../ActiveRecord.php';

class Book extends ActiveRecord\Model
{
    // explicit table name since our table is not "books"
    static $table_name = 'posts';

    // explicit pk since our pk is not "id"
    static $primary_key = 'id';

    // explicit connection name since we always want production with this model
    static $connection = 'development';

    // explicit database name will generate sql like so => db.table_name
    static $db = 'blog';
}

$connections = array(
    'development' => 'mysql://root:@localhost/blog',
    'production' => 'mysql://root: @localhost/blog'
);

// initialize ActiveRecord
ActiveRecord\Config::initialize(function($cfg) use ($connections)
{
    $cfg->set_model_directory('.');
    $cfg->set_connections($connections);
});

print_r(Book::first()->attributes());
echo "<br/>";
print_r(Book::find(2)->attributes());
echo "<br/>";
print_r(Book::all());
echo "<br/>";
$sviClanci = Book::all();
foreach ($sviClanci as $clanak) {
    echo $clanak->naslov . "<br/>";
}

/* UNOS ČLANKA */
/*$noviPost = new Book;
$noviPost->naslov = "Novi Post";
$noviPost->tekst = "Ovo je novi tekst";
$noviPost->sazetak = "Ovo je novi sazetak";
$noviPost->save();*/

/* IZMJENA ČLANKA */
/*$alterPost = Book::last();
$alterPost->naslov = "Novi, promijenjeni Post";
$alterPost->save();*/

/* BRISANJE ČLANKA */
/*$deletePost = Book::last();
$deletePost->delete();*/
?>

Jedan komentar na članak 'Kako napraviti PHP Blog 2.dio – ActiveRecord'

Pratite komentare na članak 'Kako napraviti PHP Blog 2.dio – ActiveRecord' putem RSS feeda.

  1. Miroslav
    13.09.2016 u 10:38h

    Veliki pozdrav i zahvaljujem kako na tutorijalima na ovoj strani, tako i na videotutoriju koji je odličan.

    Kod pravljenja bloga javlja mi grešku nakon snimljeno activerecorda:

    Fatal error: Uncaught exception ‘ActiveRecord\DatabaseException’ with message ‘exception ‘PDOException’ with message ‘SQLSTATE[HY000] [1045] Access denied for user ‘root’@’localhost’ (using password: NO)’ in C:\xampp\htdocs\php-activerecord\lib\Connection.php:202 Stack trace: #0 C:\xampp\htdocs\php-activerecord\lib\Connection.php(202): PDO->__construct(‘mysql:host=loca…’, ‘root’, ”, Array) #1 C:\xampp\htdocs\php-activerecord\lib\Connection.php(99): ActiveRecord\Connection->__construct(Object(stdClass)) #2 C:\xampp\htdocs\php-activerecord\lib\ConnectionManager.php(33): ActiveRecord\Connection::instance(‘mysql://root:@l…’) #3 C:\xampp\htdocs\php-activerecord\lib\Table.php(83): ActiveRecord\ConnectionManager::get_connection(‘development’) #4 C:\xampp\htdocs\php-activerecord\lib\Table.php(61): ActiveRecord\Table->__construct(‘Book’) #5 C:\xampp\htdocs\php-activerecord\lib\Model.php(725): ActiveRecord\Table::load(‘Book’) #6 C:\xampp\htdocs\php-activerecord\lib\Model.php(1428): ActiveRecord\Model::table() #7 [internal func in C:\xampp\htdocs\php-activerecord\lib\Connection.php on line 204

    da li je ovo zbog toga što imam svoj password koji koristim kod php admin ili je nešto drugo. Još jednom zahvaljujem.

    Pozdrav

Ostavite komentar na ovaj članak

Uvredljivi i spam komentari biti će obrisani. Ukoliko se Vaš komentar ne pojavi odmah, pričekajte da ga odobrimo ;-). Odgovore na pitanje brže ćete dobiti ukoliko nas kontaktirate putem forme pitajte učitelja.