通过 PDO 将 time() 保存为 MySQL 中的 INTEGER 时间戳,因为 phpMyAdmin 说 `timestamp` 是数字

Save time() as INTEGER timestamp in MySQL via PDO as phpMyAdmin says `timestamp` is number

如何在 PHP 中通过 PDO 将 timestamp 作为 integer 号码发送到 MySQL? 我不喜欢将时间作为字符串发送,我想将它们作为纯 integer(作为 UNIX TIME)发送。

这是我的代码,但它保存了零时间戳:

$sql = 'REPLACE INTO table_name (id,sent_timestamp) VALUES (:id,:sent_timestamp);';
$stmt =   $pdo->prepare($sql);

$stmt->bindValue(':id',$id,PDO::PARAM_INT);
$stmt->bindValue(':sent_timestamp',time(),PDO::PARAM_INT); // I define this column in phpMyadmin as TIMESTAMP type.

$stmt->execute();

id 是唯一的,sql 查询有效,但 timestamp 保存为零。 我还用 123456 之类的任意数字替换了 time() 但它在数据库中也保存为零。

更新: 由于更多 research 并感谢 @Hanky Panky , 这有点令人困惑:为什么 phpMyadmin 说它存储 timestamp 作为秒数,但我们不能将 timestamp 作为 integer 发送。 是否有任何我们无法以整数形式发送的对此项目的引用?

MySQL 中的一个 TIMESTAMP 是格式为 YYYY-MM-DD HH:MM:SS[.fraction] 的字符串。 可选的小数部分允许将值存储到微秒的精度。 TIMESTAMP 值的允许范围是 1970-01-01 00:00:01.0000002038-01-19 03:14:07.999999

在您的查询中,您试图将整数值存储到 TIMESTAMP 字段中。为了使其正常工作,您必须发送有效的 TIMESTAMP 值:

$date = new Datetime('now');
$stmt->bindValue(':sent_timestamp', $date->format('Y-m-d H:i:s'), PDO::PARAM_STRING);

phpmyadmin 试图解释的是,TIMESTAMP 值内部 存储为整数。但对我们来说重要的是,PHP 程序员,TIMESTAMP 值被视为字符串,如上所述。

请记住 MySQL 的权威来源是 the MySQL manual,而不是 phpmyadmin 给出的解释。

使用FROM_UNIXTIME()

查看答案

saving-timestamp-in-mysql-table-using-php

希望这能解决您的问题。谢谢

特别感谢发送答案的人,但不幸的是,没有人是我问题的答案。 希望经过几个小时的搜索我找到了答案:

我们可以将 TIMESTAMP 作为整数发送。我们可以以 YYYYMMDDHHMMSS 格式和其他格式发送它。无效时间解释为 ZEOR。 所以这段代码可以完美运行:

$stmt->bindValue(':sent_timestamp',20160709120000,PDO::PARAM_INT); //2016-07-09-12:00:00

MySQL Refernce says:

MySQL 识别这些格式的 DATETIME 和 TIMESTAMP 值:

作为 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,前提是该数字作为日期有意义。例如,19830905132800 和 830905132800 被解释为 '1983-09-05 13:28:00'.

so due to this documentation it is IMPOSSIBLE to send unix-time type integers-for example 14973898 (seconds after 1970-01-01-00-00) to TIMESTAMPtype fields BUT it is POSSIBLE to send integers in YYYYMMDDHHMMSS and YYMMDDHHMMSS formats ( like 20160709120000 that represents 2016-07-09-12:00:00)

UPDATED: 我的数字错误,应该是14位,我错写了12位。

Mysql timestamp requires the stamp format to be 'Y-m-d H:i:s'.

自从您告诉 PDO 将其存储为 INT 后,您可能会得到 0000。从 bindValue 语句

中删除 PDO::PARAM_INT

因此,您可以像这样将 time() 存储为时间戳:

$stmt->bindValue(':sent_timestamp',date("Y-m-d H:i:s", time()));