wpdb::prepare был вызван неправильно
-
28-09-2020 - |
Вопрос
У меня есть этот код для удаления потерянных записей после удаления пользовательского типа записи.
Это работает, но этот код...
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:был вызван wpdb::prepare неправильно.Аргумент запроса wpdb::prepare() должен содержать заполнитель.
Итак, после прочтения объяснение на make.wordpress.org Эндрю Насина, я (вроде как) так понимаю...хорошо..Мне не хватает второго аргумента.
Затем, после прочтения этот пост из стека, Я задаюсь вопросом, нужен ли мне вообще этот 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
)
);