php备份备份数据如何防止把timestamp转化为空字符串 ## 背景  上午在写备份库这个功能的时候,发现在生成备份文件的时候把mysql timestamp类型未写入的都转化为0000-00-00 00:00:00这种格式,这样导致的后果是数据库有个字段delete_time(删除标志,为NULL表示数据生效,不为NULL表示数据已被删除)都被写入了0000-00-00 00:00:00,直接导致所有数据都强制删除了。一想,这种小bug,只要找到转化的语句,用替换函数替换下就ok了 ## 实现 找到转化语句 ```php //备份数据记录 $result = $db->query("SELECT * FROM `{$table}` LIMIT {$start}, 1000"); foreach ($result as $row) { $row = array_map('addslashes', $row); $sql = "INSERT INTO `{$table}` VALUES ('" . str_replace(array("\r", "\n"), array('\\r', '\\n'), implode("', '", $row)) . "');\n"; if (false === $this->write($sql)) { return false; } } //还有更多数据 if ($count > $start + 1000) { //return array($start + 1000, $count); return $this->backup($table, $start + 1000); } ``` 打印出$row和$sql ```php Array ( [id] => 1 [version] => 1.0.0 [title] => 更新提示: [desc] => 1、优化bug|2、新增游戏模块 [url] => http://google.com [before_version] => 1.0.0 [type] => 1 [status] => 0 [create_time] => 2018-01-06 11:29:39 [update_time] => [delete_time] => ) INSERT INTO `cc_app_version` VALUES ('1', '1.0.0', '更新提示:', '1、优化bug|2、新增游戏模块', 'http://google.com', '1.0.0', '1', '0', '2018-01-06 11:29:39', '', ''); ``` 发现delete_time是空的,但是在sql导入的时候会把''转化为0000-00-00 00:00:00,所以需要在tampstamp类型的时候判断下,如果是时间戳,那么把''转为NULL 最后实现: ```php $result = $db->query("SELECT * FROM `{$table}` LIMIT {$start}, 1000"); foreach ($result as $row) { $row = array_map('addslashes', $row); foreach ($row as $key=>$val){ if(in_array($key, array('create_time','update_time','delete_time'))){ if(empty($val)){ $row[$key] = "__NULL_TIME__"; } } } $sql = "INSERT INTO `{$table}` VALUES ('" . str_replace(array("\r", "\n"), array('\\r', '\\n'), implode("', '", $row)) . "');\n"; $sql = str_replace("'__NULL_TIME__'","NULL",$sql); if (false === $this->write($sql)) { return false; } } ```