WP3.5以降、prepare()
は、クエリに引数を追加する代わりに、プレースホルダをセキュリティ対策として受け入れます。したがって、$wpdb->prefix
は、%s
によって呼び出される2番目のパラメーターになる必要があります。
$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(id) FROM %s WHERE answer !=' '", $wpdb->prefix . "faq_questions" ) );
ただし、それを行うとテーブル名が引用符で囲まれて返されます。
SELECT COUNT(id) FROM 'wp_faq_questions' WHERE answer !=' '
どうすればこれを修正できますか?
どうすればこれを修正できますか?
できませんが、壊れていません。 prepare
に文字列を使うように伝えています。文字列は引用符で囲まれます。これはMySQLのシンタックスを生成するためのものではありません。あなたのtablenameは文字列値よりもMySQLのコマンドやキーワードです。それがprepare
の目的ではありません。
prepare
はユーザー提供のデータを操作するためのものです。あなたのテーブル名は、ユーザーが提供したデータではないので、そうではありませんので、それを「準備」する必要はありません。不要です。 SQL自体にテーブル名を作成するだけです。
"SELECT COUNT(id) FROM ".$wpdb->prefix."faq_questions WHERE answer !=' '"
いくつかの選択肢があります。ホワイトリストが有効なオプションです。つまり、許可されたフィールド名の配列を確認し、いずれかのフィールド名が認識された場合にのみORDERBY句を追加します。
if ( in_array( $table_name, ['faq_questions', 'faq_responses', 'some_other_table'] ) )...
そうでなければ、WordPressはあなたのためだけに作られたNice関数を持っています。 https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby