Ошибка wpdb::prepare вызывается некорректно в WordPress

16 июн. 2014 г., 07:07:56
Просмотры: 19.5K
Голосов: 5

У меня есть этот код для удаления "осиротевших" записей после удаления пользовательского типа записи.

Он работает, но этот код...

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
    WHERE a.post_type='attorneys'"
  )
);

...вызывает эту ошибку:

PHP Notice: wpdb::prepare был вызван некорректно. Аргумент запроса wpdb::prepare() должен содержать плейсхолдер.

После прочтения объяснения на make.wordpress.org от Andrew Nacin, я (как бы) понял, что... ну... мне не хватает второго аргумента.

Затем, прочитав этот пост на Stack Overflow, я задумался, нужна ли вообще функция prepare(). Есть ли какие-либо переменные с неизвестными значениями? Мне это не совсем ясно.

...что я упускаю?

ОБНОВЛЕНИЕ: Этот код также работает, но без prepare() я сомневаюсь, безопасно ли это.

global $wpdb;
$wpdb->query( 
  "DELETE a,b,c FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
  LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
  WHERE a.post_type='attorneys'"
);

Пожалуйста, посоветуйте.

0
Все ответы на вопрос 1
0
11

Всегда рекомендуется использовать $wpdb->prepare, когда вы получаете данные от пользователя. Это поможет защитить запросы от SQL-инъекций. Для получения более подробной информации обратитесь к Кодексу

При использовании $wpdb->prepare вы должны передавать переменные в запрос. В вашем случае можно не использовать $wpdb->prepare, так как вы используете жестко заданное значение. Но если у вас есть такое же значение в виде переменной, вам нужно изменить код следующим образом

$post_type = 'attorneys';

$wpdb->query( 
     $wpdb->prepare(
          "DELETE a,b,c FROM wp_posts a
          LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
          LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
          WHERE a.post_type=%s",
          $post_type
     )
);
16 июн. 2014 г. 09:59:59