$wpdb, похоже, не работает на странице внутри плагина


У меня есть папка плагинов foobar.

Внутри этого плагина у меня есть страница под названием foobar.php . Внутри этой страницы у меня есть

global $wpdb;
          $orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'name'; //If no sort, default to title
          $sql = "SELECT * FROM wp_nc_location ORDER BY " . $orderby;
          $data = $wpdb->get_results($sql); 

Этот запрос работает внутри моего foobar.php страница. Однако в той же папке у меня есть другая страница под названием process.php, и когда я включаю идентичный код:

global $wpdb;
          $orderby = (!empty($_REQUEST['orderby'])) ? $_REQUEST['orderby'] : 'name'; //If no sort, default to title
          $sql = "SELECT * FROM wp_nc_location ORDER BY " . $orderby;
          $data = $wpdb->get_results($sql); 

Я получаю сообщение об ошибке:

Fatal error: Call to a member function get_results() on a non-object in...

Почему глобальная база данных $wpdb не работает на другой странице? (process.php)?

 1
Author: redconservatory, 2011-08-15

1 answers

Объект $wpdb является частью WordPress, поэтому он не будет загружен на отдельную страницу PHP, как в шаблон WordPress.

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

В качестве примечания: В настоящее время вы доверяете вводимым данным пользователя ($_REQUEST), что является плохой вещью™, так как это может сделать вас уязвимым для атак с использованием SQL-инъекций. Приведенный вами пример кода может быть адаптирован как ниже, чтобы быть менее уязвимыми:

global $wpdb;
$orderby = $_REQUEST['orderby'];
// Limit the values of orderby to ones we know to be safe
$acceptable_orderbys = array( 'name', 'age', 'height' );
if ( in_array( $orderby, $acceptable_orderbys ) )
    $clean_orderby = $orderby;
else
    $clean_orderby = 'name';
$sql = "SELECT * FROM wp_nc_location ORDER BY $clean_orderby";
$data = $wpdb->get_results($sql); 

Я не тестировал приведенный выше код, но главное - проверить, что значение $orderby известно как безопасное, прежде чем вы введете его в запрос БД.

 4
Author: Simon Wheatley, 2011-08-16 11:09:24