MySQL date:0000-00-00 00:00:00

时间:2010-04-22 06:44:55

标签: php mysql

在我的查询中:

       $cselect = mysql_real_escape_string($_POST['cselect']);
       ---------------
       ---------------
       $sql = sprintf("INSERT INTO content
       (id, catID, title, abstract, body, status, published, date, description_meta,   keywords_meta)
        VALUES ('', '%s', '%s','%s','%s','%s','%s','%s','', '' )", $cselect,$chead, $cabst,$ctext, $cp, $cradio,  'TIMESTAMP: Auto NOW()');

日期的输出是:

0000-00-00 00:00:00

我的查询有什么问题?

4 个答案:

答案 0 :(得分:4)

TIMESTAMP: Auto NOW()绝对不是时间戳字符串的正确值,MySQL默默地(除非您检查警告或启用严格模式)将其转换为零时间戳。

您应该使用函数NOW()(不带引号)或更确切地说CURRENT_TIMESTAMP

答案 1 :(得分:2)

不是在查询中指定日期,而是将date列更改为Timestamp类型,然后将其默认值设置为CURRENT_TIMESTAMP

这样你甚至不需要在查询中使用date列,一旦MySQL将为你处理,通过在收到插入查询时插入实际日期。

以下是SQL查询以更改日期列:

ALTER TABLE  `content ` CHANGE  `date`  `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

我希望这会有所帮助。

答案 2 :(得分:1)

您可以使用date('Y-m-d h:i:s')代替'TIMESTAMP:Auto NOW()'来获取当前时间。

答案 3 :(得分:1)

你为什么使用sprintf()?您没有格式化任何值,除了可能强制将事物视为字符串。使用heredoc

,以下非功能版本将更具可读性
$sql = <<<EOL
INSERT INTO content
    (id, catID, title, abstract, body, status, published, date, description_meta, keywords_meta)
VALUES
    ('', '$cselect', '$chead','$cabst','$ctext','$cp','$cradio', NOW(),'', '' );
EOL;

请注意NOW()调用以填写日期字段。这将返回查询执行时的当前日期/时间。

请注意,'date'是MySQL中的保留字,会导致语法错误。你必须将字段名称更改为安全的名称,和/或用反引号(`)将其包围以“转义”它。

同样,请注意,这种构建查询的方法并没有解决这样一个事实,即如果任何此类信息来自不受信任的来源,则您对SQL注入非常开放。