CakePHPで独自のSQLを使うにあたり、SQLインジェクション対策のため、プリペアドステートメントを使った方が良いです。
プリペアドステートメントはMySQL 5.1から搭載された機能で、パラメータを自分でエスケープ(サニタイズ)しないで済みます。
書式
$this->Model->getDataSource()->fetchAll($query,$params,array(‘cache’ => false));
第一引数:SQL文を設定(パラメータは?で記載)
第二引数:パラメータを設定
第三引数:キャッシュを設定(デフォルトではTrueなのでFalseにしておいた方が良い)
PHP
$query=''select * from posts where id = ? and name = ?';
$params=array(1, 太郎));
$this->Model->getDataSource()->fetchAll($query,$params,array('cache' => false));
CakePHPのプリペアドステートメント(利用例)
検索フォームでPOSTされたデータからSQL文とパラメタリストを作ってプリペアドステートメントを実行する例です。
//基本となるSQL文
$sql = 'SELECT * FROM posts';
//テストデータ
$data['id'] = 1;
$data['name'] = '太郎';
//POSTデータからwhere文とパラメタを作成
if (!empty($data['id'])) {
$whereSQL[] = 'posts.id=?';
$params[] = $data['id'];
}
if (!empty($data['name'])) {
$whereSQL[] = 'posts.name=?';
$params[] = $data['id'];
}
//where文を作成
if (isset($whereSQL)) {
$queryWhereSQL = ' WHERE ' . implode(' AND ', $whereSQL) . '';
}
//SQL文完成
$sql.=$queryWhereSQL;
//プリペアドステートメント実行
$this->Post->getDataSource()->fetchAll($sql,$params,array('cache' => false));<