web-dev-qa-db-ja.com

$ wpdbがプラグイン内のページで機能していないようです

Foob​​arというプラグインフォルダがあります。

このプラグインの中には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
redconservatory

$wpdbオブジェクトはWordPressの一部なので、WordPressテンプレートのようにスタンドアロンのPHPページにはロードされません。

あなたは あなた自身のページテンプレートの作成 を調べたいと思うかもしれません、そしてあなたはそのページテンプレートの一部としてデータベースクエリを実行することができます。

副次的注意として:あなたは現在SQL Serverインジェクション攻撃に対して脆弱になる可能性があるのでBad Thing™であるユーザー($_REQUEST)からの入力を信頼しています。あなたが与えるコード例は、より脆弱でないように以下のように適応させることができます。

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の値をチェックすることです。それをDBクエリに入れる前に安全であることが知られています。

4
Simon Wheatley