表格备份以CSV或SQL格式不完整

时间:2009-06-29 07:43:41

标签: php mysql backup

我有那个脚本以sql格式下载我表的所有内容并保存本地副本。我的问题是我的表格内容非常庞大,实际数据大约为50MB,而我的脚本生成的数据只有3.5MB。我的剧本出了什么问题?为什么所有数据都不是用sql文件写的?

$table = "Downloads";

$result = $db->query('SELECT * FROM '.$table);
$num_fields = $db->num_fields($result);

for ($i = 0; $i < $num_fields; $i++) 
{
    while($row = mysql_fetch_row($result))
    {
        $return.= 'INSERT INTO '.$table.' VALUES(';
        for($j=0; $j<$num_fields; $j++) 
        {   
            $row[$j] = addslashes($row[$j]);
            $row[$j] = ereg_replace("\n","\\n",$row[$j]);
            if (isset($row[$j])) { $return.= '"'.$row[$j].'"' ; } else { $return.= '""'; }
            if ($j<($num_fields-1)) { $return.= ','; }
        }
        $return.= ");\n";
    }
}
$return.="\n\n\n";

//save file
$handle = fopen(UPLOAD_XML_PATH_ABSOLUTE.'downloads_backup'.'.sql','w+');
if(fwrite($handle,$return)){
    fclose($handle);
    //$ret = true;
} else {
    //$ret = false;
}

2 个答案:

答案 0 :(得分:0)

不确定我是否理解正确,但是一个小注意事项:为什么首先将所有这些值存储在变量中而不是直接将它们写入文件?对我没有任何意义,因为你只能填满你的可用记忆。

<强>更新

还有一些注意事项:也许应该使用mysql_real_escape_string(),为什么要重复所有这些INSERTS?一个INSERT后跟many(),();应该够了。如何区分代码中的整数,字符串,布尔值和NULL?如果您稍后尝试使用sql文件,这可能会导致问题。

答案 1 :(得分:0)

Filesize可能不是确定脚本是否正常工作的最佳方法。你检查过脚本产生的数据了吗?

  1. 使用保存的sql文件进行创建 表的临时副本你 正试图出口。
  2. 在此临时表上运行您的脚本。
  3. 使用WinMerge等实用程序查看 如果两个文件相同或 不
  4. 它不是非常优雅,但它很快,不需要任何昂贵的工具,如果WinMerge确实拾取了两者之间的任何差异,那么这也应该表明问题所在。