Dump (sauvegarde) avec PHP d'une base de donnée MySQL

  Information

Avec ce script vous pouvez faire un dump (une sauvegarde) facilement de votre base de donnée.

Pour le faire il vous suffit de renseigner les paramètres SQL, ensuite de créer un fichier "sauvegarde.sql" au meme niveau que votre script php et ensuite de paramétrer la fonction dump_MySQL.

  • En mettant 1 dans la fonction dump_MySQL vous aurez uniquement les tables
  • En mettant 2 vous aurez les tables et les champs.

  Voir en MySQLi un code identique : Sauvegarde complète d'une base de données MySQL

A savoir

Ces fonctions sont utilisées dans ce code source:
mysql_close()   mysql_connect()   mysql_fetch_array()   mysql_field_type()   mysql_num_fields()   mysql_query()   mysql_select_db()   

Ces extensions étaient obsolètes en PHP 5.5.0, et ont été supprimées en PHP 7.0.0. À la place, vous pouvez utiliser l'extension MySQLi ou l'extension PDO_MySQL. Voir aussi MySQL : choisir une API du guide et ces entrées de la FAQ pour plus d'informations. Alternatives à cette fonction : mysqli_connect() et PDO::__construct()

  code source classé dans  MySQL

 
 01    
 02    
 03    
 04    
 05    
 06    
 07    
 08    
 09    
 10    
 11    
 12    
 13    
 14    
 15    
 16    
 17    
 18    
 19    
 20    
 21    
 22    
 23    
 24    
 25    
 26    
 27    
 28    
 29    
 30    
 31    
 32    
 33    
 34    
 35    
 36    
 37    
 38    
 39    
 40    
 41    
 42    
 43    
 44    
 45    
 46    
 47    
 48    
 49    
 50    
 51    
 52    
 53    
 54    
 55    
 56    
 57    
 58    
 59    
 60    
 61    
 62    
 63    
 64    
 65    
 66    
 67    
 68    
 69    
 70    
 71    
 72    
 73    
 74    
 75    
 76    
 77    
 78    
 79    
 80    
 81    
 82    
                               
<?php
/*---------------------------------------------------------------*/
/*
    Titre : Dump (sauvegarde) avec PHP d'une base de donnée MySQL                                                        
                                                                                                                          
    URL   : https://phpsources.net/code_s.php?id=612
    Auteur           : miragoo                                                                                            
    Date édition     : 28 Oct 2010                                                                                        
    Date mise à jour : 13 Sept 2019                                                                                      
    Rapport de la maj:                                                                                                    
    - fonctionnement du code vérifié                                                                                    
*/
/*---------------------------------------------------------------*/

    function dump_MySQL($serveur$login$password$base$mode)
    {
    $connexion mysql_connect($serveur$login$password);
    mysql_select_db($base$connexion);
    
    $entete  "-- ----------------------\n";
    $entete .= "-- dump de la base ".$base." au ".date("d-M-Y")."\n";
    $entete .= "-- ----------------------\n\n\n";
    $creations "";
    $insertions "\n\n";
    
    $listeTables mysql_query("show tables"$connexion);
    while($table mysql_fetch_array($listeTables))
    {
        // structure ou la totalité de la BDD
        if($mode == || $mode == 2)
        {
            $creations .= "-- -----------------------------\n";
            $creations .= "-- Structure de la table ".$table[0]."\n";
            $creations .= "-- -----------------------------\n";
            $listeCreationsTables mysql_query("show create table ".$table[0], 
$connexion);
            while($creationTable mysql_fetch_array($listeCreationsTables))
            {
              $creations .= $creationTable[1].";\n\n";
            }
        }
        // données ou la totalité
        if($mode 1)
        {
            $donnees mysql_query("SELECT * FROM ".$table[0]);
            $insertions .= "-- -----------------------------\n";
            $insertions .= "-- Contenu de la table ".$table[0]."\n";
            $insertions .= "-- -----------------------------\n";
            while($nuplet mysql_fetch_array($donnees))
            {
                $insertions .= "INSERT INTO ".$table[0]." VALUES(";
                for($i=0$i mysql_num_fields($donnees); $i++)
                {
                  if($i != 0)
                     $insertions .=  ", ";
                  if(mysql_field_type($donnees$i) == "string" || 
mysql_field_type($donnees$i) == "blob")
                     $insertions .=  "'";
                  $insertions .= addslashes($nuplet[$i]);
                  if(mysql_field_type($donnees$i) == "string" || 
mysql_field_type($donnees$i) == "blob")
                    $insertions .=  "'";
                }
                $insertions .=  ");\n";
            }
            $insertions .= "\n";
        }
    }
 
    mysql_close($connexion);
 
    $fichierDump fopen("sauvegarde.sql""wb");
    fwrite($fichierDump$entete);
    fwrite($fichierDump$creations);
    fwrite($fichierDump$insertions);
    fclose($fichierDump);

    echo "Sauvegarde terminée";
    }
