PHP strtotime将false保存为MySQL负整数

3
我正在进行数据迁移,其中的日期显示为“0000-00-00 00:00:00”,通过strtotime()函数转换后返回false,并且在新表格的INT数据类型列中保存为-2147483648。无论我将默认值设置为0或NULL,它仍会保存为负数。我不想为每个日期字段编写异常处理程序(也没有更改数据类型的选项),因此是否有一种简单的方法可以在PHP(使用一行代码)或MySQL中设置这些“空”日期的默认值?

让我编辑您的问题。 - doniyor
3个回答

2

没有代码很难回答,但您可以考虑使用三元运算符

例如:

$variable_to_write_to_db = ($field == 0 || $field == NULL ? writeDefaultsToDB() : writeToDB($field))

或者类似这样。

三元运算符的工作方式如下(从上面的链接中复制):

/* most basic usage */
$var = 5;
$var_is_greater_than_two = ($var > 2 ? true : false); // returns true

祝你好运,玩得开心


1

时间0000-00-00超出了strtotime的范围,该范围由1901年12月13日到2038年01月19日限定。它会返回您损坏数据的下限。这对于几乎所有基于UNIX的time_t函数都是常见的。

我的建议是在处理之前用NULL替换这些日期。它们是无效的。


我发现strtotime()在那些日期上实际上返回了一个负数(即使在调试时没有输出任何内容),所以我现在将它们设置为0。 - Davicus

0
你是否正在寻找列的默认值,而没有将日期传递给它(即,如果未提供值,则将所有日期设置为某个值)?
如果是这样,如果您希望默认值为0(我不确定您是否希望如此,如果日期无意义最好允许为空),则应该可以使用以下代码:
ALTER TABLE YourTable MODIFY YourColumn Default '0';

然后,请确保在使用失败的strtotime结果调用数据库时不要传递任何内容(或者可以传递null)。请注意,strtotime将不会为1901年12月13日20:45:54 UTC之前的日期返回有效结果,因此您的0000-00-00将在此情况下正确地失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接