Заглушка для роботи із запитами до бази даних у WordPress
Наскільки я фанат певних API WordPress для запитів до бази даних, таких як:
- WP_Query ,
- WP_User_Query ,
- WP_Meta_Query ,
- і так далі
Я також прихильник запитів безпосередньо до бази даних, коли це необхідно.
Як ви помітили, є послідовний спосіб, яким я це роблю, і оскільки останнім часом я роблю це частіше, ось базовий формат для роботи із запитами до бази даних у WordPress.
Однак, якщо я це роблю, зазвичай я пам’ятаю про такі речі:
- завжди переконайтеся, що запит параметризований (особливо у випадку введення користувачем),
- повертати інформацію у вигляді асоціативного масиву.
Перший випадок для безпеки; другий — більш-менш для зручності, щоб спростити ітерацію даних за допомогою функцій масиву PHP.
Запити до бази даних у WordPress
По-перше, важливо зрозуміти дві концепції:
- параметризація,
- масив_стовпець
Це ядро того, як я пишу свої запити та працюю з їх результатами.
1 Параметризація
Ви можете прочитати більше про це в Codex, але параметризація – це спосіб, за допомогою якого ми можемо писати запити, які працюють для запобігання SQL-ін’єкції.
Усі дані в SQL-запитах повинні бути екрановані SQL перед виконанням SQL-запиту, щоб запобігти атакам SQL-ін’єкції. Метод
prepareвиконує цю функцію для WordPress, який підтримує як sprintf() -подібний, так і vsprintf() -подібний синтаксис.
Це означає, що метод підтримує такі маркери, як %s, %d і %f під час передачі інформації в запит. Я покажу приклад цього пізніше в публікації.
2 Робота зі стовпцями масиву
Результати таких запитів можна повернути різними способами. А саме як об’єкт, чисельно індексований масив або асоціативний масив. Частіше я люблю використовувати масиви (і я покажу, як це зробити в WordPress пізніше в цій публікації).
Однак причина в тому, що я можу скористатися перевагами array_column. З посібника PHP:
array_column() повертає значення з одного стовпця вхідних даних, ідентифікованого column_key. За бажанням можна надати index_key для індексації значень у поверненому масиві значеннями зі стовпця index_key вхідного масиву.
Це означає, що якщо у вас є масив і він містить купу результатів, кожен з яких має той самий стовпець, ви можете легко просто отримати інформацію, передавши масив у метод, а потім передавши назву стовпця в метод.
Результат? Числово індексований масив значень. Це значно полегшує перебір даних через array_map, за допомогою for або foreach.
Заглушка для запиту до бази даних
Маючи це обґрунтування, ось заглушка, яку я зазвичай використовую, коли працюю безпосередньо із запитами до бази даних:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
",
$userId
),
ARRAY_A
);
if (empty($results)) {
return;
}
$results = array_map($results, 'column_name');
А ось приклад із кількома різними відомостями, щоб ви могли побачити , як це працює :
<?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');
Запит до таблиці wp_user_meta може здатися дурним, оскільки get_user_meta — це дійсна функція API, але я подумав, що це буде простий запит для розуміння, враховуючи те, що я намагався пояснити в минулому.
У будь-якому випадку я не можу надати запит і не можу впоратися з випадком, коли результати можуть повертатися з кількома стовпцями (у такому випадку вам доведеться працювати з чимось іншим, ніж array_map, але це має бути досить легко, правда? )
