PDO はいくつかの利点を提供します。パラメータ化されたクエリは言うまでもありません。必要なパラメーターのみをホワイトリストに登録し、SQL クエリを作成し、パラメーター化された PDO クエリを実行する方法を提供する要点を作成しました。
- 行 08 ~ 18 は、これをテストするためのスクラッチ データベース/テーブルを構築するための SQL を提供します。
- 行 23 ~ 27 は、ホワイトリストと where 句の構築を処理します (「AND」を「OR」に置き換えるだけで、「ALL」ではなく「ANY」タイプのフィルターを構築できます)。
- 行 41 は、完全な SQL クエリを構築します。
- 行 50 は、パラメーター化されたクエリを実行します。
$parameters
この例に基づいて配列に含まれるものは次のとおりです。
array(3) {
'Country' => string(3) "USA"
'County' => string(6) "Nassau"
'Age' => string(2) "21"
}
$whereClause
:_
string(38) "Country = ? AND County = ? AND Age = ?"
$sql
:_
string(72) "SELECT * FROM pdo_whitelist WHERE Country = ? AND County = ? AND Age = ?"
ソースのホワイトリスト部分 (完全なソースはhttps://gist.github.com/2340119にあります):
<?php
// whitelist parameters
$post_input = ['Country' => 'USA', 'County' => 'Nassau', 'Age' => 21, 'EscalatePriviledge' => true, 'MakeMeSuperUser' => 1];
$whitelist = ['Country', 'County', 'Age'];
$parameters = array_map('trim', array_intersect_key($post_input, array_flip($whitelist)));
$wheres = array_map(function($fieldName){ return "${fieldName} = ?"; }, array_keys($parameters));
$whereClause= join(' AND ', $wheres);
// you should validate and normalize here as well (see: php.net/filter_var)
クエリのパラメーター化を処理する PDO コード:
$statement = $pdo->prepare($sql);
$statement->execute(array_values($parameters));
最後に、参照用のリンクの概要を次に示します。