能确定的是php与linux版本都是64位,thinkphp为5版本
其次
在thinkphp中直接strtotime一个“2038-05-01 01:02:03”的时间戳可以正确的输出int型时间戳,也可使用date将时间戳转回为string时间
在mysql中,直接使用sql语句,可以更新超过2038年的int型,
问题来了
在tp中,将此时间戳存入数据库过程中,本地环境不报错,但是只要超过2038年1月19日的时间戳,数据库里直接为0。而如果把这句sql使用fetchSql转为语句,然后将语句复制到sqlyog等数据库管理工具里,可以成功执行,或者说直接使用Db::execute($sqlStr);这样也是能更新数据没有问题
经过各种尝试,不管model还是db还是Db,只要是连贯操作就不行,只能使用Db执行原生sql,就可以。
我该如何解决这个问题呢?
贴出代码
$str = '2038-05-01 01:02:03';
$time = strtotime($str);
$res = db('UserAddress')->where('id',13987)->setField('id_card_validity',$time);以上代码执行后,$res=0; 该字段为int 无符号10位,字段值为0使用fetchSql(true)后打印出来的sql语句
“UPDATE `zy_user_address` SET `id_card_validity`=2156259723 WHERE `id` = 13987”
复制到sqlyog等数据库管理软件里执行没有问题
或者
$res = db('UserAddress')->where('id',13987)->fetchSql(true)->setField('id_card_validity',$time);
Db::execute($res);执行 也是没有问题的【解决方案】
因为int类型最大值为2147483647 转换为日期是:2038/1/19 11:14:7
所以以超过这个日期转为int时间戳的,int为变量写入数据库,在某一步会校验超过了int的范围,于是我在int时间戳写入库之前用strval转为字符,则写入成功。
最佳答案