web-dev-qa-db-ja.com

wpdb :: prepareが誤って呼び出されました

カスタム投稿タイプを削除した後に、孤立した投稿を削除するためのコードです。

それは動作しますが、このコードは...

global $wpdb;
$wpdb->query( 
    $wpdb->prepare( 
    "DELETE a,b,c FROM wp_posts a
    LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
    LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
    WHERE a.post_type='attorneys'"
  )
);

...このエラーが発生しています。

PHPに関するお知らせ:wpdb :: prepareは と誤って と呼ばれていました。 wpdb :: prepare()の照会引数にはプレースホルダーが必要です。

それで、Andrew Nacinによるmake.wordpress.orgの 説明 を読んだ後、私(sorta)はそれを集める...私には2番目の議論が欠けている。

それなら このスタックポスト を読んだ後、prepare()関数さえ必要なのかと疑問に思います。 未知の値を保持している変数はありますか 私はこれについてはっきりしていません。

...何が足りないの?

更新:このコードも動作しますが、prepare()なしで安全ですか。

global $wpdb;
$wpdb->query( 
  "DELETE a,b,c FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
  LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
  WHERE a.post_type='attorneys'"
);

お知らせ下さい。

3
sleeper

ユーザーから入力を受け取るときは、常に$wpdb->prepareを使用することをお勧めします。これはSQLインジェクションに対してクエリを保護するのに役立ちます。詳細については、 Codex を確認してください。

$wpdb->prepareを使用するときは、変数をクエリに渡す必要があります。あなたのケースでは、ハードコードされた値を使っているので$wpdb->prepareの使用をスキップすることができます。しかし、変数に関して同じ値がある場合は、以下のように変更する必要があります。

$post_type = 'attorneys';

$wpdb->query( 
     $wpdb->prepare(
          "DELETE a,b,c FROM wp_posts a
          LEFT JOIN wp_term_relationships b ON (a.ID=b.object_id)
          LEFT JOIN wp_postmeta c ON (a.ID=c.post_id)
          WHERE a.post_type=%s",
          $post_type
     )
);
7
Chittaranjan