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.
答案 0 :(得分:1)
问题可能在于MySQL方面:tofiles_post_date
列的类型为DATETIME
或TIMESTAMP
而不是字符串。在这种情况下,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 - DATETIME
或TIMESTAMP
是否合适。 (并不是后者不与unix时间戳混淆。)
如果您只想在执行INSERT查询时插入当前时间值,那么您可以直接在查询中使用MYSQL函数NOW()
(具有适当的列类型) - 不需要将日期值从服务器传递到客户端并返回(这也使其容易受到操纵;用户现在可以向您发送文件并假装他们在此之前两周或一年上传它。)