Sauvegarde de la base de données
3 participants
Page 1 sur 1
Sauvegarde de la base de données
Après avoir essayer sans succès de faire marcher la commande mysqldump dans un script php, j'ai trouvé et testé un script php qui fonctionne bien pour sauvegarder la base de données dans un fichier .sql.
Voici le code :
$backupFile = date('Y.m.d-H.i.s_') . $database . '.sql';
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment;filename=\"$backupFile\"");
header("Content-Transfer-Encoding: binary");
echo "--\n";
echo "-- Dump de la base $database\n";
echo "--\n";
mysql_connect ($host, $user, $password) or die ('ERREUR DE CONNEXION');
mysql_select_db ($database) or die ('AUTRE ERREUR');
$sql_tables = "SHOW TABLES";
$req_tables = mysql_query($sql_tables);
while (list($table) = mysql_fetch_row($req_tables)) {
echo "\n--\n-- Table $table\n\n";
echo "DROP TABLE IF EXISTS $table;\n";
$sql_create_table = "SHOW CREATE TABLE $table";
$req_create_table = mysql_query($sql_create_table);
$create_table = mysql_fetch_array($req_create_table);
echo $create_table[1].";\n";
echo "\n--\n-- Remplissage de $table\n\n";
$sql_fill_table = "SELECT * FROM $table";
$req_fill_table = mysql_query($sql_fill_table);
while ($row = mysql_fetch_assoc($req_fill_table)) {
$line_insert = "INSERT INTO $table (";
$l_value = ") VALUES (";
foreach ($row as $field => $value) {
$line_insert .= "`$field`, ";
$l_value .= "'".mysql_real_escape_string($value)."', ";
}
$line_insert = substr($line_insert, 0, -2);
$l_value = substr($l_value, 0, -2);
echo $line_insert.$l_value.");\n";
}
}
Je ne sais pas ce que vous en penser ...
Je vais regarder comment restaurer la base à partir de ce fichier maintenant.
Voici le code :
$backupFile = date('Y.m.d-H.i.s_') . $database . '.sql';
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment;filename=\"$backupFile\"");
header("Content-Transfer-Encoding: binary");
echo "--\n";
echo "-- Dump de la base $database\n";
echo "--\n";
mysql_connect ($host, $user, $password) or die ('ERREUR DE CONNEXION');
mysql_select_db ($database) or die ('AUTRE ERREUR');
$sql_tables = "SHOW TABLES";
$req_tables = mysql_query($sql_tables);
while (list($table) = mysql_fetch_row($req_tables)) {
echo "\n--\n-- Table $table\n\n";
echo "DROP TABLE IF EXISTS $table;\n";
$sql_create_table = "SHOW CREATE TABLE $table";
$req_create_table = mysql_query($sql_create_table);
$create_table = mysql_fetch_array($req_create_table);
echo $create_table[1].";\n";
echo "\n--\n-- Remplissage de $table\n\n";
$sql_fill_table = "SELECT * FROM $table";
$req_fill_table = mysql_query($sql_fill_table);
while ($row = mysql_fetch_assoc($req_fill_table)) {
$line_insert = "INSERT INTO $table (";
$l_value = ") VALUES (";
foreach ($row as $field => $value) {
$line_insert .= "`$field`, ";
$l_value .= "'".mysql_real_escape_string($value)."', ";
}
$line_insert = substr($line_insert, 0, -2);
$l_value = substr($l_value, 0, -2);
echo $line_insert.$l_value.");\n";
}
}
Je ne sais pas ce que vous en penser ...
Je vais regarder comment restaurer la base à partir de ce fichier maintenant.
Re: Sauvegarde de la base de données
Moi ça me va : ça marche comme il faut, et ça répond à la demande, alors je prends...
Reste plus qu'à trouver comment faire l'inverse, et c'est gagné !
Reste plus qu'à trouver comment faire l'inverse, et c'est gagné !
Nicolas BONNETIER- Nerd
- Messages : 63
Date d'inscription : 05/03/2008
Age : 36
Localisation : Dijon --> pas internet la semaine !
Re: Sauvegarde de la base de données
ca marche, j'men occupe dès que j'aurai mon portable en état de marche.
Re: Sauvegarde de la base de données
Bon mon petit chef, j'ai fait l'inverse, c'est en 2 parties :
-> Formulaire pour récupérer le fichier que l'on veut charger, contenant la sauvegarde de la base de données. (Fait avec le script ci-dessus) :
<!-- formulaire pour télécharger le fichier -->
<form enctype="multipart/form-data" method="post" action="restaurationExecution.php" name="restaurerBDD">
Fichier de la base :
<br>
<!-- Le nom de l'élément input détermine le nom dans le tableau $_FILES -->
<input name="userfile" type="file" />
<br>
<br>
<input type="submit" name="bouton" value="Envoyer">
</form>
-> Script php pour restaurer la base de données à partir du fichier :
//mots de passe
require "../secret/pwd.php";
//téléchargement du fichier de restauration
$uploaddir = '../dump/';
if($_FILES["userfile"]["size"]>0) {
//nom du fichier uploadé
$savefile= $uploaddir.$_FILES["userfile"]["name"];
$temp = $_FILES["userfile"]["tmp_name"];
//upload du fichier
if(move_uploaded_file($temp, $savefile)) {
//ouverture du fichier uploadé
$fp = fopen($savefile,"r");
$donnees = "";
//lecture du fichier lignes par lignes
$separateur = "#{)";
while (!feof($fp)) {
$buffer = fgets($fp);
//on découpe la ligne par caractères
$caracteres = str_split($buffer);
//Si ce n'est pas une ligne de commentaire on l'ajoute à la variable $donnees
if(strcmp(($buffer[0].$buffer[1]),"--")!=0 && count($caracteres)>1){ // il faut tester qu'on est bien en fin de ligne pour mettre le séparateur
if(strcmp($buffer[count($caracteres)-2],";")==0) //on est en fin de ligne et la ligne se termine par un ;
$donnees=$donnees.$buffer.$separateur;
else
$donnees=$donnees.$buffer;
}
}
//fermeture du fichier
fclose($fp);
//On récupère chaque requêtes séparément
$requete = split($separateur,$donnees);
//connexion à la base de données
mysql_connect ($host, $user, $password) or die ("ERREUR DE CONNEXION");
mysql_select_db ($database) or die ("AUTRE ERREUR");
//On exécute chaque requêtes
$i=0;
while(strcmp($requete[$i],"")!=0){
$query = $requete[$i];
$result = mysql_query($query) or die($query);
$i++;
}
//déconnexion de la base de données
mysql_close();
//message
echo "La base de données a bien été restaurée";
}
else
echo "Fichier incorrect";
Voila, j'ai testé en local ça marche. Si quelqu'un peut retester historie d'être sur qu'aucun bigs ne reste.
-> Formulaire pour récupérer le fichier que l'on veut charger, contenant la sauvegarde de la base de données. (Fait avec le script ci-dessus) :
<!-- formulaire pour télécharger le fichier -->
<form enctype="multipart/form-data" method="post" action="restaurationExecution.php" name="restaurerBDD">
Fichier de la base :
<br>
<!-- Le nom de l'élément input détermine le nom dans le tableau $_FILES -->
<input name="userfile" type="file" />
<br>
<br>
<input type="submit" name="bouton" value="Envoyer">
</form>
-> Script php pour restaurer la base de données à partir du fichier :
//mots de passe
require "../secret/pwd.php";
//téléchargement du fichier de restauration
$uploaddir = '../dump/';
if($_FILES["userfile"]["size"]>0) {
//nom du fichier uploadé
$savefile= $uploaddir.$_FILES["userfile"]["name"];
$temp = $_FILES["userfile"]["tmp_name"];
//upload du fichier
if(move_uploaded_file($temp, $savefile)) {
//ouverture du fichier uploadé
$fp = fopen($savefile,"r");
$donnees = "";
//lecture du fichier lignes par lignes
$separateur = "#{)";
while (!feof($fp)) {
$buffer = fgets($fp);
//on découpe la ligne par caractères
$caracteres = str_split($buffer);
//Si ce n'est pas une ligne de commentaire on l'ajoute à la variable $donnees
if(strcmp(($buffer[0].$buffer[1]),"--")!=0 && count($caracteres)>1){ // il faut tester qu'on est bien en fin de ligne pour mettre le séparateur
if(strcmp($buffer[count($caracteres)-2],";")==0) //on est en fin de ligne et la ligne se termine par un ;
$donnees=$donnees.$buffer.$separateur;
else
$donnees=$donnees.$buffer;
}
}
//fermeture du fichier
fclose($fp);
//On récupère chaque requêtes séparément
$requete = split($separateur,$donnees);
//connexion à la base de données
mysql_connect ($host, $user, $password) or die ("ERREUR DE CONNEXION");
mysql_select_db ($database) or die ("AUTRE ERREUR");
//On exécute chaque requêtes
$i=0;
while(strcmp($requete[$i],"")!=0){
$query = $requete[$i];
$result = mysql_query($query) or die($query);
$i++;
}
//déconnexion de la base de données
mysql_close();
//message
echo "La base de données a bien été restaurée";
}
else
echo "Fichier incorrect";
Voila, j'ai testé en local ça marche. Si quelqu'un peut retester historie d'être sur qu'aucun bigs ne reste.
Re: Sauvegarde de la base de données
bon, visiblement y'a un soucis avec la fonction str_split sur un hébergeur free ...
Re: Sauvegarde de la base de données
En effet, ça marche bien en local...
Seul petit souci, mais pas très important : on est obligé de recréer la base à la main : la sauvegarde ne fait une sauvegarde que des tables de la base, donc pour recréer la base, il faut créer une nouvelle base, puis lancer le script de restauration...
A la limite, il faudrait rajouter une case pour créer une nouvelle base de données pour que l'admin (on ne connait pas son niveau) ne soit pas trop perdu si la base est complètement supprimée...
Seul petit souci, mais pas très important : on est obligé de recréer la base à la main : la sauvegarde ne fait une sauvegarde que des tables de la base, donc pour recréer la base, il faut créer une nouvelle base, puis lancer le script de restauration...
A la limite, il faudrait rajouter une case pour créer une nouvelle base de données pour que l'admin (on ne connait pas son niveau) ne soit pas trop perdu si la base est complètement supprimée...
Nicolas BONNETIER- Nerd
- Messages : 63
Date d'inscription : 05/03/2008
Age : 36
Localisation : Dijon --> pas internet la semaine !
Re: Sauvegarde de la base de données
ok, je vais regarder ça.
Je sais pas comment ça se passe chez tous les hébergeurs, mais il me semble que chez free par exemple, on a pas les droit pour créer une nouvelle base.
J'ai pas eu le temps d'avancer ce WE donc mon script ne marche tjs pas chez free :s, j'espère régler ce problème demain.
Je sais pas comment ça se passe chez tous les hébergeurs, mais il me semble que chez free par exemple, on a pas les droit pour créer une nouvelle base.
J'ai pas eu le temps d'avancer ce WE donc mon script ne marche tjs pas chez free :s, j'espère régler ce problème demain.
Re: Sauvegarde de la base de données
Je confirme que chez free, on n'a pas le droit de créer une base de données.
Et pour cause : on n'a le droit qu'a une seule base par compte.
Et pour cause : on n'a le droit qu'a une seule base par compte.
Re: Sauvegarde de la base de données
Maintenant que c'est fonctionnel, il faudrait que tu me fasse un petit formulaire PHP pour intégrer tout ça, que je puisse commencer mon manuel d'installation...
Pour info, on possèdera tous les droits sur le serveur sur lequel on fera la démo...
Pour info, on possèdera tous les droits sur le serveur sur lequel on fera la démo...
Nicolas BONNETIER- Nerd
- Messages : 63
Date d'inscription : 05/03/2008
Age : 36
Localisation : Dijon --> pas internet la semaine !
Re: Sauvegarde de la base de données
Bon la fonction str_split marche qu'avec php5 c'est pour ça que mon script ne marchait pas avec free dont le serveur utilise PHP4.
J'ai donc trouvé une solution que voici :
//téléchargement du fichier de restauration
$uploaddir = '../dump/';
if($_FILES["userfile"]["size"]>0) {
//nom du fichier uploadé
$savefile= $uploaddir.$_FILES["userfile"]["name"];
$temp = $_FILES["userfile"]["tmp_name"];
//upload du fichier
if(move_uploaded_file($temp, $savefile)) {
//ouverture du fichier uploadé
$fp = fopen($savefile,"r");
$donnees = "";
//lecture du fichier lignes par lignes
$separateur = "#{)";
while (!feof($fp)) {
$buffer = fgets($fp);
//on découpe la ligne par caractères
//$caracteres = str_split($buffer); -- la fonction str_split marche uniquement avec PHP 5
$caracteres = explode("\r\n",trim(chunk_split($buffer,1)));
//Si ce n'est pas une ligne de commentaire on l'ajoute à la variable $donnees
if(strcmp(($buffer[0].$buffer[1]),"--")!=0 && count($caracteres)>1){ // il faut tester qu'on est bien en fin de ligne pour mettre le séparateur
//if(strcmp($buffer[count($caracteres)-2],";")==0) //on est en fin de ligne et la ligne se termine par un ; --> si on utilise la fonction str_split
if(strcmp($buffer[count($caracteres)-1],";")==0) //on est en fin de ligne et la ligne se termine par un ; --> si on utilise la fonction explode
$donnees=$donnees.$buffer.$separateur;
else
$donnees=$donnees.$buffer;
}
}
//fermeture du fichier
fclose($fp);
//On récupère chaque requêtes séparément
$requete = split($separateur,$donnees);
//connexion à la base de données
mysql_connect ($host, $user, $password) or die ("ERREUR DE CONNEXION");
mysql_select_db ($database) or die ("AUTRE ERREUR");
//On exécute chaque requêtes
$i=0;
while(strcmp($requete[$i],"")!=0){
$query = $requete[$i];
$result = mysql_query($query) or die($query);
$i++;
}
//déconnexion de la base de données
mysql_close();
//message
echo "La base de données a bien été restaurée";
}
else
echo "Fichier incorrect";
}
J'ai donc trouvé une solution que voici :
//téléchargement du fichier de restauration
$uploaddir = '../dump/';
if($_FILES["userfile"]["size"]>0) {
//nom du fichier uploadé
$savefile= $uploaddir.$_FILES["userfile"]["name"];
$temp = $_FILES["userfile"]["tmp_name"];
//upload du fichier
if(move_uploaded_file($temp, $savefile)) {
//ouverture du fichier uploadé
$fp = fopen($savefile,"r");
$donnees = "";
//lecture du fichier lignes par lignes
$separateur = "#{)";
while (!feof($fp)) {
$buffer = fgets($fp);
//on découpe la ligne par caractères
//$caracteres = str_split($buffer); -- la fonction str_split marche uniquement avec PHP 5
$caracteres = explode("\r\n",trim(chunk_split($buffer,1)));
//Si ce n'est pas une ligne de commentaire on l'ajoute à la variable $donnees
if(strcmp(($buffer[0].$buffer[1]),"--")!=0 && count($caracteres)>1){ // il faut tester qu'on est bien en fin de ligne pour mettre le séparateur
//if(strcmp($buffer[count($caracteres)-2],";")==0) //on est en fin de ligne et la ligne se termine par un ; --> si on utilise la fonction str_split
if(strcmp($buffer[count($caracteres)-1],";")==0) //on est en fin de ligne et la ligne se termine par un ; --> si on utilise la fonction explode
$donnees=$donnees.$buffer.$separateur;
else
$donnees=$donnees.$buffer;
}
}
//fermeture du fichier
fclose($fp);
//On récupère chaque requêtes séparément
$requete = split($separateur,$donnees);
//connexion à la base de données
mysql_connect ($host, $user, $password) or die ("ERREUR DE CONNEXION");
mysql_select_db ($database) or die ("AUTRE ERREUR");
//On exécute chaque requêtes
$i=0;
while(strcmp($requete[$i],"")!=0){
$query = $requete[$i];
$result = mysql_query($query) or die($query);
$i++;
}
//déconnexion de la base de données
mysql_close();
//message
echo "La base de données a bien été restaurée";
}
else
echo "Fichier incorrect";
}
Re: Sauvegarde de la base de données
Voila où vous pouvez trouver les sources : http://benoit.hagenbourger.free.fr/sources/joomla.rar
Chef dis moi si ça te convient ...
Chef dis moi si ça te convient ...
Re: Sauvegarde de la base de données
Pour info, chez free, tu peux passer sur le serveur php5 en mettant un .htaccess à la racine de ton espace perso avec la ligne suivante :
- Code:
php 1
Re: Sauvegarde de la base de données
Voila mon travail définitif (si tu trouves plus de bug) chef...
http://benoit.hagenbourger.free.fr/sources/joomla.rar
http://benoit.hagenbourger.free.fr/sources/joomla.rar
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|