[英]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.