通过 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.000000
到 2038-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 识别这些格式的 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
TIMESTAMP
type 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()));
如何在 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.000000
到 2038-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 识别这些格式的 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
TIMESTAMP
type 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()));