2011-11-17 273 views
1

在我的网站管理面板中有一个选项可用于备份数据库。为此,我使用下面的代码,但我无法使用此代码下载数据库。有没有人知道这是如何发生的。 我试图回显$return变量和它的输出是正确的,但我不能下载文件为SQL。使用php下载mysql数据库作为sql文件使用php

<?php 

backup_tables('localhost','root','','dbname'); 


/* backup the db OR just a table */ 
function backup_tables($host,$user,$pass,$name,$tables = '*') 
{ 

    $link = mysql_connect($host,$user,$pass); 
    mysql_select_db($name,$link); 

    //get all of the tables 
    if($tables == '*') 
    { 
    $tables = array(); 
    $result = mysql_query('SHOW TABLES'); 

    while($row = mysql_fetch_row($result)) 
    { 
     $tables[] = $row[0]; 

    } 
    } 
    else 
    { 
    $tables = is_array($tables) ? $tables : explode(',',$tables); 
    } 

    //cycle through 
    foreach($tables as $table) 
    { 
    $return=""; 
    $result = mysql_query('SELECT * FROM '.$table); 
    $num_fields = mysql_num_fields($result); 
    //print_r($num_fields);exit; 
    $return.= 'DROP TABLE '.$table.';'; 
    $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table)); 
    $return.= "\n\n".$row2[1].";\n\n"; 

    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] = preg_replace("\n","\\n",$row[$j]); 

      $row[$j] = preg_replace("/(\n){2,}/", "\\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('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+'); 
// print_r($handle);exit; 
    fwrite($handle,$return); 
    fclose($handle); 

} 
?> 
+0

可能重复http://stackoverflow.com/questions/22195493/export- MySQL的数据库,使用的PHP只) –

回答

2

而不是自己创建所有东西你可以使用system()调用,只使用mysql备份功能。这是一个小小的声明,它将在您想要的服务器上创建一个文件。 为了下载文件,请在回显内容之前使用header()设置正确的标头。

0

您正在保存在服务器上的文件,而不是将其发送回浏览器下载的使用mysqldump。您需要发送包含文件内容的标题以供下载。

header("Content-type: application/octet-stream"); 
header('Content-Disposition: attachment; filename=db_dump'); 
echo backup_tables('localhost','root','','dbname'); // change your function to return the data instead saving in a file 

但请记住,这不是制作数据库转储的最佳方法。

0

将整个数据库加载到PHP内存并不意味着我是一个非常明智的备份数据库的方式。

假设您没有CLI访问来运行mysqldump,也不能在别处复制数据库,唯一合理的解决方案是将select语句的输出写入web服务器缓冲区(定期刷新)。

您尝试使用的脚本还包含系统性缺陷。数据写入“返回”变量,但该变量永远不会被函数返回。该变量在处理每个表的开始时被截断。

所有这些问题都是3将通过替换的每个实例解析:

$return.= 

随着

print 

(但不要忘记添加一些刷新)

HTH

2
//save file 
    $handle = fopen('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+'); 
// print_r($handle);exit; 
    fwrite($handle,$return); 
    fclose($handle); 
//add below code to download it as a sql file 
Header('Content-type: application/octet-stream'); 
Header('Content-Disposition: attachment; filename=db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql'); 
echo $return; 
0

所有先前提到的问题(加载到PHP内存和mysqldump的可用性)放在一边,脚本中还有一个错误,它只返回最后一个表的数据。 $return="";需要行被外界和foreach循环之前,它在喜欢的东西:

<?php 

backup_tables('localhost','root','','dbname'); 


/* backup the db OR just a table */ 
function backup_tables($host,$user,$pass,$name,$tables = '*') 
{ 

    $link = mysql_connect($host,$user,$pass); 
    mysql_select_db($name,$link); 
    $return=""; 

    //get all of the tables 
    if($tables == '*') 
    { 
    $tables = array(); 
    $result = mysql_query('SHOW TABLES'); 

    while($row = mysql_fetch_row($result)) 
    { 
     $tables[] = $row[0]; 

    } 
    } 
    else 
    { 
    $tables = is_array($tables) ? $tables : explode(',',$tables); 
    } 

    //cycle through 
    foreach($tables as $table) 
    { 
    $result = mysql_query('SELECT * FROM '.$table); 
    $num_fields = mysql_num_fields($result); 
    //print_r($num_fields);exit; 
    $return.= 'DROP TABLE '.$table.';'; 
    $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table)); 
    $return.= "\n\n".$row2[1].";\n\n"; 

    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] = preg_replace("\n","\\n",$row[$j]); 

      $row[$j] = preg_replace("/(\n){2,}/", "\\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('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+'); 
// print_r($handle);exit; 
    fwrite($handle,$return); 
    fclose($handle); 

} 
?> 
[使用PHP只导出MySQL数据库(的