テーブル全体に対してSELECTを実行するだけです - そしてテーブルは変数で定義されています。
$table = $wpdb->prefix . 'members';
この変数にパラメータをバインドする必要がありますか?
これによりエラーが発生しました。
$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM %s", $table, ARRAY_A));
しかし、 "%s"を飛ばした場合、これもエラーになります。
$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM $table", ARRAY_A));
この場合、 "prepare"をスキップするべきですか?
いいえ、あなたはtablenameを交換したくありません。指定した場合、テーブル名は引用符で囲まれ、SQLエラーが発生します。試してください:
$table = $wpdb->prefix . 'members';
$qry = $wpdb->prepare("SELECT * FROM %s", $table);
var_dump($qry);
$qry = "SELECT * FROM $table";
var_dump($result);
最初の文字列は無効なSQLです。あなたが正しい名前のテーブルを持っていれば、2番目はうまくいくはずです。
prepare()
は、ユーザーが提供したデータ、つまり悪意のある意図を持った疑わしいソースからのデータである可能性があるデータを操作するためのものです。あなたのテーブル名のように、疑わしいソースからのものではないデータを交換する必要はありません。
あなたが欲しいのは:
$table = $wpdb->prefix . 'members';
$qry = "SELECT * FROM $table";
$result = $wpdb->get_results($qry, ARRAY_A);
var_dump($result);
ところで、あなたの括弧はここでは間違っています(残りがうまくいったとしても):
$result = $wpdb->get_results($wpdb->prepare("SELECT * FROM %s", $table, ARRAY_A));
ARRAY_A
はprepare
への引数であり、get_results
への引数ではありません。それは(上記で説明したように値の交換は間違っていますが):
$result = $wpdb->get_results(
$wpdb->prepare("SELECT * FROM %s", $table),
ARRAY_A
);
これは単なる間違った括弧の閉じ方です。$wpdb->prepare
に必要なのはquery string
とquery parameters
だけです。それから、get_results
でどのような結果が必要かを定義できます。
$result = $wpdb->get_results(
$wpdb->prepare( "SELECT * FROM %s", $table ),
ARRAY_A
) or die ( $wpdb->last_error );
編集:あなたはこの更新されたコードを使って最後のSQLエラー$wpdb
をチェックすることができます