0

タイムスタンプ型の列 last_login を持つユーザー テーブルがあります。構造:

CREATE TABLE IF NOT EXISTS `User` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(80) NOT NULL,
  `username` varchar(80) NOT NULL,
  `password` varchar(80) NOT NULL,
  `facebook_login` varchar(3) NOT NULL DEFAULT 'no',
  `facebook_id` varchar(50) NOT NULL,
  `last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;

ユーザーが現在のタイムスタンプでログインしたときに更新したい。そうです:

 $sql = "Update User set last_login = ".time()."
         Where id = :id";

 $stmt = $db->prepare($sql);  
 $stmt->bindParam("id", $user->id);
 $stmt->execute();

mysql ログ ファイルで、このクエリが実行されていることがわかります。

 Update User set last_login = 1381949425 Where id = '1'

しかし、どういうわけか、「影響を受ける行はありません」と表示されます。これはどのように可能ですか?テーブルには 1 の ID を持つユーザーがいます...

4

1 に答える 1

3

私は PHP (?) の人ではなく、MySQL の人ですが、そのクエリが MySQL 側で引き起こすべきことは次のとおりです。

ERROR 1292 (22007): Incorrect datetime value: '1381949425' for column 'last_login' at row 1

タイムスタンプ列はエポック秒で値を保存しますが、整数ではなく日時リテラルを想定しています。

$sql = "Update User set last_login = FROM_UNIXTIME(".time().")
     Where id = :id";

...また...

$sql = "Update User set last_login = NOW() Where id = :id";

アプリケーションで time() 関数を使用する理由がない限りNOW()、MySQL の関数は同じことを行います。

于 2013-10-16T19:57:20.933 に答える