Альтернатива функции mysql_real_escape_string

20 мая 2014 г., 19:56:09
Просмотры: 22.3K
Голосов: 3

У меня есть плагин 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?

Спасибо

3
Комментарии

Я знаю, что на stackoverflow есть пользовательская php-функция (см.: http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db), но я также предлагаю использовать mysqli или pdo.

pascalvgemert pascalvgemert
20 мая 2014 г. 21:47:04

на самом деле, похоже, что $wpdb->prepare выполняет правильное экранирование согласно этой странице http://codex.wordpress.org/Data_Validation

Allen Allen
20 мая 2014 г. 22:04:14

Рад это слышать!

pascalvgemert pascalvgemert
20 мая 2014 г. 22:05:08
Все ответы на вопрос 2
0

Хотя ответ с использованием 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() всё ещё необходим.

21 мая 2014 г. 04:41:05
2

При работе с базой данных в 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 );
20 мая 2014 г. 20:33:19
Комментарии

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

Allen Allen
20 мая 2014 г. 20:53:41

@Allen да, prepare экранирует значения с помощью mysqli_real_escape_string (совместимо с PHP 5.5) или mysqli_real_escape_string в зависимости от вашей текущей версии PHP.

gmazzap gmazzap
21 мая 2014 г. 01:41:47