2016-10-14 5 views
1

簡単な質問 - 私はWordpressの中でこの種のクエリを実行する場合はことを理解し実行します。Wordpressで準備されたクエリを実行する必要がありますか?

SELECT * FROM tableA WHERE variable1 = $var1 

...その後、私はそうのように、「準備」を使用する必要があります。

$my_query = $wpdb->get_results($wpdb->prepare("SELECT * FROM tableA 
WHERE variable1 = %s", $var1)); 

しかし、私が代わりにクエリのこのタイプをしたいとき:

  • は、列
  • とNOT変数を使用して上の2つのテーブルを結合します
  • このような

SELECT * FROM tableA, tableB WHERE tableA.some_col = tableB.some_other_col 

... I 'べきです':

  1. は依然としてSQLインジェクション
  2. かであるから保護するために文を '準備' のいくつかのフォームを使用します次のようにしてください。

    $my_query = $wpdb->get_results("SELECT * FROM tableA, tableB WHERE 
    tableB.some_col = tableB.some_other_col"); 
    
+2

をこれについての議論を見つけます。 – WillardSolutions

+1

これはセキュリティ上の問題以上のコードスタイルの問題になります。以下の答えが示すように、あなたはそれを必要としませんが、それを一貫して使うにはいくつかのコードスタイルの利点があるかもしれません。私が渡しているパラメータを持っているときは個人的に、私は '$ wpdb-> prepare()'を使いますが、これはコードスタイルの決定です。 –

答えて

1

誰でもこのコードをSQLインジェクションに使用する方法がないため、そこでは準備文を用意する必要はありません。

あなたはちょうどあなたが準備された文を忘れることができます任意の変数を与えることなく二つのテーブルからすべてを選択した場合は、

1

を:)私はあなたが

$ wpdb->が

を準備

にこだわるべきだと思います

を使用して、クエリに渡すパラメータを偽装していない場合でも、 これを行う理由はいくつかあります。

  1. これはベストプラクティスです。
  2. 一貫性。すべてのクエリで同じアプローチを使用する場合は、
  3. 将来、このクエリにパラメータを渡す必要がある場合は、より簡単になります。

あなたが任意のパラメータを渡していない場合は、ユーザー入力がデータベースに触れる機会がないので、プリペアドステートメントを使用する必要はありませんここにShould I use wpdb prepare?

+0

あなたはこれを行うためのベストプラクティス*であることを、他人の主張をコピーしています。あなたが実際にそれがベストプラクティスであるという考えを支持することができるなら、WPはそれを推奨していますか?権威ある情報源からその勧告が見えますか? SE上の別の答え? –

+0

@cale_bこれはWPのベストプラクティスではありませんが、データベースにクエリを実行するときにパラメータ化されたクエリを使用することをお勧めします([ASP.NETのSQLインジェクションからの保護](https://msdn.microsoft.com/en-us/) /library/ff648339.aspx)と[w3schools.com for SQL Injection](http://www.w3schools.com/sql/sql_injection.asp)を参照してください。私は本当に誰もがパラメータ化されたクエリを使うべきだと信じています。それはWPだけには当てはまりません。 –

関連する問題