CakePHPのquery関数でプレースホルダを使う

CakePHPのquery関数でプレースホルダを使う CakePHP2

CakePHPのORマッパーではselect for updateなど利用することはできません。

そのため、直接クエリを書いて実行する必要があります。

その時、引数で渡した値などを直接クエリ内に入れるとSQLインジェクション等のセキュリティホールになる可能性があります。これはプレースホルダを利用することで回避することができます。

ここでは、プレースホルダをCakePHPのquery関数で利用する方法を紹介します。

 

■以下のように記述します

// 検索条件構築
$query = "SELECT * FROM hogehoges as Hoge WHERE status = ? AND hoge_status = ? LIMIT 1 FOR UPDATE";

$resultInfo = $this->query($query, [1,2], false);

上記の例だと

hogehogesテーブルのstatusが1かつ、hoge_statusが2のものを1つ、FOR UPDATEを使ってロックして取得

ということになります。

 

ORマッパーを使わないで記述する時と同様に?が置換されていきます。そして、query関数の第2引数に置換するパラメータを設定します。こうすることで、ちゃんとエスケープされた文字列がバインドされてSQL実行されます。

 

第3引数はキャッシュの有効・無効となります。キャッシュが有効になっていると複数回実行された時に、二回目以降キャッシュの内容が返されるようになります。

 

ORマッパーが使えるときは、そっちを使ったほうがよいですが、どうしてもできない場合はqueryを使いましょう。では。