2016-11-30 5 views
0

Ich möchte ein PHP-Skript, das meine ausgewählten Tabellen aus einer Datenbank sichern wird. Von Stack-Überlauf fand ich dies:Mehrere Tabellen sichern von MySQL mit PHP

<?php 
//ENTER THE RELEVANT INFO BELOW 
$mysqlUserName  = "root"; 
$mysqlPassword  = ""; 
$mysqlHostName  = "localhost"; 
$DbName    = "test"; 
$backup_name  = "mybackup.sql"; 
$tables    = "msc_market"; 

//or add 5th parameter(array) of specific tables:  array("mytable1","mytable2","mytable3") for multiple tables 

Export_Database($mysqlHostName,$mysqlUserName,$mysqlPassword,$DbName, $tables=false, $backup_name=false); 

function Export_Database($host,$user,$pass,$name, $tables=false, $backup_name=false) 
{ 
    $mysqli = new mysqli($host,$user,$pass,$name); 
    $mysqli->select_db($name); 
    $mysqli->query("SET NAMES 'utf8'"); 

    $queryTables = $mysqli->query('SHOW TABLES'); 
    while($row = $queryTables->fetch_row()) 
    { 
     $target_tables[] = $row[0]; 
    } 
    if($tables !== false) 
    { 
     $target_tables = array_intersect($target_tables, $tables); 
    } 
    foreach($target_tables as $table) 
    { 
     $result   = $mysqli->query('SELECT * FROM '.$table); 
     $fields_amount = $result->field_count; 
     $rows_num=$mysqli->affected_rows;  
     $res   = $mysqli->query('SHOW CREATE TABLE '.$table); 
     $TableMLine  = $res->fetch_row(); 
     $content  = (!isset($content) ? '' : $content) . "\n\n".$TableMLine[1].";\n\n"; 

     for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) 
     { 
      while($row = $result->fetch_row()) 
      { //when started (and every after 100 command cycle): 
       if ($st_counter%100 == 0 || $st_counter == 0) 
       { 
         $content .= "\nINSERT INTO ".$table." VALUES"; 
       } 
       $content .= "\n("; 
       for($j=0; $j<$fields_amount; $j++) 
       { 
        $row[$j] = str_replace("\n","\\n", addslashes($row[$j])); 
        if (isset($row[$j])) 
        { 
         $content .= '"'.$row[$j].'"' ; 
        } 
        else 
        { 
         $content .= '""'; 
        }  
        if ($j<($fields_amount-1)) 
        { 
          $content.= ','; 
        }  
       } 
       $content .=")"; 
       //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler 
       if ((($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) 
       { 
        $content .= ";"; 
       } 
       else 
       { 
        $content .= ","; 
       } 
       $st_counter=$st_counter+1; 
      } 
     } $content .="\n\n\n"; 
    } 
    //$backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql"; 
    $backup_name = $backup_name ? $backup_name : $name.".sql"; 
    header('Content-Type: application/octet-stream'); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"".$backup_name."\""); 
    echo $content; 
} 
?> 

Jetzt in diesem Code ändere ich den Tabellen $ Wert für eine einzelne Tabelle auswählen oder mehr. Für mehr als eine Tabelle habe ich ein Array mit Tabellennamen angelegt. Aber das Problem ist, dass jedes Mal, wenn ich eine vollständige Sicherung aller Tabellen bekomme, auch wenn ich $ Tabellen Wert jedes Mal ändern, bekomme ich das gleiche Ergebnis. Wie bekomme ich nur eine Sicherung der ausgewählten Tabellen? Bitte hilf mir.

Antwort

0

Wie gesehen, wird der Wert des fünften Parameters in Export_Database() durch false überschrieben, wenn Sie Array von Datenbanktabellen übergeben müssen, da array_intersect() ähnliche Werte nur von Array-Parametern filtern kann. Korrigierte Code unten ...

