wpdb::get_results()publicWP 0.71

Получает все данные указанного запроса (все строки и колонки). Результат возвращается в виде массива. Каждый элемент массива это объект с данными отдельной строки таблицы.

Метод класса: wpdb{}

Хуков нет.

Возвращает

Массив|Объект|null. Результат запроса к базе данных. Вернет:

  • Массив объектов — когда $output = OBJECT или OBJECT_K.
  • Массив массивов — когда $output = ARRAY_A или ARRAY_N.
  • array() — когда строк по запросу не найдено или ошибка запроса.
  • NULL — когда запрос пустая строка или передан неправильный тип вывода ($output_type).

Использование

global $wpdb;
$wpdb->get_results( $query, $output );
$query(строка)

Запрос который нужно выполнить.

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

По умолчанию: null

$output(константа/строка)

Флаг указывающий в каком виде нужно вернуть данные. Возможны 4 варианта:

  • OBJECT — вернет массив объектов с числовыми ключами - элементы массива будут объекты строк таблицы — [ 0 => object ].
  • OBJECT_K — похож на предыдущий, только в индексах главного массива будут значения первой колонки результата запроса — [ 'field' => object ].
    Обратите внимание, если в индекс будут попадать одинаковые значения, то данные будут затираться.
  • ARRAY_N — вернет индексный массив, каждый элемент которого будет так же индексным массивом — [ 0 => [...] ].
  • ARRAY_A — вернет индексный массив, каждый элемент которого будет ассоциативным массивом, в котором ключом будет название колонки — [ 'field' => [...] ].

По умолчанию: OBJECT

Примеры

1

#1 Выведем на экран ссылки на черновики автора с ID = 5

<?php
$fivesdrafts = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5");
if( $fivesdrafts ) :
	foreach( $fivesdrafts as $post ){
		setup_postdata($post);
		?>
			<h2><a href="<?php the_permalink(); ?>" rel="bookmark"
				title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2>
		<?php
	}
else :
?>
	<h2> Не найдено</h2>
<?php endif; ?>
0

#2 Получим ID и заголовки черновиков, ID автора которых равен 5 и выведем на экран заголовки постов.

$fivesdrafts = $wpdb->get_results( "SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5" );

foreach ( $fivesdrafts as $fivesdraft ) {
	echo $fivesdraft->post_title;
}
0

#3 Пример сложного запроса с GROUP BY (отзывов в WooCommerce)

/**
* Возвращает результаты рейтинга (отзывов в WooCommerce) сгрупированный по оценкам
*
* @param int $post_id идентификатор поста
*
* @return array массив объектов, где каждый объект - сгрупированные данные по одной из оценок
*/
function get_cnt_rating_reviews_one_product( $post_id ){
	global $wpdb;

	return $wpdb->get_results( $wpdb->prepare(
		"
		SELECT COUNT(meta.meta_id) as num, meta.meta_value
		FROM $wpdb->comments as comments
		INNER JOIN $wpdb->commentmeta as meta ON comments.comment_ID = meta.comment_id
		WHERE comments.comment_post_ID = %d AND meta_key = 'rating'
		GROUP BY meta.meta_value;
		",
		$post_id
	) );

}

// использование
get_cnt_rating_reviews_one_product( 4350 );
0

#4 Обработка ошибок

Вот как можно перехватывать ошибки из get_results():

global $wpdb;
$result = $wpdb->get_results( "SELECT * FROM invalid query" );

if ( $wpdb->last_error ) {
  echo 'wpdb error: ' . $wpdb->last_error;
}

Список изменений

С версии 0.71 Введена.

Код wpdb::get_results() WP 6.5.2

public function get_results( $query = null, $output = OBJECT ) {
	$this->func_call = "\$db->get_results(\"$query\", $output)";

	if ( $query ) {
		if ( $this->check_current_query && $this->check_safe_collation( $query ) ) {
			$this->check_current_query = false;
		}

		$this->query( $query );
	} else {
		return null;
	}

	$new_array = array();
	if ( OBJECT === $output ) {
		// Return an integer-keyed array of row objects.
		return $this->last_result;
	} elseif ( OBJECT_K === $output ) {
		/*
		 * Return an array of row objects with keys from column 1.
		 * (Duplicates are discarded.)
		 */
		if ( $this->last_result ) {
			foreach ( $this->last_result as $row ) {
				$var_by_ref = get_object_vars( $row );
				$key        = array_shift( $var_by_ref );
				if ( ! isset( $new_array[ $key ] ) ) {
					$new_array[ $key ] = $row;
				}
			}
		}
		return $new_array;
	} elseif ( ARRAY_A === $output || ARRAY_N === $output ) {
		// Return an integer-keyed array of...
		if ( $this->last_result ) {
			if ( ARRAY_N === $output ) {
				foreach ( (array) $this->last_result as $row ) {
					// ...integer-keyed row arrays.
					$new_array[] = array_values( get_object_vars( $row ) );
				}
			} else {
				foreach ( (array) $this->last_result as $row ) {
					// ...column name-keyed row arrays.
					$new_array[] = get_object_vars( $row );
				}
			}
		}
		return $new_array;
	} elseif ( strtoupper( $output ) === OBJECT ) {
		// Back compat for OBJECT being previously case-insensitive.
		return $this->last_result;
	}
	return null;
}