Как использовать $wpdb->prepare в SQL-запросах, содержащих IN()

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

В большом гайде по написанию SQL-запросов при помощи $wpdb мы уже говорили о необходимости использовать $wpdb->prepare() во имя безопасности. Всегда, когда это нужно, ребят, а то понимаете, бывают ситуации со сложными запросами, например содержащими IN(), и в моменте может показаться, что в $wpdb->prepare() нет большой необходимости, к примеру, когда вы не получаете данные непосредственно от пользователя через $_GET или $_POST. Так вот, это предположение конечно же ошибочно, и нам нужно обязательно очищать SQL-запрос. И в этом уроке я на примере научу вас, как.

А вот так выглядит наш пример:

global $wpdb;
 
$post_types = get_post_types( array( 'public' => true ) );
 
// получение общего количества опубликованных постов всех публичных типов записей
$count = $wpdb->get_var(
	"
	SELECT COUNT(*)
	FROM {$wpdb->posts}
	WHERE post_status = 'publish'
	AND post_type IN ( '" . join( "', '", $post_types ) . "' )
	"
);					"

Так как get_post_types() – это вроде бы как стандартная функция WodPress и может возникнуть соблазн ей довериться – не нужно. Очищаем данные как обычно.

Вот так это делается, ребят:

// получение общего количества опубликованных постов всех публичных типов записей
$sql = call_user_func_array(
	array( $wpdb, 'prepare' ),
	array_merge(
		array(
			"
			SELECT COUNT(*)
			FROM {$wpdb->posts}
			WHERE post_status = 'publish'
			AND post_type IN ( " . join( ', ', array_fill( 0, count( $post_types ), '%s' ) ) . " )
			"
		),
		$post_types
	)
);
$count = $wpdb->get_var( $sql );

Объясняю:

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии