1. hashimotoryoh

    Posted

    hashimotoryoh
Changes in title
+【CakePHP】save()でTIMESTAMP型に現在時刻を保存する時、date()を使わない方が良い理由
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,18 @@
+CakePHPでデータベースに対して insert や update を行う際、PHPのメソッドである date() メソッドは使用しないほうが良い。
+
+# 代案
+CakePHPにおいてDBに現在時刻を保存する場合は```DboSource::expression('NOW()')```を使うと良い。
+
+# 理由
+2つの表す時刻は次の通りである。
+
+|記述|表す時刻|
+|:---|:---|
+|```date('Y-m-d H:i:s')```|PHPサーバ時刻|
+|```DboSource::expression('NOW()')```|DBサーバ時刻<br>SQLで```NOW()```を直ガキした場合や```CURRENT_TIMESTAMP```と記述した場合と同じ。|
+
+ということである。
+つまりは、前者はDBサーバとのタイムゾーンの整合性が保証されないのに対し、後者はそこが保証されるということ。
+
+MySQLでは```DEFAULT CURRENT_TIMESTAMP```, ```ON UPDATE CURRENT_TIMESTAMP```制約は1テーブルにつき1カラムにしか設定できないなどの制約があり、データ更新時に手動で時刻を与えてやらなければならない場合がある。
+この時先の制約を付けたカラムとの時刻整合性を保つためには```DboSource::expression('NOW()')```を用いた方が良いということ。