Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 3 - Ստատիկ հարցումներ (SELECT)
Drupal-ում հարցման ամենընդհանուր ձևը ստատիկ հարցումն է։ Ստատիկ հարցումը բառացիորեն փոխանցվում է տվյալների բազային։ Միայն ընտրության հարցումը (select) կարող է լինել ստատիկ։
Ստատիկ հարցումներ պետք է օգտագործել միայն շատ պարզ դեպքերում։ Եթե անհրաժեշտ է գրավել բարդ հարցում, դինամիկ ստեղծվող կամ փոփոխվող հարցում՝ օգտագործեք դինամիկ հարցումներ։
Պարզ ճանապարհ ստատիկ հարցում կատարելու՝ մեթոդի միջոցով՝
<?php $result = $conn->query("SELECT nid, title FROM {node}"); ?>
Նախընտրելի է օգտագործել գործընթացային փաթեթավորիչը՝
<?php $result = db_query("SELECT nid, title FROM {node}"); ?>
Վերոնշյալ db_query() կանչը համարժեք է հետևյալ կառուցվածքին՝
<?php $result = Database::getConnection()->query("SELECT nid, title FROM {node}"); ?>
Եկեք հասկանանք՝ ինչու է db_query()-ի օգտագործումը ավելի լավ, քան ուղղակի Database օբյեկտին դիմելը։
db_query() ընդունում է երեք արգումենտ։ Առաջինը հարցման տեքստն է՝ օգտագործելով փոխարինողներ (placeholders) և բոլոր աղյուսակները {} փակագծերի մեջ։ Երկրորդը՝ փոխարինողների զանգվածն է։ Երրորդը՝ (ընտրովի) հարցման կատարման պարամետրերի զանգվածն է։
Նախածանցում
Ստատիկ հարցումներում բոլոր աղյուսակները պետք է փակագծվեն {}-ով։ Սա թույլ է տալիս օգտագործել նախածանցներ աղյուսակների անուններին։ Նախածանցները թույլ են տալիս տեղակայել մի քանի կայք նույն բազայում՝ օգտագործելով տարբեր նախածանցներ, օրինակ՝ "site1_", "site2_"։
Փոխարինողներ
Փոխարինողները նշվում են տեղերում, որտեղ պետք է արժեքներ մուտքագրվեն։ Այս մեթոդով մենք թույլ ենք տալիս, որ տվյալների բազան տարբերակում կատարի SQL շարահյուսության և օգտագործողի կողմից տրամադրված արժեքների միջև՝ կանխելով SQL ներմուծումները։
<?php $result = db_query("SELECT nid, title FROM {node} WHERE created > :created", array( ':created' => REQUEST_TIME - 3600, )); ?>
Վերևում՝ հարցում, որը կընտրի բոլոր նոդերը, որոնք ստեղծվել են մեկ ժամ առաջ։ Փոխարինող :created-ը կփոխարինվի REQUEST_TIME - 3600 արժեքով։ Կարելի է ունենալ ցանկացած քանակի փոխարինողներ, բայց անունները պետք է լինեն եզակի։
Փոխարինողների զանգվածը կարող է լինել ներգծված կամ նախապես սահմանված։ Զանգվածի պարունակության հերթականությունը կարևոր չէ։ "db_"-ով սկսվող փոխարինող անունները ամրագրված են համակարգի կողմից և չեն կարող օգտագործվել։
Ուշադրություն դարձրեք՝ պետք է արդյոք փոխարինողը փակագծել՝ կախված նրա տեսակից։ Օրինակ՝ տողային արժեքները փակագծվում են, իսկ թվայինները՝ ոչ։
<?php // ՍԽԱԼ է. $result = db_query("SELECT nid, title FROM {node} WHERE type = ':type'", array( ':type' => 'page', )); // ՃԻՇՏ է. $result = db_query("SELECT nid, title FROM {node} WHERE type = :type", array( ':type' => 'page', )); ?>
Փոխարինողներ չեն կարող օգտագործվել աղյուսակների կամ սյունակների անունների համար։ Դրանք միայն փոխարինում են տեքստային կամ թվային արժեքներ։
Փոխարինողների զանգվածներ
Drupal-ի Database շերտը ներառում է փոխարինողների հատուկ հնարավորություն։ Եթե փոխարինողները փոխանցվում են զանգվածով, ապա դրանք ավտոմատ կերպով վերափոխվում են ստորակետով բաժանված ցուցակի։ Այսինքն՝ դուք չպետք է անհանգստանաք՝ քանի փոխարինող պետք է ավելացնեք։ Օրինակ՝
<?php db_query("SELECT * FROM {node} WHERE nid IN (:nids)", array(':nids' => array(13, 42, 144))); // Ձեռքով փոխարինողների ցուցակ օգտագործելով. db_query("SELECT * FROM {node} WHERE nid IN (:nids_1, :nids_2, :nids_3)", array( ':nids_1' => 13, ':nids_2' => 42, ':nids_3' => 144, )); // Հավասար է. db_query("SELECT * FROM {node} WHERE nid IN (13, 42, 144)"); ?>
Հարցման պարամետրեր
db_query()-ի երրորդ արգումենտը պարամետրերի զանգված է, որը կառավարում է՝ ինչպես պետք է հարցումը կատարվի։ Սովորաբար օգտագործվում են երկու պարամետր՝ "target" և "fetch"։ Մնացածը ներքին օգտագործման համար են։
"target" բանալին որոշում է՝ որ սերվերին հարցումը պետք է կատարվի։ "default" է լռելյայն արժեքը։ Միակ այլ կիրառելի արժեքը "slave" է, որը նշանակում է հարցումը կատարվում է սերվերի կրկնօրինակում։
"fetch" բանալին որոշում է՝ ինչպես արդյունքը կվերադարձվի։ Օրինակ՝ PDO::FETCH_OBJ, PDO::FETCH_ASSOC, PDO::FETCH_NUM, PDO::FETCH_BOTH կամ ինչ-որ դասի անուն։ Վերջին դեպքում արդյունքը կվերադարձվի որպես այդ դասի օբյեկտ։
Վարքագիծը որոշվում է PDO-ի միջոցով՝
- PDO::FETCH_OBJ – արդյունքները որպես օբյեկտ (stdClass):
- PDO::FETCH_ASSOC – որպես ասոցիատիվ զանգված:
- PDO::FETCH_NUM – որպես համարակալված զանգված:
- PDO::FETCH_BOTH – և՛ համարակալված, և՛ ասոցիատիվ զանգված:
Այցելեք http://php.net/manual/en/pdostatement.fetch.php։ Լռելյայն արժեքն է PDO::FETCH_OBJ և այն կարող եք օգտագործել եթե հատուկ նախապատվություն չունեք։
Հաջորդ օրինակում կատարվում է հարցում "slave" սերվերին, իսկ արդյունքը ստացվում է ասոցիատիվ զանգվածի ձևով։
<?php $result = db_query("SELECT nid, title FROM {node}", array(), array( 'target' => 'slave', 'fetch' => PDO::FETCH_ASSOC, )); ?>