Должен ли я использовать wpdb prepare?

28

Я новичок в SQL и мне интересно, если мне нужно использовать wpdb->prepareдля следующего запроса к таблице, которую я создал

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = "SELECT * FROM " . $tablename . " ORDER BY date_created DESC";
$resulst = $wpdb->get_results( $sql , ARRAY_A );

Мне нужно использовать prepareздесь? Как бы я это сделал?

ура

Ричард Суини
источник

Ответы:

33

Рекомендуется всегда использовать его, prepareно основное его применение - предотвращение атак с использованием SQL-инъекций, и поскольку пользователи / посетители не вводят данные или они не могут выполнить запрос, это не является проблемой в текущем примере.

Но, как я уже говорил ранее, лучше всего использовать его, и как только вы начнете его использовать, вы никогда не остановитесь, поэтому в своем примере вы можете использовать его так:

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM %s ORDER BY date_created DESC",$tablename );
$results = $wpdb->get_results( $sql , ARRAY_A );

чтобы узнать больше о том, как его использовать, обратитесь к Кодексу

Bainternet
источник
Привет @Bainternet, спасибо за такое ясное объяснение - по какой-то причине, когда я пробую твой код, он возвращает пустой массив. Я проверил и дважды проверил на опечатки. Если я сделаю неподготовленный запрос, я получу массив. Я не понимаю, почему это не работает ..!
Ричард Суини
Странный. Я пытался использовать тот же код с другим запросом: $tablename = $wpdb->prefix . "my_custom_table"; $concert_id = 1; $sql = "SELECT * FROM " . $tablename . " WHERE concert_id = %d LIMIT 1;"; $prep_sql = $wpdb->prepare( $sql, $concert_id ); $get_concerts = $wpdb->get_results( $prep_sql , ARRAY_A ); и он прекрасно работает! Не уверен, почему это будет. Но я понимаю это сейчас в любом случае!
Ричард Суини
6
Заключение имени таблицы в одинарные кавычки не сработает. Нормальное Экранирование с обратными кавычками, так что ваш запрос должен закончить тем, что, как это: SELECT * FROM `wp_my_custom_table`. Вы можете включить двойную поддержку цитаты, но тогда она должна была бы выглядеть следующим образом : SELECT * FROM "wp_my_custom_table".
Ян Фабри
3
Я не согласен с этим ответом. Почему вы должны сбежать, когда функция уже ускользает от всего? Вы думаете, Wordpress решит удалить выход из ядра? Также нет смысла избегать имени таблицы :), потому что оно жестко закодировано, и вы знаете, что все в порядке. Я знаю, что это только пример, но в любом случае не избежать имен таблиц, у меня есть проблемы при использовании подготовки с именами таблиц, он добавляет обратные пометки и ошибки SQL Trows.
Tommixoft
@ Tommixoft Если вы прочитаете ответ еще раз, вы увидите, что вы на самом деле говорите то же самое, что я сказал, и что имя таблицы является примером.
Bainternet
0

Когда вы используете метод prepare, он защищает код от уязвимостей SQL-инъекций.

Вот код, который необходимо изменить для использования prepare();

global $wpdb;
$tablename = $wpdb->prefix . "my_custom_table";
$sql = $wpdb->prepare( "SELECT * FROM {$tablename} ORDER BY date_created DESC");
$resulst = $wpdb->get_results( $sql , ARRAY_A );
softnwords
источник
0

В вашем случае невозможна атака SQL-инъекцией . Ваш код не нуждается в дополнительной защите, потому что не использует ввод пользователя, такой как: отправка, получение, запрос, cookie.

Не используйте сложные функции, когда нет необходимости экономить ресурсы сервера.

SaschArt
источник