Incorrect Date/Time Formatting when inserting to mysql database

时间:2015-05-18 18:03:10

标签: php mysql

I have a php form that once submitted is supposed to insert at date and time for which the form was submitted. The format I'm looking for is: May 13, 2015, 4:30 pm But instead I'm getting: 1969-12-31 19:00:05. Obviously, with the date retrieved from the record there is a formatting error (Dec. 31, 1969).

On the php submission form the hidden field code is:

<input type="hidden" name="tofiles_post_date" value="<?php echo date('m/d/Y F j, Y, g:i a', time()); ?>">

On the php confirmation page where the date is inserted into the mysql database is:

$title = mysql_real_escape_string($_POST['tofiles_title']);
$body = mysql_real_escape_string($_POST['tofiles_body']);
$link = "http://example.com/uploads/" . mysql_real_escape_string($_POST['tofiles_link']);
$relation = mysql_real_escape_string($_POST['tofiles_relation']);
$type = mysql_real_escape_string($_POST['tofiles_type']);
$date = mysql_real_escape_string($_POST['tofiles_post_date']);
$ip = $_SERVER['REMOTE_ADDR'];
$post_user = $_SESSION['user_id'];

$sql = "INSERT INTO site_tofiles (tofiles_title, tofiles_body, tofiles_link, tofiles_relation, tofiles_type,  tofiles_post_date, tofiles_post_ip, tofiles_post_user) VALUES ";
$sql .= "('$title', '$body', '$link', '$relation', '$type', '$date', '$ip', '$user_id');";
mysql_query($sql);

Obviously, I'm missing something here.

2 个答案:

答案 0 :(得分:1)

问题可能在于MySQL方面:tofiles_post_date列的类型为DATETIMETIMESTAMP而不是字符串。在这种情况下,MySQL期望数据采用YYYY-MM-DD HH:MM:SS格式(文档:https://dev.mysql.com/doc/refman/4.1/en/datetime.html)。因此,要将日期和时间插入列中,您也必须使用该格式。如果您希望以您编写的方式对其进行格式化,那么在从数据库中检索日期之后,应该在输出上对其进行格式化。

如果查看数据库,您可能会发现该列中的数据(当您插入日期时)是0000-00-00 00:00:00,这是当MySQL无法理解您的日期时所插入的数据。或者至少这是我的怀疑,因为1969-12-31 19:00:05怀疑地接近UNIX纪元并且与时区相关的偏移。

答案 1 :(得分:0)

您通过隐藏的表单字段传递了05/13/2015 May 13, 2015, 4:30 pm表单的日期,我没有看到您将其转换为其他任何地方 - 但在您说的更进一步的评论中,您的“日期”列属于INT类型...现在该如何理解?

现在,如果让05/13/2015 May 13, 2015, 4:30 pm自动转换为整数(这将发生,因为这是列的数据类型),结果将只是5,因为在05之后,这些字符不能再被解释为数字。

由于您似乎再次将该值解释为unix时间戳,因此从unix时期开始只有五秒,从1970-01-01开始。在混合中添加一个本地时区,1969-12-31 19:00:05似乎完全符合逻辑 - 在1970-01-01午夜后5秒,在时区落后5小时后进行解释。

如果要将unix时间戳作为整数值插入数据库,那么您还应该通过隐藏的表单字段传递整数 - 只需传递time()的结果,没有格式化它。

但是你应该使用适当的MySQL数据类型而不仅仅是整数。查看http://dev.mysql.com/doc/refman/5.5/en/datetime.html - DATETIMETIMESTAMP是否合适。 (并不是后者与unix时间戳混淆。)

如果您只想在执行INSERT查询时插入当前时间值,那么您可以直接在查询中使用MYSQL函数NOW()(具有适当的列类型) - 不需要将日期值从服务器传递到客户端并返回(这也使其容易受到操纵;用户现在可以向您发送文件并假装他们在此之前两周或一年上传它。)