Альтернатива функции mysql_real_escape_string
У меня есть плагин WordPress, в котором мне нужно проверить, существует ли определенный заголовок в базе данных. На протяжении 2 лет этот код работал нормально:
$myposttitle= $wpdb->get_results(
"select post_title from $wpdb->posts
where post_title like '%". mysql_real_escape_string($myTitle) . "%'"
);
Однако с PHP 5.5 и WordPress 3.9.1 это вызывает ошибку, потому что функция mysql_real_escape_string
является устаревшей.
Есть ли идеи, какую другую функцию можно использовать для правильного экранирования содержимого $myTitle
теперь, когда я больше не могу использовать mysql_real_escape_string
?
Спасибо
Хотя ответ с использованием prepare()
частично верен, если вам действительно нужно вручную экранировать строку для SQL-запроса, используйте esc_sql()
.
Для конкретного случая экранирования строки, которая будет использоваться в операторе LIKE, правильнее написать следующим образом:
$query = $wpdb->prepare(
"SELECT post_title from $wpdb->posts
WHERE post_title LIKE %s",
"%" . $wpdb->esc_like( $myTitle ) . "%"
);
Метод $wpdb->esc_like() необходим для правильного экранирования знаков процента, подчеркиваний или обратных слешей, которые могут присутствовать в искомой фразе. Обратите внимание, что $wpdb->esc_like() не возвращает подготовленные данные, он только экранирует специальные символы, используемые в LIKE. Таким образом, prepare() всё ещё необходим.

При работе с базой данных в WordPress никогда не следует использовать низкоуровневые функции mysql_*
или mysqli_*
.
Всегда используйте методы $wpdb
, в вашем случае следует применить prepare()
:
$query = $wpdb->prepare(
"SELECT post_title from $wpdb->posts
WHERE post_title LIKE %s",
"%" . $myTitle . "%"
);
Более того, если вы получаете только один столбец, вам будет проще использовать get_col
вместо get_results
:
$myposttitle = get_col( $query );

Спасибо... очень признателен. Однако это же не решает проблему с экранированием, о которой я упоминал, верно?
