Вопрос или проблема
Я надеюсь, что это не избыточно – но всегда кажется, что чего-то не хватает, и я не могу заставить все работать.
Я создаю функцию в своем файле 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. Обязательно тестируйте ваш код и проверяйте на наличие ошибок. Если вам необходимо получать данные из более сложных запросов, рассмотрите возможность создания дополнительных функций или классов для упрощения структуры базы данных и повышения производительности.