Прямые запросы к базе данных в 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. 🙂
