2011-11-17 3 views
1

내 웹 사이트 관리자 패널에 데이터베이스 백업 옵션이 있습니다. 그것을 위해 아래 코드를 사용하지만이 코드를 사용하여 db를 다운로드 할 수 없습니다. 어떤 일이 일어 났는지 알았습니까? $return 변수를 반향시키고 그 출력이 정확했지만 SQL으로 파일을 다운로드 할 수 없습니다.PHP를 사용하여 MySQL 데이터베이스를 SQL 파일로 다운로드

<?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

가능한 중복 ([수출 MySQL 데이터베이스 PHP 만 사용] http://stackoverflow.com/questions/22195493/export- mysql-database-using-php-only) –

답변

2

대신 system() 호출을 사용하고 mysql 백업 기능을 사용할 수 있습니다. 이것은 원하는 서버에서 파일을 생성하는 작은 문장입니다. 그리고 파일을 다운로드하려면 내용을 반향하기 전에 header()로 올바른 헤더를 설정하십시오.

1

당신은 바퀴를 재발 명하고 있습니다! 행복한 경우이 코드는 테이블에 대한 삽입 스크립트를 생성 할 수 있지만 실패 할 경우 많은 특별한 경우가있을 것입니다!

당신은 다운로드 다시 브라우저로 보내는 대신 서버에 파일을 저장하고 http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

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 메모리에로드해도 데이터베이스를 백업하는 데 매우 합리적인 방법이 아닙니다.

mysqldump를 실행할 수있는 CLI 액세스 권한이 없거나 데이터베이스를 다른 곳에서 복제 할 수 있다고 가정 할 때 유일하게 적절한 해결 방법은 select 문 출력을 웹 서버 버퍼에 쓰는 것입니다 (정기적으로 플러시).

사용하려는 스크립트에도 시스템 결함이 있습니다. 데이터는 'return'변수에 기록되지만이 변수는 함수에 의해 반환되지 않습니다. 변수는 각 테이블 처리 시작 부분에서 잘립니다.

이러한 모든 문제 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); 

} 
?> 
관련 문제