Vous êtes ici Codes PHP et MySQL > MySQL > Dump (sauvegarde) avec PHP d'une base de donnée...

 

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

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 et en mettant 2 vous aurez les tables et les champs.
 
miragoo
Code vu 35921 fois
Enregistré le 28 Oct 2010
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute Dump (sauvegarde) avec PHP d'une base de donnée MySQL
  • Partage ce code sur Facebook
 
 
 
 

Code Source


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.
83.
84.
85.
86.
87.
88.
89.
90.
91.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Dump (sauvegarde) avec PHP d'une base de donnée MySQL     */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts612-PHP.htm              */
/* Auteur         : miragoo                                                   */
/* Date édition   : 28 Oct 2010                                               */
/*                                                                            */
/******************************************************************************/


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";
}

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

?>

 

Fonctions du code

: Ouvre une connexion à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)
: Sélectionne une base de données MySQL - (PHP 4, PHP 5, PECL mysql:1.0)
: Formate une date/heure locale - (PHP 4, PHP 5)
: Envoie une requête à un serveur MySQL - (PHP 4, PHP 5, PECL mysql:1.0)
: - (PHP 4, PHP 5, PECL mysql:1.0)
: Retourne le nombre de champs d'un résultat MySQL - (PHP 4, PHP 5, PECL...
: Retourne le type d'une colonne MySQL spécifique - (PHP 4, PHP 5, PECL mysql:1.0)
: Ajoute des antislashs dans une chaîne - (PHP 4, PHP 5)
: Ferme la connexion MySQL - (PHP 4, PHP 5, PECL mysql:1.0)
: Ouvre un fichier ou une URL - (PHP 4, PHP 5)
: Écrit un fichier en mode binaire - (PHP 4, PHP 5)
: Ferme un fichier - (PHP 4, PHP 5)
: Affiche une chaîne de caractères - (PHP 4, PHP 5)
Commentaires
J'ai testé le code, ça fonction à merveille !!! Encore Merci à toi...
 
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";
}
 
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);
 
Bonjour,

J'ai un problème avec ce code, les accents ne s'affiche pas dans le fichier obtebu, erreur encodage utf8
 
j'obtient le fichier "sauvegarde.sql" Vide !!??
 
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 

Connexion

 
 

MySQL

 
 

PHP

 
 
        Publicité