Отобразить результаты SQL-запроса на сайте WP

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

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

Я создаю функцию в своем файле functions.php – все остальные функции работают нормально.

$query = $mydb->get_results("select * from table");

//Это работает отлично в mysql, и я могу делать такие вещи, как count(*) и получать ответ.

Но по какой-то причине я не могу сделать так, чтобы таблица возвращала результаты, которые отображаются на странице wordpress

return "$query";
return "$query[0]";
return "$query["wk"]";

Единственный вывод, который я вижу на любой странице – это слово Array, где я ожидал увидеть результат.

Так что что-то вроде этого работает идеально –

function VtVML_visitor(){
    $home = get_field('home');
    $visitor = get_field('visitor');
    $mydb = new wpdb('OMMITTED');

    $hWins = $mydb->get_var("SELECT count(*) FROM `table` where v = '$home' and h="$visitor" and h_ml_win = 1");
    $hLoss = $mydb->get_var("SELECT count(*) FROM `table` where v = '$home' and h="$visitor" and h_ml_loss = 1");
    $hTie = $mydb->get_var("SELECT count(*) FROM `table` where v = '$home' and h="$visitor" and h_ml_tie = 1");
    $vWins = $mydb->get_var("SELECT count(*) FROM `table` where h="$home" and v = '$visitor' and v_ml_win = 1");
    $vLoss = $mydb->get_var("SELECT count(*) FROM `table` where h="$home" and v = '$visitor' and v_ml_loss = 1");
    $vTie = $mydb->get_var("SELECT count(*) FROM `table` where h="$home" and v = '$visitor' and v_ml_tie = 1");

    $tWins = $vWins+$hWins;
    $tLoss = $vLoss+$hLoss;
    $tTie = $vTie+$hTie;

    return "$visitor vs $home overall:<br>$tWins - $tLoss - $tTie";

    $mydb -> close();
}

add_shortcode('VtVML','VtVML_visitor');

Но если я перепрофилирую это в новый шорткод и изменю запросы, чтобы извлекать конкретные поля:

$schedule = $mydb->get_var("SELECT wk,v,h FROM `table` where h="$home"");

return "$schedule";

Я вижу ошибку, описанную выше. Я предполагаю, что мне нужно использовать команду foreach или while – но все попытки использовать их не дали результатов.

Я вижу ошибку, описанную выше. Я предполагаю, что мне нужно использовать команду foreach или while – но все попытки использовать их не дали результатов.

Да, шорткоды возвращают строки, а не массивы/списки. Вам нужно конвертировать ваш массив/список в одну строку. Однако get_var предполагает, что будет только один результат. Если вы хотите получить несколько результатов, вам нужно использовать другой метод WPDB, который позволяет получать несколько результатов, такой как get_results:

<?php

global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}options WHERE option_id = 1", OBJECT );

Код также должен использовать $wpdb->prepare, чтобы вставить переменные в SQL-запрос. Например:

$wpdb->query(
   $wpdb->prepare(
      "
      INSERT INTO $wpdb->postmeta
      ( post_id, meta_key, meta_value )
      VALUES ( %d, %s, %s )
      ",
      10,
      $metakey,
      $metavalue
   )
);

Обратите внимание, что переменные $metakey и $metavalue не находятся внутри строки, так как это было бы небезопасно. Вместо этого они содержат плейсхолдеры %s, которые заменяются на очищенные версии, чтобы предотвратить их разрушение запроса или вставку вредоносных значений.

Смотрите официальную документацию для примеров использования get_results

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

Подробное руководство по отображению результатов SQL-запроса на сайте WordPress

Если вы стремитесь вывести результаты SQL-запроса на своем сайте WordPress, но сталкиваетесь с проблемами, такими как вывод слова "Array" вместо ожидаемых данных, в этой статье мы рассмотрим шаги, которые помогут вам решить эту проблему. Мы рассмотрим, как правильно использовать методы класса wpdb, а также как преобразовать результаты запроса для корректного отображения на странице.

1. Использование класса wpdb для выполнения SQL-запросов

WordPress предоставляет удобный класс wpdb для работы с базой данных. Если вы хотите получить несколько строк из базы данных, вы должны использовать метод get_results(), который возвращает массив объектов, либо get_row() для одной строки. Пример кода может выглядеть следующим образом:

global $wpdb;
$results = $wpdb->get_results("SELECT wk, v, h FROM {$wpdb->prefix}table WHERE h = %s", ARRAY_A);

Обратите внимание на использование {$wpdb->prefix}, что гарантирует, что вы используете правильный префикс таблицы, заданный при установке WordPress. Также важно использовать защищенные методы для предотвращения SQL-инъекций, поэтому вам следует использовать метод prepare:

$home = 'значение_дома'; // замените на ваше значение
$query = $wpdb->prepare("SELECT wk, v, h FROM {$wpdb->prefix}table WHERE h = %s", $home);
$results = $wpdb->get_results($query, ARRAY_A);

2. Преобразование результатов запроса для отображения

Когда вы получаете массив результатов, можно использовать цикл foreach для формирования строки, которая будет возвращена в вашем шорткоде:

function my_custom_shortcode() {
    global $wpdb;
    $home = 'значение_дома'; // замените на ваше значение
    $query = $wpdb->prepare("SELECT wk, v, h FROM {$wpdb->prefix}table WHERE h = %s", $home);
    $results = $wpdb->get_results($query, ARRAY_A);

    if (empty($results)) {
        return 'Никаких данных не найдено.';
    }

    $output = '';
    foreach ($results as $row) {
        $output .= 'Неделя: ' . esc_html($row['wk']) . ', Команда V: ' . esc_html($row['v']) . ', Команда H: ' . esc_html($row['h']) . '<br>';
    }

    return $output;
}
add_shortcode('my_shortcode', 'my_custom_shortcode');

3. Важнейшие моменты при работе с базой данных в WordPress

  • Безопасность: Всегда используйте prepare для формирования SQL-запросов. Это предотвращает SQL-инъекции.
  • Форматирование: Используйте функции WordPress, такие как esc_html(), для безопасного отображения данных на веб-страницах.
  • Префикс таблицы: Используйте {$wpdb->prefix} для обеспечения совместимости с различными конфигурациями WordPress.

Заключение

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

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

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