Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSV或SQL格式的表备份不完整_Php_Mysql_Backup - Fatal编程技术网

Php CSV或SQL格式的表备份不完整

Php CSV或SQL格式的表备份不完整,php,mysql,backup,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

我有一个脚本,它以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;
}
$table=“下载”;
$result=$db->query('SELECT*FROM'.$table);
$num\u fields=$db->num\u fields($result);
对于($i=0;$i<$num_字段;$i++)
{
while($row=mysql\u fetch\u row($result))
{
$return.='INSERT INTO'.$table.'值(';

对于($j=0;$j我不确定我是否理解正确,但有一点需要注意:为什么您首先将所有这些值存储在一个变量中,而不是直接将它们写入文件?这对我来说没有任何意义,因为您只会填满可用的内存

更新


还有几个注意事项:也许应该使用mysql\u real\u escape\u string(),为什么要重复所有这些插入?一个插入后面跟着许多(),();应该足够了。如何在代码中区分整数、字符串、布尔值和NULL?如果以后尝试使用sql文件,可能会导致问题。

文件大小可能不是确定脚本是否正常工作的最佳方法。是否检查了脚本生成的数据

  • 使用保存的sql文件创建 你要的那张桌子的临时副本 他们正试图出口
  • 在此临时表上运行脚本
  • 使用诸如“查看”之类的实用程序 如果两个文件相同或相同 不是

  • 它不是非常优雅,但它很快,不需要任何昂贵的工具,如果WinMerge确实发现了两者之间的任何差异,这也应该指出问题所在。

    这里似乎缺少一个问题,因此上面的脚本填满了内存,这就是为什么保存的内容不完整的原因。而且我没有使用“差异”数据类型的分类。不一定,在您的特定情况下,可能不一定。但是,如果您将内存限制设置为64MB,并且内存中已经有50MB的字符串,则肯定会变得很紧。另一个可能存在问题的是时间。您是否检查了脚本是否有足够的时间完成,并且没有任何超时?y您是否有任何错误?是否执行了fwrite之后的任何操作?fwrite写入了多少字节(返回值)?关于数据类型的问题只是一个建议…那么我如何减少内存使用?我计算了内存使用量,大约46000条记录的30 MB返回值中大约有50 MB。仍在解决这个问题?嗯。正如开始时建议的那样,而不是将值存储在变量“$return”中只需使用fwrite/echo直接输出所有内容即可。例如:fwrite($handle,“.”.$row[$j].“.”);…确保在开始时相应地设置了文件句柄操作!是的,仍在进行此操作。实际上,我更改了代码,因为源表中的字段与目标表中的字段不同。我所做的只是获取需要的字段,并添加一些值以匹配新的插入。还有,知道如何插入自动增量吗值?是的,我检查了数据,它只是实际内容的1/8。