先日 Model::updateAll について自前でエスケープ処理をする話を書きましたが、CookBookにサニタイズの注意が一言あった方が良いのではないかと思い、おこがましくも Bakery にレポートしたところただちに修正していただけました。

(追記: 以下の内容は古いです。Sanitize クラスは v2.4 から非推奨になり、その後の廃止が勧告されています

そこで幸いにも今まで見落としていた Sanitize クラスescape メソッドについて知ることができて良かった。

具体的には前回のサンプルコードは以下のように書くことになります

<?php
$data = '"' . Sanitize::escape( $data ) . '"';
$this -> updateAll( array( 'any_field' => $data ), $conditions );

追記: 前回、この updateAll だけが何故フィールドのサニタイズが自動で行われないのか全く理解できなかったのですが、改めて Cookbook  を注意して読むと、「フィールドには SQL をそのまま渡せますよ」ってことがひとつの特徴として書かれてます。ということは、このメソッドはそういう使い方を想定して作られた経緯でもあるのかもしれません。だとするとまぁ、納得。


更に追記: この「自動的にエスケープされない」という仕様は、更新の値にSQLの関数を用いる場面ではむしろ合理的な実装ということに気づきました。その場合、仮に自動エスケープがデフォルトであるならばオプションでエスケープを回避するパラメータを渡さなくてはならなくなったことでしょう。