基本形
基本
$this->テーブル名->updateAll(
['更新するカラム' => 変更の値 ],
['条件のカラム' => 条件の値 ]
)
例
$this->foo->updateAll(
[ 'status' => "'OK'"],
[ 'age' => 20 ]
);
//=>update foo set status='ok' where age = 20
注意点
更新する値が文字列ならクォートして渡す
更新する値はそのままsqlに渡されるので、更新する値が文字列ならクォートして渡す。
クォートするのは更新する値だけ!条件は文字列でもクォートしなくても良い!!!
ちなみに、空文字で更新したい場合は以下の通り。
空文字で更新
$this->foo->updateAll(
[ 'status' => "''"],
[ 'age' => 20 ]
);
//=>update foo set status='' where age = 20
modifiedは自動更新されない
modifiedは自動更新されないので、自分でやらなければいけない。
$this->foo->updateAll(
[
'status' => "'OK'",
'modified' => "'" . date('Y-m-d H:i:s') . "'"
],
[ 'age' => 20 ]
);
サニタイズを自分でやる
sqlをそのまま渡すのでサニタイズはやってくれない。
cookbookにはサニタイズにSanitize::escape()を使うと書いているけど、Cake2.4からSanitize::escape()はdeprecatedになっている模様。
一旦、Sanitize::escape()の使い方。
App::uses('Sanitize', 'Utility');
$sanitized_str = Sanitize::escape('サニタイズする文字');
外から入ったデータで更新するなら、SQLインジェクションを狙われるので、サニタイズは必須。
注意点をふまえての実行例
サニタイズして、クォートをつけて、modifiedを自前で更新する。
$status = "'" . Sanitize::escape($input_data) . "'";
$this->foo->updateAll(
array(
'status' => $status,
'modified' => "'" . date('Y-m-d H:i:s') . "'"
),
array( 'age' => 20 )
);