CakePHP

 先日、PHPのフレームワーク「CakePHP」で「updateAll」メソッドを使ってデータの更新を行ったら正常に保存されなかったので、その対策を下記に明記しておきます。

 まず、環境ですが、CakePHPはVer.2.6.1で、DBはMySQLのVer.5.5です。

 「updateAll」は複数のデータのあるカラムをまとめて更新することができるメソッドです。詳細はこちらを。

データを保存する — CakePHP Cookbook 2.x ドキュメント

 今回保存しようとしたカラムはdate型のカラムで、そのカラム(カラム名は「birthday」とします)に日付「2015-03-17」を登録しようとしました。CakePHPのプログラムは下記のような感じです。

$birthday = "2015-03-17";
$this->User->updateAll(array('birthday' => $birthday), array('User.id' => array(1,2,3,4,5)));

 見てもらうとわかると思いますが、そんなに変なプログラムじゃないかと思います。

 しかし、これを実行すると該当するデータの「birthday」には「2015-03-17」の日付は入らずに「0000-00-00」と「0」が並んだ日付しか入っていません。

「あれ?」

と、思ってCakePHPが実行したSQLを確認すると

UPDATE `(DB名)`.`users` AS `User` SET `User`.`birthday` = 2015-03-17 WHERE `User`.`id` IN (1,2,3,4,5);

となっています。このSQLを見て、何かおかしいことに気がつきました。そう、日付の「2015-03-17」がクォーテーションで囲まれていないのです。

 さて、どうしたものかと調べてみたっらわかりました。方法としては下記のようにクォーテーションで日付の変数を囲ってやると大丈夫でした。

$birthday = "2015-03-17";
$this->User->updateAll(array('birthday' => "'".$birthday."'"), array('User.id' => array(1,2,3,4,5)));

 ん~、これはバグじゃないのかな~。とりあえずは動くようになって一安心ですε-(´∀`*)ホッ

【参考サイト】
mysql – CakePHP – updateAll fills 0000-00-00 in datefield – Stack Overflow(英語)

CakePHP2 実践入門 (WEB+DB PRESS plus)

著者/訳者:安藤 祐介 岸田 健一郎 新原 雅司 市川 快 渡辺 一宏 鈴木 則夫

出版社:技術評論社( 2012-09-29 )

定価:

Amazon価格:¥ 3,110

単行本(ソフトカバー) ( 416 ページ )

ISBN-10 : 4774153249

ISBN-13 : 9784774153247