Rad sa bazom podataka u Drupal 7 - lekcija 3 - Statički upiti (SELECT)
Najčešći oblik upita u Drupalu je statički upit. Statički upit se doslovno prosleđuje bazi podataka. Samo SELECT upit može biti statički. Statičke upite treba koristiti samo u vrlo jednostavnim slučajevima. Trebalo bi da koristite dinamičke upite kada treba da napišete složen upit, dinamički kreiran ili izmenjen nakon izvršenja. Jednostavan način da izvršite statički upit je preko metode query objekta:
<?php $result = $conn->query("SELECT nid, title FROM {node}"); ?>
Proceduralni wrapper je poželjniji:
<?php $result = db_query("SELECT nid, title FROM {node}"); ?>
Pozivanje db_query() kao gore navedeno ekvivalentno je sledećem:
<?php $result = Database::getConnection()->query("SELECT nid, title FROM {node}"); ?>
Objasnimo zašto je korišćenje db_query() bolja opcija od direktnog poziva objekta Database. db_query() prima tri argumenta. Prvi je string upita, sa placeholder-ima gde je potrebno i sve tabele u zagradama {}. Drugi je niz placeholder-a. Treći, opciono, je niz konfiguracionih opcija za izvršenje upita.
Prefiks
U statičkim upitima sve tabele treba staviti u {}. To omogućava dodavanje prefiksa imenima tabela. Prefiksi omogućavaju postavljanje više sajtova u jednu bazu podataka sa različitim prefiksima tabela, na primer: "site1_", "site2_".
Placeholder-i
Placeholder-i su označeni imenima na mestima gde treba da se ubace vrednosti. Razdvajanjem placeholder-a od SQL sintakse i korisničkih vrednosti, baza podataka može da spreči SQL injekcije.
<?php $result = db_query("SELECT nid, title FROM {node} WHERE created > :created", array( ':created' => REQUEST_TIME - 3600, )); ?>
Gore je kod koji bira sve node-ove kreirane pre manje od sat vremena. Placeholder :created biće dinamički zamenjen vrednošću REQUEST_TIME - 3600, gde REQUEST_TIME predstavlja vreme izvršenja upita. Upit može imati proizvoljan broj placeholder-a, ali svi moraju imati jedinstvena imena, čak i ako imaju iste vrednosti. U zavisnosti od slučaja, niz placeholder-a može biti definisan direktno kao u primeru iznad, ili unapred definisan i prosleđen kasnije. Redosled u nizu nije bitan. Placeholder-i koji počinju sa "db_" su rezervisani od strane sistema i ne bi trebalo da se koriste. Obratite pažnju da se placeholder-i ne smeju navoditi unutar navodnika zavisno od njihovog tipa. Na primer, string vrednosti se ne navode unutar navodnika u upitu, dok numeričke vrednosti ne zahtevaju navodnike.
<?php // POGREŠNO: $result = db_query("SELECT nid, title FROM {node} WHERE type = ':type'", array( ':type' => 'page', )); // ISPRAVNO: $result = db_query("SELECT nid, title FROM {node} WHERE type = :type", array( ':type' => 'page', )); ?>
Placeholder-i ne smeju da se koriste za imena tabela ili kolona. Oni služe samo za umetanje tekstualnih ili numeričkih vrednosti.
Nizovi placeholder-a
Drupalski Database sloj ima posebnu funkciju za placeholder-e. Ako se vrednosti prosleđuju kao niz, one će automatski biti pretvorene u listu vrednosti odvojenih zarezom. To znači da developeri ne moraju ručno da prave listu placeholder-a. Pogledajte primer:
<?php db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => array(13, 42, 144))); // Pretvara se u: db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array( ':nids_1' => 13, ':nids_2' => 42, ':nids_3' => 144, )); // Što je ekvivalentno sledećem upitu: db_query("SELECT * FROM {node} WHERE nid IN (13, 42, 144)"); ?>
Parametri upita
Treći parametar db_query() je niz opcija koje direktno određuju kako će upit biti izvršen. Obično se koriste samo dva najčešća parametra, dok ostali služe za internu upotrebu. Kljuc "target" definiše za koju svrhu se upit koristi. Ako nije naveden, koristi se "default". Trenutno, samo vrednost "slave" znači da upit treba da se izvrši na slave serveru ako postoji. Kljuc "fetch" definiše na koji način će biti vraćeni podaci iz baze. Vrednosti mogu biti: PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH ili ime klase. Ako se navede ime klase, svaki rezultat će biti objekat te klase. Sva ponašanja su definisana kroz PDO i vraćaju rezultate kao stdClass objekat, asocijativni niz, numerički niz ili oba.
- PDO::FETCH_OBJ - objekat.
- PDO::FETCH_ASSOC - asocijativni niz.
- PDO::FETCH_NUM - numerički niz.
- PDO::FETCH_BOTH - niz sa oba ključa.
Više o ovome pogledajte na http://php.net/manual/en/pdostatement.fetch.php. Po defaultu je PDO::FETCH_OBJ, i to je često dobar izbor ako nemate posebnih zahteva. U sledećem primeru upit će se izvršiti na slave serveru ako je dostupan, i podaci će biti vraćeni kao asocijativni niz:
<?php $result = db_query("SELECT nid, title FROM {node}", array(), array( 'target' => 'slave', 'fetch' => PDO::FETCH_ASSOC, )); ?>