Чи повинен я використовувати wpdb prep?


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, дякую за таке чітке пояснення - чомусь коли я спробую ваш код, він повертає порожній масив. Я перевірив і подвоїв перевірку на помилки друку. Якщо я роблю непідготовлений запит, я отримую масив. Я не розумію, чому це не працює ..!
Річард Свіні

Незвичайно. Я спробував використати той же код з іншим запитом: $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-помилок.
Tommixoft

@Tommixoft Якщо ви прочитаєте відповідь ще раз, ви побачите, що ви насправді говорите те саме, що я сказав, і що назва таблиці є прикладом.
Bainternet

0

Під час використання підготовки він захищає код від вразливості 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 );

0

У вашому випадку неможлива атака ін'єкції SQL . Ваш код не потребує додаткового захисту, оскільки не використовуйте введення користувача, наприклад: опублікувати, отримати, запит, cookie.

Не використовуйте складну функцію, коли не потрібно зберігати ресурси сервера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.