PHP SQL每9个月输入一次null

时间:2017-10-17 18:30:01

标签: php sql

有一个sql错误2018-9-31进入数据库的数据库不太确定为什么我只在那个日期得到所有0' s。任何帮助都非常感激,它发生在每个第3季度插入。

INSERT INTO leagues(start,Name,type,end,cashstock) VALUES( '2018-4-1', 'Quarter 2 2018', 'public', '2018-6-30', '7500' )
INSERT INTO leagues(start,Name,type,end,cashstock) VALUES( '2018-7-1', 'Quarter 3 2018', 'public', '2018-9-31', '7500' )

返回

Edit Edit
 Copy Copy
 Delete Delete
2018-04-01
Quarter 2 2018
3
public
2018-06-30
7500

Edit Edit
 Copy Copy
 Delete Delete
2018-07-01
Quarter 3 2018
4
public
0000-00-00
7500

2 个答案:

答案 0 :(得分:2)

9月只有30天。因此2018-9-31是无效日期,因此会插入默认0000-00-00

我建议不要遗漏这个并且要么在你的应用程序中检查有效日期,要么让MySQL通过enabling strict mode处理它:

  

如果启用了严格模式,则不允许使用'0000-00-00'并且插入会产生错误,除非同时给出了IGNORE。对于INSERT IGNORE和UPDATE IGNORE,允许使用'0000-00-00'并且插入会产生警告。

或者您也可以使用NO_ZERO_DATE

  

NO_ZERO_DATE模式会影响服务器是否允许'0000-00-00'作为有效日期。它的效果还取决于是否启用了严格的SQL模式。

答案 1 :(得分:0)

你还没有说过你正在使用MySQL,但我打赌如此:这是一个MySQL Gotcha。除非你告诉MySQL严格,并做了相当多的设置,否则即使不应该,MySQL也会默默地“工作”。你遇到过这样的情况。

在这种情况下,9月只有30天,所以9月31日是不正确的日期。 MySQL已将无效数据输入您的数据库,而不是失败。为了防止这种情况发生,或者更快地看到错误,建议使用InnoDB( MyISAM)和enabling strict mode

如果你是从命令行运行它,界面会显示一个警告计数,之后你会执行'显示警告'来查看它们。

此外,来自the documentation

  

MySQL允许为指定为字符串的值使用“宽松”格式,其中任何标点字符都可以用作日期部分或时间部分之间的分隔符。在某些情况下,这种语法可能是欺骗性的。例如,“10:11:12”之类的值可能看起来像时间值,因为:,但如果在日期上下文中使用,则会被解释为年份“2010-11-12”。值'10:45:15'被转换为'0000-00-00',因为'45'不是有效月份。