繁体   English   中英

MySQL 日期:0000-00-00 00:00:00

[英]MySQL date: 0000-00-00 00:00:00

在我的查询中:

       $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

我的查询有什么问题?

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

您应该使用NOW()函数(不带引号)或CURRENT_TIMESTAMP代替。

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

这样你甚至不需要在你的查询中打扰date列,一旦 MySQL 会为你处理它,通过在它收到你的插入查询时插入 UTC 中的实际日期。

这是更改日期列的 SQL 查询:

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

我希望这有帮助。

您可以使用date('Ymd h:i:s')而不是 'TIMESTAMP: Auto NOW()' 来获取当前时间。

您为此使用 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 注入持开放态度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM