Statistički zahtevi
Najčešći SELECT upiti u Drupalu su statički upiti koji koriste metodu query()
objekta konekcije baze podataka.
Statički upiti se prenose u bazu podataka skoro doslovno.
Primer:
$database = \Drupal::database(); $query = $database->query("SELECT id, example FROM {mytable}"); $result = $query->fetchAll();
Samo veoma jednostavni SELECT upiti treba da koriste statičku metodu query()
. Trebalo bi da koristite dinamički upit ako su vam potrebni složeniji upiti, dinamičko generisanje upita ili varijabilnost.
Ne koristite ovu funkciju za jednostavne INSERT, UPDATE ili DELETE upite. Oni treba da se obrađuju preko insert(), update() i delete() metoda, redom. Za složenije DELETE upite koji uključuju više tabela pogledajte Složene DELETE upite.
Argumenti
Metoda query()
objekta konekcije baze podataka prima tri argumenta:
$query
: upit koji treba izvršiti. Po potrebi koristite zamenljive parametre (placeholder-e) i stavljajte imena tabela u vitičaste zagrade.$args
: niz vrednosti za zamenu zamenljivih parametara u upitu.$options
: niz opcija za kontrolu ponašanja upita (neobavezno).
Prefiks imena tabela
U statičkim upitima, sva imena tabela moraju biti stavljena u vitičaste zagrade {...}.
Stavljanje imena tabela u vitičaste zagrade označava sistemu baze podataka da treba da doda prefiks tabele ako je potreban. Prefiks omogućava pokretanje više sajtova iz jedne baze ili deljenje određenih tabela između sajtova. Takođe pomaže da se spreči curenje podataka sa glavnog sajta u test okruženja.
Zamenljivi parametri (placeholder-i)
Zamenljivi parametri označavaju mesto gde će vrednost biti ubačena u upit. Odvajajući ih od samog upita, dozvoljavamo bazi da razlikuje SQL sintaksu i korisnički unete vrednosti, što sprečava SQL injekcije.
$query = $database->query("SELECT id, example FROM {mytable} WHERE created > :created", [ ':created' => REQUEST_TIME - 3600, ]);
Gornji kod bira sve id i example iz mytable koji su kreirani u poslednjih sat vremena (3600 sekundi). Parametar :created
će dinamički biti zamenjen vrednošću REQUEST_TIME - 3600
u trenutku izvršavanja upita.
Upit može imati proizvoljan broj zamenljivih parametara, ali svi moraju imati jedinstvena imena, čak i ako imaju istu vrednost. U zavisnosti od slučaja, niz zamenljivih može biti definisan direktno kao u primeru ili kreiran unapred i prosleđen. Redosled u nizu nije bitan.
Zamenljivi parametri koji počinju sa db_
su rezervisani za internu upotrebu i nikada ih ne treba eksplicitno navoditi.
Napomena: zamenljive parametre ne treba bekovati niti stavljati u navodnike, bez obzira na tip. Pošto se oni posebno šalju bazi podataka, server može sam razlikovati SQL tekst od vrednosti.
// POGREŠNO (navodnici oko :type parametra) $result = $database->query("SELECT example FROM {mytable} WHERE type = ':type'", [ ':type' => 'mytype', ]); // ISPRAVNO (bez navodnika oko :type parametra) $result = $database->query("SELECT example FROM {mytable} WHERE type = :type", [ ':type' => 'mytype', ]);
Parametri se ne mogu koristiti za imena kolona i tabela. Ako dolaze iz nesigurnog izvora, treba ih obraditi preko $database->escapeTable()
.
Nizovi parametara
Drupal baza podataka dodatno podržava parametre koji su nizovi. Ako je vrednost parametra niz, on će automatski biti razložen u listu razdvojenu zarezima, sa odgovarajućim zamenljivim parametrima. Time se programerima olakšava rad jer ne moraju da broje koliko će zamenljivih biti potrebno.
Primer:
$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids[])", [':ids[]' => [13, 42, 144]]);
Ova dva upita su ekvivalentna gore navedenom:
$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids_1, :ids_2, :ids_3)", [ ':ids_1' => 13, ':ids_2' => 42, ':ids_3' => 144, ]); $result = $database->query("SELECT * FROM {mytable} WHERE id IN (13, 42, 144)");
Opcije upita
Treći parametar metode query()
je niz opcija koji određuje ponašanje upita. Obično postoje dve najčešće korišćene opcije; ostale su uglavnom za internu upotrebu.
Opcija target
označava na koji server se upit šalje. Podrazumevana vrednost je default
. Jedina druga dozvoljena vrednost je replica
, što znači da upit treba da se izvrši na serverskoj replici, ako postoji.
Opcija fetch
određuje način dohvata rezultata upita. Dozvoljene vrednosti su: PDO::FETCH_OBJ
, PDO::FETCH_ASSOC
, PDO::FETCH_NUM
, PDO::FETCH_BOTH
ili ime klase. Ako je uneto ime klase, svaki red će biti dobijen kao objekat te klase. Ostale vrednosti se ponašaju kao u PDO i vraćaju rezultate kao objekat stdClass, asocijativni niz, numerički niz ili oba. Više informacija na php.net/manual/en/pdostatement.fetch.php. Podrazumevana vrednost je PDO::FETCH_OBJ
, što je preporučljivo koristiti za konzistentnost.
Primer koji izvršava upit na replici (ako postoji) i vraća rezultate kao asocijativni niz:
$result = $database->query("SELECT id, example FROM {mytable}", [], [ 'target' => 'replica', 'fetch' => PDO::FETCH_ASSOC, ]);
Rezultat poziva metode query()
može se koristiti za iteraciju kroz rezultate reda po reda. Sledeći primer učitava rezultate i zatim redove pojedinačno u promenljivu $row
pomoću fetchAssoc()
:
$sql = "SELECT name, quantity FROM goods WHERE vid = :vid"; $result = $database->query($sql, [':vid' => $vid]); if ($result) { while ($row = $result->fetchAssoc()) { // Radite nešto sa: // $row['name'] // $row['quantity'] } }
Složeni DELETE upiti
Korišćenje statičkog upita je jednostavan i sažet način za izvršenje DELETE upita koji briše podatke iz više tabela u jednom izrazu.
Primer:
$database = \Drupal::database(); $database->query("DELETE {table1}, {table2} FROM {table1} INNER JOIN {table2} ON {table1}.id = {table2}.id WHERE {table1}.id=:recno", [":recno" => 2]);
(Ovo briše red iz obe tabele: table1 i table2)
Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.