Условное форматирование данных, полученных из MYSQL

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

Я не эксперт в PHP и пытаюсь применить условное форматирование к данным, полученным из wpdb. Честно говоря, я пытаюсь создать шорткод для этого. Мой девиз — получить значения для $previous_marks и $current_marks из базы данных и изменить цвет $current_marks в зависимости от условия if, else. Согласно условию:

  • Если $current_marks больше $previous_marks, то значение $current_marks должно отображаться зеленым цветом вместе с изображением pass.png рядом со значением.
  • В противном случае значение $current_marks должно отображаться красным цветом вместе с изображением fail.png рядом со значением.

Мне также нужна помощь в отображении изображений рядом со значением $current_marks, у меня нет кода для этого:

Вот как выглядит мой код:

    add_shortcode( 'marks_col', function () {
    $subject = $_GET['subject'];
    
    global $wpdb;
    $previous_marks = $wpdb->get_results( "SELECT prev FROM grade WHERE sub='" .$subject. "'");
    $current_marks = $wpdb->get_results( "SELECT current FROM grade WHERE sub='" .$subject. "'");
    if ($previous_marks < $current_marks) {
       echo "<p style="color:green">" .$current_marks. "</p>"; ##отобразить pass.png рядом со значением $current_marks
    } else {
       echo "<p style="color:red">" .$current_marks. "</p>"; ##отобразить fail.png рядом со значением $current_marks
    }
    } );

$subject извлекается из URL сайта: www.domain.com/results?subject=biology. В настоящее время, при использовании шорткода [marks_col] в установке WP, он просто выводит ‘Array’ красным цветом и ничего больше. Любая помощь будет очень признательна.

Сначала несколько заметок:

  • Шорткоды принимают аргументы, так что вы можете написать [marks subject=”Biology”] (@см. https://codex.wordpress.org/Shortcode_API)
  • Вы никогда не должны передавать необработанные данные напрямую в SQL-запрос, WordPress использует PDO, это означает, что вы можете подготавливать запросы. (@см. https://developer.wordpress.org/reference/classes/wpdb/prepare/)
  • Использование get_results вернет массив, объект или null (@см. https://developer.wordpress.org/reference/classes/wpdb/get_results/). Есть много подходов. Вы можете использовать $wpdb->get_var(), чтобы получить одно значение. Или $wpdb->get_results(), чтобы получить оба значения в одном запросе. Я думаю, что мы упускаем некоторые данные, если вам нужна конкретная строка только для одного пользователя, вы также можете использовать $wpdb->get_row(). Представьте, что база данных — это лист Excel. Если вам нужно несколько строк и столбцов, вы хотите использовать $wpdb->get_results(). Если вам нужна только одна конкретная строка, вы можете использовать $wpdb->get_row(). Если вам нужен только один столбец данных, используйте $wpdb->get_column(). Если вам нужна только одна конкретная ячейка, используйте $wpdb->get_var().
  • Я бы выбрал подход с иконками вместо подхода с изображениями, если вы просто хотите использовать “галочку” или какой-то “восклицательный” знак в зависимости от провала или прохождения конкретного результата. Бесплатная и хорошая библиотека иконок (@см. https://fontawesome.com/)

Код, основанный на вашем вопросе, хотя я думаю, что вам не хватает оператора WHERE в вашем запросе, чтобы извлечь ‘marks’ конкретного человека на основе собственных проектов.

add_shortcode( "marks", function( $atts ) {

    //= значения по умолчанию
    $args = shortcode_atts( array(
        'subject' => 'biology',
    ), $atts );

    //= запрос к базе данных
    global $wpdb;
    $query  = $wpdb->prepare( "SELECT prev, current FROM grade WHERE sub = %s", $args['subject'] );
    $result = $wpdb->get_row( $query );

    //= выход, если нет результатов
    if( is_null( $result ) ) return;

    //= условие
    if( $result[ 'prev' ] < $result[ 'current' ] ) {
        echo "<p color=\"color: green;\">{$result['current']}<i class=\"far fa-check\"></i></p>";
        
    } else {
        echo "<p color=\"color: red;\">{$result['current']}<i class=\"far fa-times\"></i></p>";
        
    }
    
} );

Если необходимо, вы можете легко отладить объекты и массивы на экране с помощью следующего кода:

echo var_export( $array, true );

Надеюсь, это поможет!

Я не совсем понимаю, но вы хотите получить доступ к данным на основе “предмета”, который я предполагаю является “User_ID” или чем-то в этом роде. А также передать параметр “столбец”. Так вы могли бы запросить одно из следующих вещей с помощью одного шорткода.

  • Получить имя на основе предмета
  • Получить посещаемость на основе предмета
  • Получить prev на основе предмета
  • Получить current на основе предмета

Если это так, нам действительно нужно изменить код.

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

Чтобы применить условное форматирование к данным, полученным из базы данных MySQL с помощью wpdb в WordPress, необходимо создать шорткод, который будет осуществлять выборку оценок и визуально применять стили в зависимости от условий. Ниже представлено развернутое решение вашей задачи.

Шаг 1: Создание шорткода

Вы начнете с добавления шорткода в ваш файл functions.php темы или в специальный плагин. Рассмотрим следующую реализацию шорткода, который принимает параметр subject.

add_shortcode("marks", function($atts) {
    // Задаем значения по умолчанию
    $args = shortcode_atts(array(
        'subject' => 'biology',
    ), $atts);

    global $wpdb;
    // Подготавливаем SQL-запрос для безопасной выборки данных
    $query = $wpdb->prepare("SELECT prev, current FROM grade WHERE sub = %s", $args['subject']);
    $result = $wpdb->get_row($query);

    // Проверяем, есть ли результаты
    if (is_null($result)) return '<p>Нет данных для данного предмета.</p>';

    // Применяем условное форматирование
    if ($result->prev < $result->current) {
        $color = "green";
        $icon = '<img src="path/to/pass.png" alt="Pass" />';
    } else {
        $color = "red";
        $icon = '<img src="path/to/fail.png" alt="Fail" />';
    }

    // Возвращаем стилизованный вывод
    return "<p style='color: {$color};'>{$result->current} {$icon}</p>";
});

Шаг 2: Пояснение кода

  1. Получение атрибутов шорткода: Используется функция shortcode_atts(), чтобы установить значение по умолчанию для атрибута subject, если он не передан.

  2. Запрос к базе данных: С помощью метода prepare() из класса wpdb мы формируем и выполняем SQL-запрос. Метод get_row() возвращает одну строку с оценками по указанному предмету.

  3. Проверка результата: Если данные не найдены, возвращаем сообщение пользователю.

  4. Условное форматирование: Условия проверяют, превышает ли current значение prev. В зависимости от этого устанавливается цвет текста и соответствующая иконка.

  5. Возврат результата: С помощью return мы выводим стилизованный элемент p с цветом и иконкой рядом с текущими оценками.

Шаг 3: Использование шорткода

Теперь вы можете использовать этот шорткод на страницах или в записях WordPress, добавляя следующий текст:

[marks subject="biology"]

Шаг 4: Рекомендации по улучшению

  • Безопасность: Использование методов подготовки запросов минимизирует риск SQL-инъекций.
  • Иконки: Вместо использования изображений можно рассмотреть возможность внедрения иконок из библиотек, таких как Font Awesome, что значительно упростит задачу.
  • Кэширование: При частом обращении к базе данных рассмотреть использование кэширования для повышения эффективности.

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

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

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