[CakePHP] 独自のSQL文でプリペアドステートメントを使う方法

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


Author: webmaster