✅ Новости WEB и WordPress, темы, плагины. Здесь мы делимся советами и лучшими решениями для веб-сайтов.

Заглушка для работы с запросами к базе данных в WordPress

32

Как бы я ни был поклонником определенных API-интерфейсов WordPress для запросов к базе данных, таких как:

Я также являюсь поклонником запросов непосредственно к базе данных, когда это необходимо.

Как вы заметили, я делаю это последовательно, и, поскольку в последнее время я делаю это чаще, вот базовый формат для работы с запросами к базе данных в WordPress.

Однако, если я делаю это, я обычно делаю вещи, которые я имею в виду:

  1. всегда убедитесь, что запрос параметризован (особенно в случае пользовательского ввода),
  2. вернуть информацию в виде ассоциативного массива.

Первый случай для безопасности; второй более или менее для удобства, чтобы упростить перебор данных с помощью функций массива PHP.

Запросы к базе данных в WordPress

Во-первых, важно понимать две концепции:

  1. параметризация,
  2. массив_столбец

Это основа того, как я пишу свои запросы и работаю с их результатами.

1 Параметризация

Вы можете прочитать больше об этом в Кодексе, но параметризация — это способ, которым мы можем писать запросы, работающие для предотвращения SQL-инъекций.

Со страницы Кодекса :

Все данные в SQL-запросах должны быть экранированы SQL до выполнения SQL-запроса, чтобы предотвратить атаки с внедрением SQL. Метод prepareвыполняет эту функцию для WordPress, который поддерживает синтаксис как sprintf(), так и vsprintf() .

То есть метод поддерживает токены, такие как %s, %d и %f, при передаче информации в запрос. Я покажу пример этого позже в посте.

2 Работа со столбцами массива

Результаты таких запросов могут быть возвращены различными способами. А именно, как объект, массив с числовым индексом или ассоциативный массив. Чаще всего мне нравится использовать массивы (позже я покажу, как это сделать в WordPress).

Заглушка для работы с запросами к базе данных в 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, но это должно быть достаточно просто, верно? )

Источник записи: tommcfarlin.com

Этот веб-сайт использует файлы cookie для улучшения вашего опыта. Мы предполагаем, что вы согласны с этим, но вы можете отказаться, если хотите. Принимаю Подробнее