これが私のコードです:
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>';
テーブル名を文字通りに入力すれば、うまくいきます。テーブル名変数を出力すると、正しい文字列が表示されます。しかし、何らかの理由で上記のコードを使用すると、空の配列が返されます。結果はゼロになります。
問題は、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();