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));<