Прямі запити до бази даних у WordPress
Якщо ви повернетесь до будь-якої з публікацій, які я написав за останні, скажімо, два роки, ви, ймовірно, побачите, що я майже кожного разу пропоную використовувати доступні API замість запитів до бази даних каталогу.
І правда в тому, що я все ще схиляюся в цьому напрямку. Тобто, якщо є абстракція чи API, які доступні для виконання чогось конкретного, я намагаюся це використовувати.
Але в кількох останніх проектах я працював із деякими відносно великими наборами даних (великими порівняно з наборами даних некорпоративного рівня). І при цьому я намагався переконатися, що оновлення даних відбуваються якомога швидше.
У подібних ситуаціях, хоча це не подобається стандартам кодування WordPress, я вважаю, що прямі запити до бази даних іноді є найкращим варіантом для цього за певних умов.
Використання прямих запитів до бази даних
Прямі запити до бази даних є однією з тих речей, які мають дещо неоднозначну репутацію серед розробників WordPress:
- вони не заохочуються до стандартів кодування,
- WordPress пропонує прямий доступ до бази даних через $wpdb,
- є нюанси щодо запитів до бази даних, які слід розуміти.
Отже, коли ви бачите щось подібне :
<?php
private function set_all_scheduled_events_as_public() {
global $wpdb;
// @codingStandardsIgnoreStart
$wpdb->query(
$wpdb->prepare(
"
UPDATE $wpdb->posts
SET post_status = '%s'
WHERE post_type = '%s'
AND post_status = '%s'
",
'publish',
'tribe_events',
'future') );
// @codingStandardsIgnoreEnd
}
Як дізнатися, вдалий це хід чи ні? І ще краще, як ви знаєте, чи варто вам використовувати запити до бази даних каталогу у вашому коді?
Є кілька запитань, які я зазвичай задаю собі, коли маю справу з ними. Всі вони наведені нижче.
1 Чи є індекси на стовпцях?
Перш ніж використовувати прямі запити до бази даних у WordPress, потрібно перевірити, чи мають стовпці, які я запитую, індекси зазначених стовпців.
А причина така :
Індекси використовуються для швидкого пошуку даних без необхідності шукати кожен рядок у таблиці бази даних під час кожного доступу до таблиці бази даних.
Суть полягає в тому, що швидкість, з якою ви можете надсилати запити та оновлювати стовпці, є швидшою, якщо для стовпців є індекси.
Прямі запити до бази даних залежать від структури бази даних.
Тому це не те, що ми повинні робити весь час. Але є моменти, коли це доречно (наприклад, коли ви оновлюєте набір мета-значень), а коли ні.
2 Параметризуйте свої запити
Під час використання прямих запитів до бази даних надзвичайно важливо параметризувати свої запити з метою безпеки. Ви можете прочитати все про це в Кодексі, і це те, що не варто пропускати.
Прямо з документації :
Щоб отримати більш повний огляд екранування SQL у WordPress, див. Перевірка даних бази даних. Він є обов’язковим до прочитання для всіх учасників коду WordPress і авторів плагінів.
Тобто, якщо ви приймаєте дані користувача, вам потрібно переконатися, що вони продезінфіковані, чисті та готові до введення в базу даних. Але, незважаючи на те, що це варте, я майже ніколи не дозволяю користувачам впливати на прямі запити до бази даних.
Натомість вони зазвичай базуються на даних, які я маю в коді та хочу оновити або змінити, коли вони безпечно перебувають у сфері контролю кодової бази.
3 Перевірте їх і перевірте ще раз
І, нарешті, перед впровадженням будь-яких прямих запитів я рекомендую:
- Запуск інтерфейсу SQL і виконання запитів,
- Зверніть увагу на будь-які помилки, які вони можуть викликати,
- Виправте їх і спробуйте ще раз.
Потім, як тільки у вас буде робочий тест запиту для граничних випадків, щоб переконатися, що щось не буде зіпсовано. Це особливо вірно, якщо ви збираєтеся використовувати пропозиції LIKE у своїх запитах (що, ймовірно, є окремою статтею).
Мені не вистачає API?
З огляду на розмір API WordPress, завжди є шанс, що я щось упустив, чимось нехтую чи просто не розумно ставлюся до існуючих API.
І якщо це так, то я із задоволенням виправлю інформацію, наведену вище (тому не соромтеся залишати коментарі).
Але тим часом, якщо ви працюєте з відносно заданою частиною даних, ви впевнені, що в стовпцях є індекси, ви знаєте, як параметризувати запити, і ви протестували дані, тоді, можливо, робите з прямим запити до бази даних – це шлях.
І якщо це так, є кілька способів ігнорувати стандарти кодування без того, щоб PHP CodeSniffer кричав на вас. 🙂
