【问题标题】:Why my getTimestamp() method doesn't work properly in php?为什么我的 getTimestamp() 方法在 php 中不能正常工作?
【发布时间】:2016-01-30 06:58:09
【问题描述】:

我有一个列类型的表:时间戳。 存储在那里的数据如下所示:

我想做一个简单的选择,看看在给定的开始日期和结束日期之间是否有一个日期。

这是我目前所做的:

$starttime = $_POST['starttime'];
$duration = 15;//$_POST['duration'];

$converted_date = DateTime::createFromFormat('Y-d-m H:i:s', $_POST['starttime']); // POST
$begin_timestamp = $converted_date->getTimestamp();

$quickReact = "SELECT start_time FROM commercial WHERE
 UNIX_TIMESTAMP(start_time) >= '$begin_timestamp' AND
 UNIX_TIMESTAMP(start_time) <('$begin_timestamp'+'$duration')";

值得一提的是,starttime 是:2015-10-30 16:14:44。 现在,即使我的数据库中的结果应该适合我的查询 - 我看不到它们,因为 UNIX_TIMESTAMP(start_time) 不知何故带来了不正确的值并错误地解析了数据。

我的 php 代码中的这部分不能正常工作:

$converted_date = DateTime::createFromFormat('Y-d-m H:i:s', $_POST['starttime']); // POST
$begin_timestamp = $converted_date->getTimestamp();

因为从2015-10-30 16:14:44 作为参数给出,它返回时间戳:1497111284,它指向 2017 年的某个日期... 我该如何解决?

【问题讨论】:

  • 你知道你可以在不转换为时间戳的情况下做到这一点吗?或者这是出于其他原因的要求?
  • 不是!你能帮我节省一些时间吗?
  • 看看你在比较什么
  • 请看下面的答案,如果有什么不明白的地方请告诉我!

标签: php mysql


【解决方案1】:

跳过转换:

$starttime = $mysqli->escape_string($_POST['starttime']);
$duration = 15;//$_POST['duration'];

$query = "SELECT start_time FROM commercial WHERE start_time >= '$starttime' AND start_time < '$begin_timestamp'+ INTERVAL $duration SECOND";

当然,您绝不应该将用户提供的数据注入到 SQL 查询中。这只是一个概念证明。

【讨论】:

  • 我在您的代码中添加了转义。随意回滚。将其包含在答案的代码中只会有助于深入了解它,而不是仅仅说 IMO。
  • 没错,虽然我也不建议这样做!准备好的查询是要走的路。
【解决方案2】:

没关系。

MySQL 中的时间戳通过给它们提供字符串值来进行比较,并且 MySQL 有内置函数来帮助。

SELECT start_time FORM commercial
WHERE start_time BETWEEN ? AND DATE_ADD(?, INTERVAL ? SECOND)

这三个参数是两次$begin_timestamp,第三次是$duration(是的,使用参数!它们的存在是有充分理由的!)

我假设您的 15 以秒为单位。如果没有,只需将SECOND 更改为您想要的任何单位。

【讨论】:

    猜你喜欢
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多