Заглушка для работы с запросами к базе данных в WordPress
Как бы я ни был поклонником определенных API-интерфейсов WordPress для запросов к базе данных, таких как:
- WP_Query ,
- WP_User_Query ,
- WP_Meta_Query ,
- и так далее
Я также являюсь поклонником запросов непосредственно к базе данных, когда это необходимо.
Как вы заметили, я делаю это последовательно, и, поскольку в последнее время я делаю это чаще, вот базовый формат для работы с запросами к базе данных в WordPress.
Однако, если я делаю это, я обычно делаю вещи, которые я имею в виду:
- всегда убедитесь, что запрос параметризован (особенно в случае пользовательского ввода),
- вернуть информацию в виде ассоциативного массива.
Первый случай для безопасности; второй более или менее для удобства, чтобы упростить перебор данных с помощью функций массива PHP.
Запросы к базе данных в WordPress
Во-первых, важно понимать две концепции:
- параметризация,
- массив_столбец
Это основа того, как я пишу свои запросы и работаю с их результатами.
1 Параметризация
Вы можете прочитать больше об этом в Кодексе, но параметризация — это способ, которым мы можем писать запросы, работающие для предотвращения 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, но это должно быть достаточно просто, верно? )
