web-dev-qa-db-ja.com

テーブル名での引用

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 !=' '

どうすればこれを修正できますか?

1
Lea Cohen

どうすればこれを修正できますか?

できませんが、壊れていません。 prepareに文字列を使うように伝えています。文字列は引用符で囲まれます。これはMySQLのシンタックスを生成するためのものではありません。あなたのtablenameは文字列値よりもMySQLのコマンドやキーワードです。それがprepareの目的ではありません。

prepareはユーザー提供のデータを操作するためのものです。あなたのテーブル名は、ユーザーが提供したデータではないので、そうではありませんので、それを「準備」する必要はありません。不要です。 SQL自体にテーブル名を作成するだけです。

"SELECT COUNT(id) FROM ".$wpdb->prefix."faq_questions WHERE answer !=' '"

参照してください: https://wordpress.stackexchange.com/a/93861/21376

4
s_ha_dum

いくつかの選択肢があります。ホワイトリストが有効なオプションです。つまり、許可されたフィールド名の配列を確認し、いずれかのフィールド名が認識された場合にのみORDERBY句を追加します。

if ( in_array( $table_name, ['faq_questions', 'faq_responses', 'some_other_table'] ) )...

そうでなければ、WordPressはあなたのためだけに作られたNice関数を持っています。 https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby

0
Tom Auger