サポート » 使い方全般 » prepare関数(クエリー引数にはプレースホルダーが必要です。)対策につい

  • 解決済 d-xanthus

    (@d-xanthus)


    お世話になります。
    カテゴリー別の年別アーカイブリストを作成したいと思い、こちらのサイトを参考に、prepare関数とSQL文でリンクリストを出力しました。
    ただ、この記述だとバージョン3.9以降、警告がでるようで、できれば警告の出ないような記述に変更したいと思い、質問させていただきました。
    いといろ調べてみると、セキュリティ的な理由で警告が出るようになったようですが、SOL文はさっぱり判らず、どのように変更すれば良いのかまったく理解できずにいます。
    お知恵を拝借できればありがたいです。
    何卒よろしくお願いいたします。

    <!-- こちらが使用コード -->
    <?php $results = $wpdb->get_results($wpdb->prepare("
                    SELECT YEAR(post_date) AS post_year
                    FROM wp_posts p, wp_term_relationships tr, wp_term_taxonomy tt, wp_terms t
                    WHERE p.ID = tr.object_id
                    AND tr.term_taxonomy_id = tt.term_taxonomy_id
                    AND tt.term_id = t.term_id
                    AND p.post_status = 'publish'
                    AND p.post_type = 'post'
                    AND tt.taxonomy = 'category'
                    AND t.name = 'メディア掲載'
                    GROUP BY post_year
                    ORDER BY post_year DESC
                "));?>
    <?php foreach ($results as $result) :?>
     <li><a href="<?php bloginfo('url'); ?>/category/media/<?php echo $result->post_year; ?>"><?php echo $result->post_year; ?>年</a></li>
     <?php endforeach; ?>
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • モデレーター jim912

    (@jim912)

    prepare メソッドは、SQL文の一部に動的な値(例えばユーザーからの入力値により検索させる場合など)を用いる場合に利用するものですので、今回のようにSQL文が固定の場合は、prepare メソッドを使う必要はありません。

    スレッド開始 d-xanthus

    (@d-xanthus)

    jim912様

    早速のご返答ありがとうございます。
    prepare メソッドは使わなくても良かったのですね。
    早速削除して動作確認したところ警告も消え、動作も問題ありませんでした。
    感謝致します。

    <!-- こちらが最終コード -->
    <?php $results = $wpdb->get_results("
                    SELECT YEAR(post_date) AS post_year
                    FROM wp_posts p, wp_term_relationships tr, wp_term_taxonomy tt, wp_terms t
                    WHERE p.ID = tr.object_id
                    AND tr.term_taxonomy_id = tt.term_taxonomy_id
                    AND tt.term_id = t.term_id
                    AND p.post_status = 'publish'
                    AND p.post_type = 'post'
                    AND tt.taxonomy = 'category'
                    AND t.name = 'メディア掲載'
                    GROUP BY post_year
                    ORDER BY post_year DESC
                ");?>
    <?php foreach ($results as $result) :?>
    <li><a>/category/media/<?php echo $result->post_year; ?>"><?php echo $result->post_year; ?>年</a></li>
     <?php endforeach; ?>
2件の返信を表示中 - 1 - 2件目 (全2件中)
  • トピック「prepare関数(クエリー引数にはプレースホルダーが必要です。)対策につい」には新たに返信することはできません。