WPDB::ESC_LIKE() — Как использовать функцию для безопасного поиска в WordPress
Введение
Функция WPDB::ESC_LIKE() предназначена для предварительного экранирования специальных символов % и _, которые используются в SQL-запросах для поиска в базе данных по шаблону (LIKE). Это первая часть экранирования, которую нужно выполнять перед тем, как использовать метод wpdb::prepare() или функцию esc_sql(). Неверный порядок выполнения может привести к проблемам с безопасностью.
Как использовать WPDB::ESC_LIKE()
Общее применение
Чтобы использовать функцию, вам нужно сначала объявить глобальную переменную $wpdb, которая предоставляет доступ к базе данных WordPress:
global $wpdb;
$like = $wpdb->esc_like( $text );
- $text (string) — это текст, который вы хотите экранировать. Убедитесь, что введенный пользователем текст не содержит лишних или удаленных слешей.
Пример использования
Вот пример того, как правильно подготовить запрос с использованием LIKE:
$find = 'only 43% of planets';
$sql = $wpdb->prepare(
"SELECT * FROM $wpdb->posts WHERE post_content LIKE %s",
'%' . $wpdb->esc_like( $find ) . '%'
);
echo $sql;
// Вывод: SELECT * FROM wp_posts WHERE post_content LIKE '{d710cab}only 43{d710cab} of planets{d710cab}'
Этот запрос будет искать записи, где содержание поста содержит фразу "only 43% of planets", экранируя специальный символ %.
Примеры экранирования
Пример с использованием esc_sql()
$esc_like = $wpdb->esc_like( 'only 43% of planets' );
echo $esc_like; // only 43% of planets
echo esc_sql( $esc_like ); // only 43{f5fa52} of planets
Подготовка строки для поиска в комментариях
global $wpdb;
$link = $wpdb->esc_like( $link ); // подготавливаем строку для LIKE
$link = esc_sql( $link ); // очищаем переменную
$link = '%' . $link . '%'; // создаем полную переменную для поиска
$spammy = $wpdb->query("SELECT comment_approved FROM $wpdb->comments
WHERE (comment_content LIKE '$link' OR comment_author_url LIKE '$link')
AND comment_approved = 'spam'
LIMIT 1;"
);
Краткий запрос с prepare()
global $wpdb;
$link = '%' . $wpdb->esc_like( $link ) . '%';
$comment = $wpdb->get_row( $wpdb->prepare(
"SELECT * FROM $wpdb->comments WHERE comment_author_url LIKE %s LIMIT 1", $link
) );
Возвращаемое значение
Функция возвращает строку, представляющую текст в виде фразы LIKE. Однако, на данный момент это значение не безопасно для SQL-запроса. Чтобы обеспечить безопасность, необходимо использовать wpdb::prepare() или wpdb::_real_escape() после.
Заключение
Функция WPDB::ESC_LIKE() очень полезна для безопасного поиска в базе данных WordPress. Помните о необходимости корректного порядка вызовов — сначала экранирование, затем подготовка запроса. Это важно для защиты вашего сайта от SQL-инъекций.
Блоки кода
Вот код функции esc_like из класса wpdb для справки:
public function esclike( $text ) {
return addcslashes( $text, '%' );
}
Соблюдение правильной структуры и порядка вызовов поможе�� вам сохранять безопасность и функциональность вашего WordPress-сайта.