Izrada PHP bloga: Kako dohvatiti i prikazati članke iz baze podataka pomoću ActiveRecord-a

Uvod u prikazivanje sadržaja na PHP blogu

U prethodnim koracima naše serije o izradi PHP bloga, fokusirali smo se na postavljanje temelja – od instalacije potrebnog okruženja do definiranja baze podataka i unosa prvih testnih članaka. Sada dolazimo do ključnog trenutka: kako te podatke izvući iz baze i prikazati ih posjetiteljima na web stranici. Iako se ovaj zadatak može obaviti klasičnim SQL upitima, u ovom ćemo vodiču koristiti ActiveRecord uzorak, koji nam omogućuje interakciju s bazom podataka na moderniji, objektno-orijentirani način.

Korištenje ActiveRecord-a značajno smanjuje količinu koda koji moramo napisati te čini našu aplikaciju čišćom i lakšom za održavanje. Umjesto pisanja dugačkih SELECT naredbi, koristit ćemo jednostavne metode klase koje će taj posao odraditi u pozadini. U nastavku ćemo detaljno proći kroz strukturu projekta, konfiguraciju veze s bazom te samu logiku ispisa članaka.

Struktura projekta i organizacija datoteka

Prije nego što krenemo s pisanjem koda, važno je imati preglednu strukturu mapa i datoteka. Dobra organizacija ključna je za svaki programerski projekt, bez obzira na njegovu veličinu. Za potrebe našeg bloga, struktura bi trebala izgledati ovako unutar vaše xampp/htdocs/blog/ mape:

  • activeRecord/ – Mapa koja sadrži sve datoteke biblioteke PHP-ActiveRecord.
  • config.php – Datoteka u kojoj definiramo postavke za spajanje na bazu podataka.
  • blog.php – Datoteka u kojoj definiramo naš model (klasu) za interakciju s tablicom članaka.
  • index.php – Glavna datoteka koja služi za prikaz članaka korisniku.

Ovakva podjela omogućuje nam da logiku spajanja odvojimo od same definicije podataka i vizualnog prikaza, što je u skladu s najboljim praksama u razvoju softvera.

Konfiguracija veze s bazom podataka (config.php)

Prvi korak u programskom dijelu je uspostavljanje veze s MySQL bazom podataka. Za to ćemo koristiti datoteku config.php. U njoj inicijaliziramo ActiveRecord i prosljeđujemo mu potrebne parametre za spajanje.

<?php
require_once dirname(__FILE__) . '/activeRecord/ActiveRecord.php'; $connections = array( 'development' => 'mysql://root:@localhost/blog', 'production' => 'mysql://korisnik:lozinka@localhost/blog'
); // Inicijalizacija ActiveRecord konfiguracije
ActiveRecord\Config::initialize(function($cfg) use ($connections)
{ $cfg->set_model_directory('.'); $cfg->set_connections($connections);
});
?>

U gornjem kodu definirali smo niz $connections koji sadrži podatke za razvojno (development) i produkcijsko okruženje. Format zapisa je driver://username:password@host/database_name. Obratite pozornost na to da je u lokalnom okruženju (XAMPP) lozinka za korisnika root obično prazna. Metoda set_model_directory('.') govori knjižnici da traži definicije naših modela u trenutnoj mapi.

Definiranje modela u datoteci blog.php

Sada kada imamo uspostavljenu vezu, moramo reći PHP-u kako da interpretira našu tablicu s postovima. To radimo kreiranjem klase koja nasljeđuje ActiveRecord\Model. Ovu klasu spremamo u datoteku blog.php.

<?php
require_once("config.php"); class Blog extends ActiveRecord\Model
{ // Eksplicitno navodimo ime tablice jer se ne poklapa s množinom imena klase static $table_name = 'posts'; // Definiramo primarni ključ static $primary_key = 'id'; // Biramo koju konekciju želimo koristiti iz config.php datoteke static $connection = 'development'; // Naziv baze podataka static $db = 'blog';
}
?>

Ova klasa služi kao most između PHP-a i baze podataka. ActiveRecord koristi konvenciju nad konfiguracijom, što znači da bi on automatski tražio tablicu pod nazivom “blogs” (množina imena klase). Budući da se naša tablica zove posts, moramo to eksplicitno navesti pomoću statičke varijable $table_name. Isto vrijedi i za primarni ključ i naziv baze podataka.

Prikazivanje članaka na naslovnoj stranici (index.php)

Zadnji korak je kreiranje korisničkog sučelja. U datoteci index.php pozvat ćemo naš model, dohvatiti sve objave iz baze i ispisati ih unutar HTML strukture. Zahvaljujući ActiveRecord-u, dohvaćanje svih redaka iz tablice svodi se na jednu liniju koda: Blog::all().

<?php
require_once("blog.php"); // Dohvaćanje svih zapisa iz baze
$posts = Blog::all();
?>
<!DOCTYPE HTML>
<html lang="hr">
<head> <meta charset="UTF-8"> <title>Moj PHP Blog - Popis članaka</title> <style> article { border-bottom: 1px solid #ccc; margin-bottom: 20px; padding-bottom: 10px; } h1 { color: #333; } p { line-height: 1.6; } </style>
</head>
<body> <header> <h1>Dobrodošli na moj blog</h1> </header> <?php foreach ($posts as $post): ?> <article> <header> <h2><?php echo htmlspecialchars($post->naslov); ?></h2> </header> <section> <p><?php echo nl2br(htmlspecialchars($post->sazetak)); ?></p> </section> </article> <?php endforeach; ?> </body>
</html>

U ovom primjeru koristimo foreach petlju kako bismo prošli kroz svaki objekt u nizu $posts. Svaki objekt predstavlja jedan redak u bazi podataka, a njegovim stupcima pristupamo kao svojstvima objekta (npr. $post->naslov). Korištenje funkcije htmlspecialchars preporučuje se radi sigurnosti, kako bi se spriječili XSS napadi u slučaju da sadržaj baze sadrži maliciozni kod.

Česte pogreške i savjeti za rješavanje problema

Prilikom implementacije sustava za prikaz postova, programeri se često susreću s nekoliko uobičajenih prepreka. Evo popisa na što trebate obratiti pažnju:

ProblemMogući uzrokRješenje
Prazna stranica (White Screen of Death)Greška u PHP sintaksi ili kriva putanja do biblioteke.Uključite prikaz grešaka u php.ini ili provjerite error_log.
Connection refusedPogrešni podaci za bazu (user/pass) ili MySQL nije pokrenut.Provjerite XAMPP kontrolnu ploču i postavke u config.php.
Table not foundActiveRecord traži krivo ime tablice.Provjerite jeste li ispravno definirali static $table_name u modelu.

Zaključak i daljnji koraci

Uspješno smo povezali našu bazu podataka s PHP aplikacijom i omogućili dinamički prikaz sadržaja. Korištenjem ActiveRecord-a, proces je postao intuitivan i manje podložan greškama koje se često javljaju kod ručnog pisanja SQL-a. Iako trenutno prikazujemo sve članke odjednom, u stvarnim aplikacijama često je potrebno implementirati straničenje (pagination) ili filtriranje sadržaja.

U sljedećem nastavku naučit ćemo kako kreirati pojedinačni prikaz za svaki članak. To podrazumijeva izradu stranice koja će primati ID članka putem URL-a i prikazivati puni tekst odabrane objave. Do tada, pokušajte dodati još polja u bazu (poput datuma objave ili autora) i ispisati ih na naslovnici kako biste utvrdili naučeno gradivo.

Često postavljana pitanja (FAQ)

Zašto koristiti ActiveRecord umjesto običnog PDO-a?
ActiveRecord nudi višu razinu apstrakcije. Dok PDO zahtijeva pisanje sirovog SQL-a, ActiveRecord vam omogućuje rad s objektima, što ubrzava razvoj i čini kod čitljivijim, osobito u većim projektima.

Što ako želim prikazati samo najnovije postove?
Umjesto metode all(), možete koristiti metodu find s dodatnim parametrima. Primjerice: Blog::find('all', array('order' => 'datum DESC', 'limit' => 5));.

Radi li ovaj kod na svim verzijama PHP-a?
PHP-ActiveRecord je starija biblioteka. Iako radi na većini PHP 7.x instalacija, kod modernijih verzija poput PHP 8.1+ mogli biste naići na upozorenja o zastarjelim funkcijama. U tom slučaju preporučuje se korištenje novijih ORM alata poput Eloquenta ili Doctrinea, no principi ostaju vrlo slični.

Odgovori

Vaša adresa e-pošte neće biti objavljena. Obavezna polja su označena sa * (obavezno)