2009-06-29 47 views
0

我有那个脚本以sql格式下载我表格的所有内容并保存本地副本。我的问题是我的表格内容非常庞大,实际数据大约为50MB,我的脚本生成的数据只有3.5MB。我的脚本有什么问题?为什么所有的数据都没有写入sql文件?以CSV或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; 
} 
+0

似乎是一个缺少的问题 – 2009-06-29 07:48:31

回答

0

不知道如果我理解正确,但一个小记:为什么你在存储摆在首位的变量所有这些值,而不只是他们直接写入到文件?对我来说没有任何意义,因为你只能获得可用的内存。

更新

一对夫妇更注意事项:也许mysql_real_escape_string()应该使用,为什么重复所有的INSERT语句中?一个INSERT后面跟着很多(),();应该够了。你怎么区分你的代码中的整数,字符串,布尔值和NULL?如果您稍后尝试使用您的sql文件,这可能会导致问题。

+0

所以上面的脚本填满了内存,这就是为什么内容被保存不完整?而且我也没有使用数据类型的差异化。 – text 2009-06-29 08:16:30

+0

不一定,在你的特定情况下,可能不是。但是,如果你将你的内存限制设置为64MB,并且已经在内存中保存了一个50MB的字符串,那肯定会变得很紧。另一件可能成为问题的事情是时间。你有没有检查你的脚本有足够的时间完成并没有得到任何超时?你有没有得到任何错误?执行fwrite之后有什么? fwrite(返回值)写入了多少字节?数据类型的东西只是一个建议... – merkuro 2009-06-29 08:53:23

0

文件大小可能不是确定脚本是否正常工作的最佳方式。你检查过脚本产生的数据吗?

  1. 使用保存的SQL文件来创建 你 试图导出表的一个临时副本。
  2. 在此临时表上运行您的脚本。
  3. 如果两个文件完全相同,或者不是 ,请使用WinMerge等实用程序来查看 。

它不是非常优雅,但它很快速,不需要任何昂贵的工具,如果WinMerge确实吸取了两者之间的任何差异,那也应该表明问题出在哪里。