web-dev-qa-db-ja.com

prepare()が機能しない

私がこれをすると:

$transients = $wpdb->get_col(
    "
    SELECT     option_name
    FROM       $wpdb->options
    WHERE      option_name
    LIKE       '_transient_wb_tt_%'
    "
);

それはうまく働きますが、私がprepareを使うときはこんな感じで:

$transients = $wpdb->get_col( $wpdb->prepare(
    "
    SELECT     option_name
    FROM       %s
    WHERE      option_name
    LIKE       '_transient_wb_tt_%'
    ",
    $wpdb->options
) );

うまくいかない、ここで何をしているの?

4
wickedbroccoli

@ bainternetに同意します。 $wpdb->prepareは必要ありません。ユーザー提供のコンテンツはありません。

質問に対する答えは、ワイルドカード%prepareを通過させるには、コード内でそれを2倍にする必要があるということです。

LIKE  '_transient_wb_tt_%%'

生成されたクエリをよく見たい場合は、これを試してください。

var_dump($wpdb->prepare("
    SELECT     option_name
    FROM       %s
    WHERE      option_name
    LIKE       '_transient_wb_tt_%%'
    ",
    'abc')); 
die;

不要なこと以外に、$wpdb->prepareをこのように使用しても機能しません。 prepareを使用してテーブル名を交換しようとすると、テーブル名の前後に引用符が付きます。それは無効なSQLです。クエリは単純にする必要があります。

SELECT     option_name
FROM       {$wpdb->options}
WHERE      option_name
LIKE       '_transient_wb_tt_%%'
1
s_ha_dum