Ошибка wpdb::prepare вызывается некорректно в WordPress
У меня есть этот код для удаления "осиротевших" записей после удаления пользовательского типа записи.
Он работает, но этот код...
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'"
);
Пожалуйста, посоветуйте.
Всегда рекомендуется использовать $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
)
);
