web-dev-qa-db-ja.com

wpdb :: prepare()が機能しない

これが私のコードです:

global $wpdb;
$table_name = $wpdb->prefix . 'product_codes';

// Check if codes exist
$query = $wpdb->prepare( "SELECT * FROM %s", $table_name ); 
$existing_data = $wpdb->get_results( $query );

// Returns empty array despite data existing
print '<pre>';
print_r( $existing_data );
print '</pre>';

テーブル名を文字通りに入力すれば、うまくいきます。テーブル名変数を出力すると、正しい文字列が表示されます。しかし、何らかの理由で上記のコードを使用すると、空の配列が返されます。結果はゼロになります。

1
Jonny

問題は、My/SQLのテーブル名は文字列ではないということです。そのため'wp_product_codes'は実際のテーブルではなく文字列として解釈されています。これが通常wpdb::prepare()に渡されるテーブルを見ない理由です - wpdb::prepare()はあなたが知らないかもしれない/信頼できないデータのためのものであり、サニタイズされる必要があるところで変更されないのでテーブル名を知るべきです。それでは、クエリを修正しましょう。

$existing_data = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}product_codes" );
printf( '<pre>%1$s</pre>', print_r( $existing_data, 1 ) );
die();
5
Howdy_McGee