<?php 
//ENTER THE RELEVANT INFO BELOW 
$mysqlUserName  = "root"; 
$mysqlPassword  = ""; 
$mysqlHostName  = "localhost"; 
$DbName    = "test"; 
$backup_name  = "mybackup.sql"; 
$tables    = array("msc_market", "mytable1","mytable2","mytable3"); 

Export_Database($mysqlHostName,$mysqlUserName,$mysqlPassword,$DbName, $tables, $backup_name); 

function Export_Database($host,$user,$pass,$name, $tables=false, $backup_name=false) 
{ 
    $mysqli = new mysqli($host,$user,$pass,$name); 
    $mysqli->select_db($name); 
    $mysqli->query("SET NAMES 'utf8'"); 

    $queryTables = $mysqli->query('SHOW TABLES'); 
    while($row = $queryTables->fetch_row()) 
    { 
     $target_tables[] = $row[0]; 
    } 
    if($tables !== false) 
    { 
     $target_tables = array_intersect($target_tables, $tables); 
    } 
    foreach($target_tables as $table) 
    { 
     $result   = $mysqli->query('SELECT * FROM '.$table); 
     $fields_amount = $result->field_count; 
     $rows_num=$mysqli->affected_rows;  
     $res   = $mysqli->query('SHOW CREATE TABLE '.$table); 
     $TableMLine  = $res->fetch_row(); 
     $content  = (!isset($content) ? '' : $content) . "\n\n".$TableMLine[1].";\n\n"; 

     for ($i = 0, $st_counter = 0; $i < $fields_amount; $i++, $st_counter=0) 
     { 
      while($row = $result->fetch_row()) 
      { //when started (and every after 100 command cycle): 
       if ($st_counter%100 == 0 || $st_counter == 0) 
       { 
         $content .= "\nINSERT INTO ".$table." VALUES"; 
       } 
       $content .= "\n("; 
       for($j=0; $j<$fields_amount; $j++) 
       { 
        $row[$j] = str_replace("\n","\\n", addslashes($row[$j])); 
        if (isset($row[$j])) 
        { 
         $content .= '"'.$row[$j].'"' ; 
        } 
        else 
        { 
         $content .= '""'; 
        }  
        if ($j<($fields_amount-1)) 
        { 
          $content.= ','; 
        }  
       } 
       $content .=")"; 
       //every after 100 command cycle [or at last line] ....p.s. but should be inserted 1 cycle eariler 
       if ((($st_counter+1)%100==0 && $st_counter!=0) || $st_counter+1==$rows_num) 
       { 
        $content .= ";"; 
       } 
       else 
       { 
        $content .= ","; 
       } 
       $st_counter=$st_counter+1; 
      } 
     } $content .="\n\n\n"; 
    } 
    //$backup_name = $backup_name ? $backup_name : $name."___(".date('H-i-s')."_".date('d-m-Y').")__rand".rand(1,11111111).".sql"; 
    $backup_name = $backup_name ? $backup_name : $name.".sql"; 
    header('Content-Type: application/octet-stream'); 
    header("Content-Transfer-Encoding: Binary"); 
    header("Content-disposition: attachment; filename=\"".$backup_name."\""); 
    echo $content; 
} 
?> 
+0

$ Tabellen wird nicht überschrieben. '$ tables = false' legt nur dann einen Standardparameterwert fest, wenn der Parameter nicht angegeben wird. – LStarky

+0

Nun, ich weiß das, aber irgendwie über Code funktioniert für mich ausgewählte Tabellen aus der Datenbank exportieren .. –

0

Ihr Problem ist, dass die array_intersect die Werte verarbeitet, nicht die Schlüssel. Da diese eindimensionale Arrays sind, müssen Sie die Tasten wie folgt schneiden:

$target_tables = array_values(array_intersect(array_keys($target_tables), array_keys($tables)));

Erläuterung: Grundsätzlich sind Sie zuerst die Arrays in Arrays von Tasten zu ändern, dann kreuzende sie, und dann es zurück in Werte umwandeln.

Verwandte Themen