logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll
19/06/2025, by Ivan

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)

Source URL:

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.