Вопрос или проблема
Я работаю над индивидуальным клиентским порталом, используя последнюю версию 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>';
}
Проблема в том, что дата, которая отображается, дублируется, и я не могу понять, почему. Вот что я в данный момент получаю:
Но мне нужен такой чистый вывод:
Я пытался решить это несколько дней безуспешно.
Что я пробовал:
- Отладка запросов, чтобы убедиться, что я выбираю правильные поля.
- Экспериментировал с программной фильтрацией дубликатов.
Проблема:
Результаты ДАТЫ кажутся дублированными в моей таблице, и я подозреваю, что это связано с тем, как я выполняю запрос или перебираю данные.
Как я могу изменить свой код или запросы, чтобы правильно извлекать данные без дубликатов?
Любая помощь, предложения или улучшения будут высоко оценены. Заранее спасибо!
Надеюсь, это разъясняет мою проблему и побуждает к участию. Дайте знать, если вам нужна дополнительная информация или фрагменты кода.
Ответ или решение
Для решения вашей проблемы с выводом данных из WPForms в индивидуальном клиентском портале, необходимо обратить внимание на несколько ключевых аспектов кодирования и запросов к базе данных. Ваша текущая реализация исходит из понятия, что при выборке данных по идентификаторам записей дублирование значений возникает из-за неоднократной выборки и вывода одинаковых значений по различным полям.
Анализ Проблемы
-
Дублирующиеся Записи: Дублирование значений дат, скорее всего, связано с тем, что вы выполняете несколько вложенных циклов, каждый из которых обрабатывает результаты запроса. Это приводит к тому, что одно и то же значение выводится множество раз.
-
Структура Запросов: Выборка данных из таблицы
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>';
}
Объяснение Изменений
-
Единый SQL Запрос: Мы формируем один SQL запрос, который извлекает нужные поля в одном обращении к базе данных, используя конструкцию
MAX(CASE ...)
, чтобы сгруппировать результаты. -
Группировка: Мы используем
GROUP BY entry_id
, чтобы извлечь уникальные значения для каждогоentry_id
, избегая дублирования. -
Безопасность: Запрос был подготовлен с использованием параметризованных вызовов, чтобы избежать SQL-инъекций.
Заключение
С помощью предложенного решения, вы сможете эффективно извлекать и выводить уникальные значения без дублирования. Эта подходящая и оптимизированная реализация поможет вам достичь нужного формата отображения данных в клиентском портале. Если у вас возникнут дополнительные вопросы или потребуется дальнейшая доработка решения, не стесняйтесь обращаться за помощью.