Ստատիկ հարցումներ
Drupal-ում SELECT հարցումների մեջ ամենատարածվածն են σταտիկ հարցումները, որոնք օգտագործում են տվյալների բազայի կապի օբյեկտի query() մեթոդը։
Ստատիկ հարցումները գրեթե բառացիորեն փոխանցվում են տվյալների բազային։
Օրինակ՝
$database = \Drupal::database(); $query = $database->query("SELECT id, example FROM {mytable}"); $result = $query->fetchAll();
Շատ պարզ SELECT հարցումների դեպքում պետք է օգտագործել միայն static query() մեթոդը։ Եթե ցանկանում եք ավելի բարդ հարցումներ, դինամիկ հարցումների գեներացիա կամ փոփոխականություն, ապա պետք է օգտագործեք դինամիկ հարցում։
Այս ֆունկցիան չպետք է օգտագործվի պարզ INSERT, UPDATE կամ DELETE հարցումների համար։ Դրանք պետք է իրականացվեն համապատասխանաբար insert(), update() և delete() մեթոդներով։ Քիչ բարդ DELETE հարցումների համար մի քանի աղյուսակների վրա դիտեք բարդ DELETE հարցումները։
Արգումենտներ
Տվյալների բազայի կապի query() մեթոդը ընդունում է երեք արգումենտ՝
- $query՝ գործարկվող հարցումը։ Պահանջության դեպքում օգտագործեք տեղակիչներ և աղյուսակների անունները նշել փակագծերով։
- $args՝ տեղակիչների արժեքների զանգված՝ հարցման մեջ փոխարինելու համար։
- $options՝ պարամետրերի զանգված՝ հարցման աշխատանքի կառավարման համար (ոչ պարտադիր)։
Աղյուսակի անվան նախածանց (prefix)
Ստատիկ հարցումների մեջ աղյուսակների բոլոր անունները պետք է փակվեն ծածկագրված փակագծերով {...}։
Աղյուսակների անունների նման փակումը նշում է համակարգին, որ անհրաժեշտության դեպքում պետք է ավելացվի նախածանցի տող։ Նախածանցը թույլ է տալիս մի քանի կայքեր աշխատացնել մեկ տվյալների բազայից կամ որոշակի աղյուսակներ կիսել կայքերի միջև։ Նշանակում է նաև խուսափել տվյալների արտահոսքից հոստ կայքից դեպի թեստային միջավայրեր։
Տեղակիչներ
Տեղակիչները նշում են, թե որտեղ է տվյալ արժեքը տեղադրվելու հարցման մեջ։ Բաժանելով դրանք հարցումից, թույլ ենք տալիս տվյալների բազային տարբերակել SQL-ի սինտաքսը և օգտվողի տրամադրած արժեքները, ինչի արդյունքում կանխարգելվում են SQL-ի ինժեներական հարձակումները։
$query = $database->query("SELECT id, example FROM {mytable} WHERE created > :created", [ ':created' => REQUEST_TIME - 3600, ]);
Վերևի կոդը կընտրի բոլոր mytable աղյուսակի id-ները և օրինակները, որոնք ստեղծվել են վերջին մեկ ժամվա ընթացքում (3600 վայրկյան)։ :created տեղակիչը դինամիկ փոխարինվում է REQUEST_TIME - 3600 արժեքով հարցման կատարման պահին։
Հարցումը կարող է ունենալ ցանկացած քանակությամբ տեղակիչներ, բայց բոլորը պետք է ունենան եզակի անուններ, նույնիսկ եթե արժեքները նույնն են։ Տեղակիչների զանգվածը կարող է լինել ուղղակի ներառված կամ նախօրոք կազմված և փոխանցված։ Զանգվածի կարգը նշանակություն չունի։
«db_» նախածանցով տեղակիչները վերապահված են համակարգի ներսի օգտագործման համար և երբեք չպետք է օգտագործվեն բացահայտ։
Ուշադրություն դարձրեք, որ տեղակիչները չպետք է լինեն մեջբերումներում կամ կոտրածական նշաններով, անկախ դրանց տեսակից։ Չափաքանակային տվյալները տրվում են տվյալների բազային առանձին, ուստի այն տարբերակումը կատարում է ինքնուրույն։
// ՍՈՒՐԲԱՀԱՏՈՒԹՅՈՒՆ (':type' տեղակիչը մեջբերումներում) $result = $database->query("SELECT example FROM {mytable} WHERE type = ':type'", [ ':type' => 'mytype', ]); // ՃԻՇՏ ( ':type' տեղակիչը առանց մեջբերումների) $result = $database->query("SELECT example FROM {mytable} WHERE type = :type", [ ':type' => 'mytype', ]);
Տեղակիչները չեն կարող օգտագործվել սյունակի կամ աղյուսակի անվան համար։ Եթե դրանք ստացվել են անապահով մուտքից, պետք է անցնեն $database->escapeTable() մեթոդով։
Տեղակիչ-զանգվածներ
Drupal-ի տվյալների բազայի շերտը ունի լրացուցիչ տեղակիչ ֆունկցիոնալություն։ Եթե տեղակիչի արժեքը զանգված է, այն ավտոմատ կերպով բաշխվում է ստորակետով առանձնացված ցուցակի, և համապատասխան տեղակիչը նույնպես։ Այսինքն՝ ծրագրավորողներին չեն պահանջվում հաշվարկել տեղակիչների քանակը։
Օրինակ՝
$result = $database->query("SELECT * FROM {mytable} WHERE id IN (:ids[])", [':ids[]' => [13, 42, 144]]);
Հաջորդ երկու արտահայտությունները հավասարազոր են վերևի օրինակին՝
$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)");
Հարցումների տարբերակներ
query() մեթոդի երրորդ արգումենտը՝ options զանգվածը, սահմանում է հարցման վարքագիծը։ Շատ դեպքերում օգտագործվում են միայն երկու պարամետրեր։ Մյուս արժեքները հիմնականում ներսի օգտագործման համար են։
"target" բանալին նշում է տվյալների աղբյուրը։ Եթե չի նշված, օգտագործվում է «default»։ Այժմ մյուս թույլատրելի արժեքը «replica»-ն է՝ նշելու համար, որ հարցումը պետք է իրականացվի կրկնօրինակ սերվերին, եթե առկա է։
"fetch" բանալին սահմանում է, թե ինչպես կստացվեն հարցման վերադարձված տվյալները։ Ընդունելի արժեքներ են՝ PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH կամ դասի անունը որպես տող։ Եթե նշվում է դասի անունը, յուրաքանչյուր արդյունք կստեղծվի որպես այդ դասի նոր օբյեկտ։ Այլ արժեքների դեպքում PDO-ն վերադարձնում է տվյալները համապատասխան ձևաչափերով։ Նայեք http://php.net/manual/en/pdostatement.fetch.php։ Նախնականը PDO::FETCH_OBJ է, և խորհուրդ է տրվում օգտագործել առանց հատուկ պատճառի։
Հաջորդ օրինակում հարցումը կատարվում է կրկնօրինակ սերվերին (եթե հասանելի է), և արդյունքները վերցվում են որպես ասոցիատիվ զանգված։
$result = $database->query("SELECT id, example FROM {mytable}", [], [ 'target' => 'replica', 'fetch' => PDO::FETCH_ASSOC, ]);
query() մեթոդի վերադարձրած արդյունքի օբյեկտը կարելի է օգտագործել վերադարձված տողերը առանձին ստանալու համար։ Հաջորդ օրինակում $result-ը պարունակում է բոլոր վերադարձված տողերը, իսկ fetchAssoc() մեթոդով դրանք հանվում են հերթով $row փոփոխականի մեջ։
$sql = "SELECT name, quantity FROM goods WHERE vid = :vid"; $result = $database->query($sql, [':vid' => $vid]); if ($result) { while ($row = $result->fetchAssoc()) { // Կարող եք անել հետևյալով՝ // $row['name'] // $row['quantity'] } }
Բարդ DELETE հարցումներ
Ստատիկ հարցումը հեշտ և կարճ ձև է արտահայտելու մեկ արտահայտությամբ միաժամանակ մի քանի աղյուսակներից տվյալներ ջնջելու համար։
Օրինակ՝
$database = \Drupal::database(); $database->query("DELETE {table1}, {table2} FROM {table1} INNER JOIN {table2} ON {table1}.id = {table2}.id WHERE {table1}.id=:recno", [":recno" => 2]);
(Ջնջում է տողը ինչպես table1, այնպես էլ 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.