Нужна помощь в извлечении и отображении недублирующих данных записей WPForms в личном кабинете клиента.

Вопрос или проблема

Я работаю над индивидуальным клиентским порталом, используя последнюю версию WPForms. Моя цель – отобразить конкретные данные из записей WPForms, такие как Номер счета, Способ депозита, Сумма и Дата депозита, в табличном формате.

Вот пример таблицы базы данных (wp_wpforms_entry_fields), с которой я работаю:

Пример таблицы базы данных

Я извлекаю данные, используя следующий PHP код:

function wpc_elementor_shortcode_deposit($atts){
    $user_id = get_current_user_id();
    global $wpdb;

    $getentry_id = $wpdb->get_results("SELECT entry_id FROM wp_wpforms_entries WHERE user_id = $user_id AND form_ID = 16758");

    echo '<table style="font-family:cairo">';
    foreach ($getentry_id as $item) {
        foreach ($item as $key => $value) {
            $eID = $value; // ID записи для пользователя

            $post_id = $wpdb->get_results("SELECT value, date FROM wp_wpforms_entry_fields WHERE entry_id = $eID AND (field_id = 7 OR field_id = 13) AND form_ID = 16758");
            
            foreach ($post_id as $item) {
                foreach ($item as $key => $value) {
                    echo $value . '<br>';
                }
            }
        }
    }
    echo '</table>';
}

Проблема в том, что дата, которая отображается, дублируется, и я не могу понять, почему. Вот что я в данный момент получаю:

Дублированные данные

Но мне нужен такой чистый вывод:

Желаемый вывод

Я пытался решить это несколько дней безуспешно.

Что я пробовал:

  1. Отладка запросов, чтобы убедиться, что я выбираю правильные поля.
  2. Экспериментировал с программной фильтрацией дубликатов.

Проблема:

Результаты ДАТЫ кажутся дублированными в моей таблице, и я подозреваю, что это связано с тем, как я выполняю запрос или перебираю данные.

Как я могу изменить свой код или запросы, чтобы правильно извлекать данные без дубликатов?

Любая помощь, предложения или улучшения будут высоко оценены. Заранее спасибо!


Надеюсь, это разъясняет мою проблему и побуждает к участию. Дайте знать, если вам нужна дополнительная информация или фрагменты кода.

Ответ или решение

Для решения вашей проблемы с выводом данных из WPForms в индивидуальном клиентском портале, необходимо обратить внимание на несколько ключевых аспектов кодирования и запросов к базе данных. Ваша текущая реализация исходит из понятия, что при выборке данных по идентификаторам записей дублирование значений возникает из-за неоднократной выборки и вывода одинаковых значений по различным полям.

Анализ Проблемы

  1. Дублирующиеся Записи: Дублирование значений дат, скорее всего, связано с тем, что вы выполняете несколько вложенных циклов, каждый из которых обрабатывает результаты запроса. Это приводит к тому, что одно и то же значение выводится множество раз.

  2. Структура Запросов: Выборка данных из таблицы wp_wpforms_entry_fields осуществляется по полям field_id, что может привести к повторной выборке одинаковых данных, если для одной записи имеются данные по нескольким полям.

Оптимизация SQL Запросов

Чтобы избежать дублирования, вы можете изменить SQL запрос следующим образом, чтобы объединить необходимые данные в одну строку результата. Вместо того чтобы выполнять вложенные запросы для каждого entry_id, вы можете использовать один запрос, который выбирает данные для всех Entry ID за одно обращение.

Модифицированный Код

Используйте следующий обновленный код для достижения нужного результата:

function wpc_elementor_shortcode_deposit($atts) {
    $user_id = get_current_user_id();
    global $wpdb;

    // Получаем все записи пользователя с уникальными ID
    $get_entry_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT entry_id FROM wp_wpforms_entries WHERE user_id = %d AND form_id = %d",
        $user_id,
        16758
    ));

    if (empty($get_entry_ids)) {
        echo '<p>Нет записей для отображения.</p>';
        return;
    }

    // Формируем строку для IN запроса
    $placeholders = implode(',', array_fill(0, count($get_entry_ids), '%d'));
    $query = "
        SELECT entry_id, MAX(CASE WHEN field_id = 7 THEN value END) AS account_number,
               MAX(CASE WHEN field_id = 13 THEN value END) AS deposit_method,
               MAX(CASE WHEN field_id = 14 THEN value END) AS amount,
               MAX(CASE WHEN field_id = 15 THEN date END) AS date_of_deposit
        FROM wp_wpforms_entry_fields
        WHERE entry_id IN ($placeholders)
        GROUP BY entry_id
    ";

    // Выполняем запрос
    $results = $wpdb->get_results($wpdb->prepare($query, $get_entry_ids));

    // Выводим данные в формате таблицы
    echo '<table style="font-family:cairo">';
    echo '<tr><th>Account Number</th><th>Deposit Method</th><th>Amount</th><th>Date of Deposit</th></tr>';

    foreach ($results as $row) {
        echo '<tr>';
        echo '<td>' . esc_html($row->account_number) . '</td>';
        echo '<td>' . esc_html($row->deposit_method) . '</td>';
        echo '<td>' . esc_html($row->amount) . '</td>';
        echo '<td>' . esc_html($row->date_of_deposit) . '</td>';
        echo '</tr>';
    }

    echo '</table>';
}

Объяснение Изменений

  1. Единый SQL Запрос: Мы формируем один SQL запрос, который извлекает нужные поля в одном обращении к базе данных, используя конструкцию MAX(CASE ...), чтобы сгруппировать результаты.

  2. Группировка: Мы используем GROUP BY entry_id, чтобы извлечь уникальные значения для каждого entry_id, избегая дублирования.

  3. Безопасность: Запрос был подготовлен с использованием параметризованных вызовов, чтобы избежать SQL-инъекций.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...