web-dev-qa-db-ja.com

$ wpdb-prepare:パラメータをテーブル名にバインドする必要がありますか?

テーブル全体に対して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"をスキップするべきですか?

1
Galivan

いいえ、あなたは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_Aprepareへの引数であり、get_resultsへの引数ではありません。それは(上記で説明したように値の交換は間違っていますが):

$result = $wpdb->get_results(
  $wpdb->prepare("SELECT * FROM %s", $table), 
  ARRAY_A
);
2
s_ha_dum

これは単なる間違った括弧の閉じ方です。$wpdb->prepareに必要なのはquery stringquery parametersだけです。それから、get_resultsでどのような結果が必要かを定義できます。

$result = $wpdb->get_results(
    $wpdb->prepare( "SELECT * FROM %s", $table ),
    ARRAY_A
) or die ( $wpdb->last_error );

編集:あなたはこの更新されたコードを使って最後のSQLエラー$wpdbをチェックすることができます

0
CapitanFindus