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(英語)

アマゾンのサーバでエラーが起こっているかもしれません。
一度ページを再読み込みしてみてください。