Help us understand the problem. What is going on with this article?

【CakePHP】save()でTIMESTAMP型に現在時刻を保存する時、date()を使わない方が良い理由

More than 3 years have passed since last update.

CakePHPでデータベースに対して insert や update を行う際、PHPのメソッドである date() メソッドは使用しないほうが良い。

代案

CakePHPにおいてDBに現在時刻を保存する場合はDboSource::expression('NOW()')を使うと良い。

理由

2つの表す時刻は次の通りである。

記述 表す時刻
date('Y-m-d H:i:s') PHPサーバ時刻
DboSource::expression('NOW()') DBサーバ時刻
SQLでNOW()を直ガキした場合やCURRENT_TIMESTAMPと記述した場合と同じ。
ConnectionManager::getDataSource('default')->expression('NOW()') DboSource::expression('NOW()')で、Non-static method DboSource::expression() should not be ...と言われるようならこっち。

ということである。
つまりは、前者はDBサーバとのタイムゾーンの整合性が保証されないのに対し、後者はそこが保証されるということ。

MySQLではDEFAULT CURRENT_TIMESTAMP, ON UPDATE CURRENT_TIMESTAMP制約は1テーブルにつき1カラムにしか設定できないなどの制約があり、データ更新時に手動で時刻を与えてやらなければならない場合がある。
この時先の制約を付けたカラムとの時刻整合性を保つためにはDboSource::expression('NOW()')を用いた方が良いということ。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away