テーブル変数を$ wpdb-> prepare()に渡すのに問題があります。これが機能しているコードです:
$table = $wpdb->get_blog_prefix( $blog_id ) . 'my_table';
$voters = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table WHERE user_id= %d AND post_id = %d;", $user_ID, $post->ID ));
これはとてもうまくいきます。しかし、私は自分のテーブルもprepareステートメントに含めるべきだと思います。しかし、私がこれを変更すると、それは壊れます。
$table = $wpdb->get_blog_prefix( $blog_id ) . 'my_table';
$voters = $wpdb->get_row($wpdb->prepare("SELECT * FROM %s WHERE user_id= %d AND post_id = %d;", $table, $user_ID, $post->ID ));
なぜそれが壊れているのかもしれないという考えはありますか?
Prepare()メソッドは%sをエスケープします。引用符がテーブル名に追加されているので、リストした2番目のコードは中断します。したがって、DBの内容と一致しません。
最初のコードは、文字列を直接置き換えてデータベース内のテーブルの名前と一致させるため、機能します。
表示されるエラーメッセージは何ですか?
HTH
次のようなものを使用できるように、テーブルを$ wpdbクラスに登録する必要があります。
$table = $_POST['table'];
$res = $wpdb->get_results($wpdb->prepare("
SELECT * FROM {$wpdb->my_custom_table}
WHERE user_id= %d AND post_id = %d;",
array($user_ID, $post->ID )
);
これはNice関数へのリンクです。initで呼び出されるとテーブルが存在しない場合は作成されますが、常に好きな名前で登録されます。
http://snipplr.com/view/52178/
これは、その機能に必要な重要なコードです(私が少し編集したものです)。
//include the wordpress db functions
require_once(ABSPATH . 'wp-admin/upgrade-functions.php');
dbDelta($sql);
if (!isset($wpdb->custom)) $wpdb->custom = new stdClass();
//add the shortcut so you can use $wpdb->custom->my_table
$wpdb->custom->$search_table = $search_table;
$wpdb->tables[] = str_replace($wpdb->prefix, '', $search_table);