Nii palju kui ma olen teatud WordPressi API-de fänn andmebaasi päringute tegemiseks, näiteks:
- WP_Query ,
- WP_User_Query ,
- WP_Meta_Query ,
- ja nii edasi
Samuti armastan ma vajaduse korral otse andmebaasi päringuid teha.
Nagu märkate, on mul seda järjepidevalt tehtud ja kuna on aegu, kus olen seda sagedamini teinud, on siin WordPressi andmebaasipäringutega töötamise põhivorming.
Kui ma aga seda teen, pean üldiselt silmas järgmisi tegureid:
- alati veenduge, et päring on parameetritega määratud (eriti kasutaja sisendi puhul),
- tagastab teabe assotsiatiivse massiivi kujul.
Esimene juhtum on turvalisuse huvides; teine on enam-vähem mugavuse huvides, et muuta andmete itereerimine PHP massiivi funktsioonide kaudu lihtsamaks.
Andmebaasipäringud WordPressis
Esiteks on oluline mõista kahte mõistet:
- parameetrite määramine,
- massiivi_veerg
Need on minu päringute kirjutamise ja nende tulemustega töötamise põhielemendid.
1 Parameetristamine
Selle kohta saate rohkem lugeda Codexist, kuid parameetrite määramine on viis, kuidas saame kirjutada päringuid, mis takistavad SQL-i süstimist.
Kõik SQL-päringute andmed peavad enne SQL-päringu täitmist olema SQL-i vältimisega, et vältida SQL-i süstimise rünnakuid. Meetod
preparetäidab seda funktsiooni WordPressi jaoks, mis toetab nii sprintf() – sarnast kui ka vsprintf()- sarnast süntaksit.
See tähendab, et meetod toetab päringusse teabe edastamisel selliseid märke nagu %s, %d ja %f . Näitan selle kohta hiljem postituses.
2 Töötamine massiivi veergudega
Selliste päringute tulemusi saab tagastada mitmel erineval viisil. Nimelt objektina, numbriliselt indekseeritud massiivina või assotsiatiivse massiivina. Enamasti meeldib mulle kasutada massiive (ja ma näitan, kuidas seda WordPressis teha hiljem selles postituses).
Põhjus on aga selles, et saaksin ära kasutada funktsiooni array_column. PHP juhendist:
array_column() tagastab väärtused sisendi ühest veerust, mida tähistab veeru_võti. Valikuliselt võidakse ette näha indeksi_võti, et indekseerida tagastatud massiivi väärtusi sisendmassiivi veerus index_key olevate väärtustega.
See tähendab, et kui teil on massiiv ja sellel on hunnik tulemusi, millest igaühel on sama veerg, saate teabe lihtsalt lihtsalt edastada, edastades massiivi meetodile ja seejärel veeru nime meetodile.
Tulemus? Numbriliselt indekseeritud väärtuste massiiv. See muudab andmete itereerimise palju lihtsamaks läbi array_map, kasutades foreach või foreach.
Tünn andmebaasi päringute tegemiseks
Kui see põhjendus on paigas, siis siin on tünn, mida ma tavaliselt kasutan alati, kui töötan otse andmebaasipäringutega:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
",
$userId
),
ARRAY_A
);
if (empty($results)) {
return;
}
$results = array_map($results, 'column_name');
Ja siin on näide paari erineva teabega, et saaksite näha, kuidas see töötab :
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT
user_id,
meta_value
FROM $wpdb->usermeta
WHERE meta_key LIKE %s
AND user_id = %d
",
'%wc_authorize_net_cim_customer_profile_id%',
wp_get_current_user()->ID;
),
ARRAY_A
);
if (empty($results)) {
return [];
}
$results = array_map($results, 'meta_value');
Päringu esitamine tabeli wp_user_meta vastu võib tunduda rumal, kuna get_user_meta on kehtiv API funktsioon, kuid ma arvasin, et seda on lihtne mõista, arvestades, mida ma praegu üritan selgitada.
Igatahes ei saa ma päringut esitada ega ka juhul, kui tulemused võivad tulla tagasi mitme veeruga (sel juhul peate töötama millegi muuga kui array_map, kuid see peaks olema piisavalt lihtne, eks? )