?>

Exemple :

 
 01    
 02    
 03    
 04    
 05    
 06    
                                
<?php

   dump_MySQL("127.0.0.1""root""""ma_base"2);
?>

          Fonctions du code - Doc officielle PHP

   php.net   Description Versions PHP OUTIL
   addslashes Ajoute des anti-slash dans une chaîne PHP 4, PHP 5, PHP 7, PHP 8
   date Formate une date/heure locale PHP 4, PHP 5, PHP 7, PHP 8
   echo Affiche une chaîne de caractères PHP 4, PHP 5, PHP 7, PHP 8
   fclose Ferme un fichier PHP 4, PHP 5, PHP 7, PHP 8
   fopen Ouverture d'un fichier ou d'une URL PHP 4, PHP 5, PHP 7, PHP 8
   fwrite Ecrit un fichier en mode binaire PHP 4, PHP 5, PHP 7, PHP 8
   mysql_close Ferme la connexion MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0
   mysql_connect Ouvre une connexion à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0
   mysql_fetch_array Retourne une ligne de résultat MySQL sous la forme d'un tableau - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0
   mysql_field_type Retourne le type d'une colonne MySQL spécifique - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0
   mysql_num_fields Retourne le nombre de champs d'un résultat MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0
   mysql_query Envoie une requête à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0
   mysql_select_db Sélectionne une base de données MySQL - (PHP 4, PHP 5, PECL mysql:1.0)   !  OBSOLÈTE en PHP 5.5.0, et ont été supprimées en PHP 7.0.0

   Dites merci aux auteurs pour leurs travail, ça ne coûte rien et ça fait toujours plaisir wink

[5]

  • avatar

    Invité

    20 Mars 2021 à 19:08

    merci bq :) :) :) ................

  • avatar

    Invité

    28 Mars 2012 à 00:12

    Bonjour,
    J'ai un problème avec ce code, les accents ne s'affiche pas dans le fichier obtebu, erreur encodage utf8

  • avatar

    Berfonta

    24 Avril 2011 à 10:02

    C'est tellement sympa que je n'hésite pas à rajouter 3 remarques :
    - Rapidité : l'entrée des données une à une prend beaucoup de temps. Avec 1 seule requête par table, on va 10 fois plus vite.
    - Contraintes : l'ordre alphabétique ne convient pas aux tables avec clés externes, sauf si on bloque le contrôle provisoirement :
    SET FOREIGN_KEY_CHECKS = 0; ... puis = 1 à la fin.
    - Ràz auto : l'importation, dans PhpMyAdmin par exemple, nécessite de détruire les tables avant. Ils préfèrent laisser ce risque à l'utilisateur... On peut rajouter une autre requête, unique aussi, pour les 'dropper' au début.
    On peut ainsi préparer une chaîne $drop que l'on remplit à chaque nom de table disponible et qui sera insérée en tête du fichier.
    Bien entendu avant d'utiliser ce programme, il faut toujours sauvegarder la base actuelle avant.
    J'obtiens le fichier suivant en ajoutant la remarque de Benicode et en simplifiant un poil.

    Tests avec : WampServer 2.1 / PhpMyAdmin 3.3.9  / Apache 2.2.17 / MySql 5.5.8 / PHP 5.3.5

    function isNeededQuotes($type) {
        return( $type == "string" || $type == "blob" || $type == "datetime" ||
                $type == "date" || $type == "timestamp" || $type == "time" || $type == "year");
    }
    function dump_MySQL($serveur, $login, $password, $base, $fichier, $mode) {
        $connexion = mysql_connect($serveur, $login, $password);
        mysql_select_db($base, $connexion);
        $drops = "-- dump de la base ".$base." au ".date("d-M-Y")."\n";                    // Première ligne
        $creations = $insertions = "";                                                        // SET : pour introduction désordonnée des tables :
        $deb_drop = "\nSET FOREIGN_KEY_CHECKS = 0;\n\nDROP TABLE IF EXISTS\n  `";        // effacement des tables
        $listeTables = mysql_query("show tables", $connexion);      // var_dump($listeTables);
        while($table = mysql_fetch_array($listeTables))
        {
            if($mode == 1 || $mode == 2)    // structure ou la totalité de la BDD
            {
                $listeCreationsTables = mysql_query("show create table ".$table[0], $connexion);
                $drops .= $deb_drop.$table[0]; $deb_drop = "`,\n  `";                    // Suppression de la table
                while($creationTable = mysql_fetch_array($listeCreationsTables))
                    $creations .= $creationTable[1].";\n\n";
            }
            if($mode > 1)                    // données ou la totalité
            {
                if($donnees = mysql_query("SELECT * FROM ".$table[0])) {
                    $insertions .= "INSERT INTO `".$table[0]."` VALUES\n";    // 1 seule requête par table vitesse x 10
                    $nuplet = mysql_fetch_array($donnees);
                    while($nuplet) {                // toutes les données vont suivre 'encadrées' si nécessaire :
                        $insertions .= "(";
                        for($i=0; $i < mysql_num_fields($donnees); $i++) {
                            if($i > 0) $insertions .=  ", ";
                            $quote = isNeededQuotes(mysql_field_type($donnees, $i)) ? "'" : "";
                            $insertions .= $quote.addslashes($nuplet[$i]).$quote; }                 // et hop ! c emballé
                        if($nuplet = mysql_fetch_array($donnees)) $insertions .=  "),\n"; }    // , : ce n'est pas fini :
                    $insertions .= ");\n\n"; }                                                                                    // ; : final
            }
        }
        mysql_close($connexion);
        $drops .= "`;\n\n";
        $insertions .= "SET FOREIGN_KEY_CHECKS = 1;\n\n";        // !! Ne pas l'oublier à la fin !!
        $fichierDump = fopen($fichier, "wb");
        fwrite($fichierDump, $drops);
        fwrite($fichierDump, $creations);
        fwrite($fichierDump, $insertions);
        fclose($fichierDump);

        echo "Sauvegarde de ".$fichier." terminée";
    }     dump_MySQL("localhost", "root", "mot_pass", "ma_base", "dump.sql", 2);

  • avatar

    Benicode

    10 Nov 2010 à 01:10

    Hi, Ton Code est sympa MAIS ATTENTION pour les quotes sur les types de date genre "datetime" ou autres cela ne fonctionne PAS... J'ai modifié un poil ton code pour qu'il fonctionne aussi pour ces cas là : function isNeededToInsertQuotes($typeOfdata){
     return (    $typeOfdata == "string"
        || $typeOfdata == "blob"
        || $typeOfdata == "datetime"
       || $typeOfdata == "date"
       || $typeOfdata == "timestamp"
       || $typeOfdata == "time"
       || $typeOfdata == "year"
      );
    }
    function dump_MySQL($serveur, $login, $password, $base, $mode)
    {
        $connexion = mysql_connect($serveur, $login, $password);
        mysql_select_db($base, $connexion);
       
        $entete  = "-- ----------------------\n";
        $entete .= "-- dump de la base ".$base." au ".date("d-M-Y")."\n";
        $entete .= "-- ----------------------\n\n\n";
        $creations = "";
        $insertions = "\n\n";
       
        $listeTables = mysql_query("show tables", $connexion);
        while($table = mysql_fetch_array($listeTables))
        {
            // structure ou la totalité de la BDD
            if($mode == 1 || $mode == 2)
            {
                $creations .= "-- -----------------------------\n";
                $creations .= "-- Structure de la table ".$table[0]."\n";
                $creations .= "-- -----------------------------\n";
                $listeCreationsTables = mysql_query("show create table ".$table[0],
    $connexion);
                while($creationTable = mysql_fetch_array($listeCreationsTables))
                {
                  $creations .= $creationTable[1].";\n\n";
                }
            }
            // données ou la totalité
            if($mode > 1)
            {
                $donnees = mysql_query("SELECT * FROM ".$table[0]);
                $insertions .= "-- -----------------------------\n";
                $insertions .= "-- Contenu de la table ".$table[0]."\n";
                $insertions .= "-- -----------------------------\n";
                while($nuplet = mysql_fetch_array($donnees))
                {
                    $insertions .= "INSERT INTO ".$table[0]." VALUES(";
                    for($i=0; $i < mysql_num_fields($donnees); $i++)
                    {
                      if($i != 0)
                         $insertions .=  ", ";
          $typeOfdata = mysql_field_type($donnees, $i);
          $bInsertQuotes = isNeededToInsertQuotes($typeOfdata);
                      if($bInsertQuotes)
                         $insertions .=  "'";
                      $insertions .= addslashes($nuplet[$i]);
                      if($bInsertQuotes)
                        $insertions .=  "'";
                    }
                    $insertions .=  ");\n";
                }
                $insertions .= "\n";
            }
        }
     
        mysql_close($connexion);
     
        $fichierDump = fopen("sauvegarde.sql", "wb");
        fwrite($fichierDump, $entete);
        fwrite($fichierDump, $creations);
        fwrite($fichierDump, $insertions);
        fclose($fichierDump);
        echo "Sauvegarde terminée";
    }

  • avatar

    Smed79

    04 Nov 2010 à 02:27

    J'ai testé le code, ça fonction à merveille !!! Encore Merci à toi...

Présentation de PHP

PHP débutant et initié 50 Tutoriel

Présentation de MySQL

avatar

Miragoo

  28 Oct 2010

  SOURCE   Télécharger

Information sur les mises à jour

Dernière mise à jour :

    13 Sept 2019
    fonctionnement du code vérifié

54 859 Vues
Compatibilité
PHP 5-