でも、使ってもエラーにならない。
クエリの結果を精査すれば、クエリで想定した結果にならないためわかるのだが、テストが嫌いな俺は、クエリそのものを検査することにした。
// すべてのパラメータマーカを取得する。 preg_match_all('/(:[\w]+)/', $sql, $matches); // パラメータマーカの出現回数を得る。 $param = array_count_values($matches[1]); // 2回以上出現したパラメータマーカを調べる。 foreach($param as $key => $val) { if($val > 1) { echo "パラメータマーカ {$key} を {$val} 個検出しました。"; // ここでエラーを発生させるか、強制終了する。 } }
こんな感じのロジックをPDOを継承したクラスに仕込んでおけばOK。
class dao extends PDO { const DAO_ERROR_PARAMETER_MARKER_DUPLICATED = 777; // 今回必要なところだけ記述 public function prepare($statement, $options = array()) { preg_match_all('/(:[\w]+)/', $sql, $matches); $param = array_count_values($matches[1]); foreach($param as $key => $val) { if($val > 1) { // エラーモードに応じて、例外を発生させるか、falseを返す。 $err_mode = $this->getAttribute(PDO::ATTR_ERRMODE); if($err_mode === PDO::ERRMODE_EXCEPTION) { throw new Exception("パラメータマーカ {$key} を {$val} 個検出しました。" , self::DAO_ERROR_PARAMETER_MARKER_DUPLICATED); } else { return false; } } } return parent::prepare($statement, $options); } }