LoginSignup
16
14

More than 5 years have passed since last update.

【CakePHP】updateAll

Last updated at Posted at 2014-02-07

基本形

基本
$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 )
);
16
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
14