2012-04-14 4 views
0

J'essaie d'ajouter une fonction personnalisée à l'arrière-plan d'un site sur lequel je travaille.MySql téléchargement de table multiples avec PHP

J'ai une base de données MySql avec plusieurs tables que je voudrais pouvoir télécharger en cliquant sur un lien.

Ce serait aussi génial si les fichiers de sauvegarde pouvaient être tous ajoutés à un fichier zip pour le téléchargement. Donc, en PHP, comment puis-je créer des copies de toutes les tables de la base de données (de préférence au format SQL) et les compresser au format zip?

Je ne suis pas sûr si la méthode MySql "INTO OUTFILE" fonctionnera sur mon compte d'hébergement partagé. La base de données MySQL est sur un serveur différent des fichiers de mon site.

+0

Avez-vous essayé la méthode INTO OUTFILE? Si non, avez-vous accès via PHP à mysqldump sur la ligne de commande? – liquorvicar

Répondre

1

Essayez ce code. Un débogage peut être nécessaire mais vous aurez l'idée.

backup_tables('localhost','username','password','blog'); 


/* 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) 
    { 
     $result = mysql_query('SELECT * FROM '.$table); 
     $num_fields = mysql_num_fields($result); 

     $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] = 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('db-backup-'.time().'-'.(md5(implode(',',$tables))).'.sql','w+'); 
    fwrite($handle,$return); 
    fclose($handle); 
} 

Le code ci-dessus n'utilise pas non plus de code postal pour que vous puissiez utiliser la fonction décrite ci-dessous.

/* creates a compressed zip file */ 
function create_zip($files = array(),$destination = '',$overwrite = false) { 
    //if the zip file already exists and overwrite is false, return false 
    if(file_exists($destination) &amp;&amp; !$overwrite) { return false; } 
    //vars 
    $valid_files = array(); 
    //if files were passed in... 
    if(is_array($files)) { 
     //cycle through each file 
     foreach($files as $file) { 
      //make sure the file exists 
      if(file_exists($file)) { 
       $valid_files[] = $file; 
      } 
     } 
    } 
    //if we have good files... 
    if(count($valid_files)) { 
     //create the archive 
     $zip = new ZipArchive(); 
     if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
      return false; 
     } 
     //add the files 
     foreach($valid_files as $file) { 
      $zip->addFile($file,$file); 
     } 
     //debug 
     //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status; 

     //close the zip -- done! 
     $zip->close(); 

     //check to make sure the file exists 
     return file_exists($destination); 
    } 
    else 
    { 
     return false; 
    } 
} 
+0

Je ne vais peut-être pas tester cela plus tard aujourd'hui, mais je vous ferai savoir comment ça se passe. –

+0

Le premier code que vous avez publié fonctionne, je peux obtenir des copies de mes tables maintenant. Je n'ai pas encore essayé la deuxième partie. –

+0

Les deux parties ont parfaitement fonctionné, merci! –

Questions connexes