<?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 == 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 .= ", ";
|
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";
|
}
|
?>
|
|
|
Invité
20 Mars 2021 à 19:08merci bq :) :) :) ................
Invité
28 Mars 2012 à 00:12Bonjour,
J'ai un problème avec ce code, les accents ne s'affiche pas dans le fichier obtebu, erreur encodage utf8
Berfonta
24 Avril 2011 à 10:02C'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);
Benicode
10 Nov 2010 à 01:10Hi, 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";
}
Smed79
04 Nov 2010 à 02:27J'ai testé le code, ça fonction à merveille !!! Encore Merci à toi...