Sauvegarde d'une base de donnée, resultat envoyer par email, sur ftp ou bien savegarder en local

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 897 fois - Téléchargée 15 fois


Contenu du snippet

Ma classe SaveBD() permet de faire des sauvegarder a l'aide de cron. Vous pouvez choisir le type de média voulu, soit un envoie a un courriel, soit dans un répertoir local de votre site, soit sur un site ftp distant.

Prendre note que les fichier .sql son en texte lisible, donc n'oubliez pas de sécurisé le répertoire de destination.

Source / Exemple :


<?php

/*************************************************/
/*         SAUVEGARDE DE BASE DE DONNEES         */
/*             STRUCTURE ET CONTENU              */
/*          Option d'envoie par email, 	         */
/*	    Option de sauvegarde local, 	 */
/*	 Option de sauvegarde sur ftp distant	 */
/*************************************************/

/*
utilisation:
sauvegarde simple
--->	save_db.php?db=nom_de_la_base

  • /
class saveBD { const Producteur_nom = "1030"; const Producteur_commentaire = "Service de sauvegarde MySql"; const Producteur_HTTP = "www.monsite.com"; const Producteur_email = "webmaster@monsite.com"; const Producteur_version = "1.0"; private $sql_export = ""; private $ini = array(); public function __construct($db,$host="",$user="",$pass="") { $this->ini["db_host"] = !empty($host) ? $host : "localhost"; $this->ini["db_user"] = !empty($user) ? $user : "root"; $this->ini["db_pass"] = !empty($pass) ? $pass : ""; $this->ini["db_name"] = $db; $this->ini["email_adresse"] = "votre@email.com"; $this->ini["ftp_url"] = "ftp.monsite.com"; $this->ini["ftp_login"] = "user"; $this->ini["ftp_pass"] = "password"; $this->ini["ftp_filename"] = "Backup_MySql_".$db; $this->ini["file_name"] = "Backup_MySql"; $this->dbconnect(); $this->sql_export = $this->contenu(); } public function __destruct() { @mysql_close(); } private function get_table_structure($db, $table)//$db=nom de la base,$table=nom de la table { //CREATE TABLE $result = mysql_db_query($db, "SHOW CREATE TABLE `$table`") or mysql_die(); $row = mysql_fetch_array($result); $schema_create = $row[1]; $schema_create = str_replace("\n","\r\n",$schema_create).";"; return (stripslashes($schema_create)); } private function get_table_content($db, $table)//$db=nom de la base,$table=nom de la table { $result = mysql_db_query($db, "SELECT * FROM `$table`") or mysql_die(); $i = 0; $search = array("\x00", "\x0a", "\x0d", "\x1a"); //on remplace: NULL, LF, CR $replace = array('\0', '\n', '\r', '\Z'); //INSERT INTO $table_list = "("; for($j=0; $j<mysql_num_fields($result);$j++) $table_list .= "`".mysql_field_name($result,$j)."`, "; $table_list = substr($table_list,0,-2); $table_list .= ")"; $schema_insert = "INSERT INTO `$table` $table_list VALUES \r\n"; //VALUE $value_insert = array(); while($row = mysql_fetch_row($result)) { $values = array(); for($j=0; $j<mysql_num_fields($result);$j++) { if(!isset($row[$j])) { $values[] = "NULL"; } elseif($row[$j] != "") { $values[] = "'".str_replace($search, $replace, addslashes($row[$j]))."'"; } else { $values[] = " ''"; } } $value_insert[] ='(' . implode(', ', $values) . ')'; $i++; } $schema_insert = count($value_insert) > 0 ? $schema_insert . implode(",\r\n",$value_insert) .";" : ""; return trim($schema_insert)."\r\n"; } private function contenu() { $sql_export = "\r\n"; $sql_export .= "# --------------------------------------------------------\r\n"; $sql_export .= "# -- ".self::Producteur_nom." - ".self::Producteur_commentaire."\r\n"; $sql_export .= "# -- Version ".self::Producteur_version."\r\n"; $sql_export .= "# -- http://".self::Producteur_HTTP."\r\n"; $sql_export .= "# -- \r\n"; $sql_export .= "# -- Serveur : ".$this->ini["db_host"]."\r\n"; $sql_export .= "# -- Généré le : ". format_date(Date("Y-m-d"))." à ". Date("H:i") ."\r\n"; $version_mysql = explode("-", mysql_get_server_info()); $sql_export .= "# -- Version de MySql : ". $version_mysql[0] ."\r\n"; $sql_export .= "# -- Version de PHP : ".phpversion()."\r\n"; $sql_export .= "# -- \r\n"; $sql_export .= "# -- Base de donnée : ". $this->ini["db_name"] ."\r\n"; $i = 0; while($i < $this->ini["num_tables"]) { $table = mysql_tablename($this->ini["tables"], $i);//Lit le nom de la table qui contient le champs spécifié $sql_export .= "# --------------------------------------------------------\r\n"; $sql_export .= "\r\n"; $sql_export .= "# -- \r\n"; $sql_export .= "# -- Structure de la table `".$table."`\r\n"; $sql_export .= "# -- \r\n"; $sql_export .= "\r\n"; $sql_export .= $this->get_table_structure($this->ini["db_name"], $table)."\r\n\r\n"; $sql_export .= "# -- \r\n"; $sql_export .= "# -- Contenu de la table `".$table."`\r\n"; $sql_export .= "# -- \r\n"; $sql_export .= "\r\n"; $sql_export .= $this->get_table_content($this->ini["db_name"], $table); $i++; } return $sql_export; } //Connexion à la base de donnée private function dbconnect() { @set_time_limit(600); @mysql_connect($this->ini["db_host"],$this->ini["db_user"],$this->ini["db_pass"]) or die("Impossible de se connecter - Problème sur le 'Hostname' ou sur le 'User' ou sur le 'Password'"); @mysql_select_db($this->ini["db_name"]) or die("Impossible de se connecter à la base ou nom de base inconnu"); header("Expires: 0"); $this->ini["tables"] = mysql_list_tables($this->ini["db_name"]);//Liste les tables d'une base de données. $this->ini["num_tables"] = mysql_num_rows($this->ini["tables"]);//Retourne le nombre de lignes d'un résultat } //Imprime à l'écrant le contenue pour la création de la BD public function print_db() { return str_replace("\r\n","<BR>",$this->sql_export); } //envoie un email avec le fichier joint public function confirme_email() { //Sujet du courriel $sujet = Producteur_commentaire." le ".date("d/m/Y"); //Entete du courriel $boundary = '-----='.md5(uniqid(rand())); $headers = "From: ".Producteur_nom."<".Producteur_email.">\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-Type: multipart/mixed;"; $headers .= " boundary=\"----=".$boundary."\"\n\n"; //Ajoute le message au courriel $message = "------=".$boundary."\n"; $message .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; $message .= "Content-Transfer-Encoding: 32bit\n\n"; $message .= " Techno-Vie - Service de sauvegarde mensuelle de votre base de donnée "; $message .= "\n\n"; //Ajoute la pièce jointe $attachement = "------=".$boundary."\n"; $attachement .= "Content-Type: text/plain; name=\"Backup_MySql_aprmq_".date("Ymd-Hi").".sql\"\n"; $attachement .= "Content-Transfer-Encoding: base64\n"; $attachement .= "Content-Disposition: attachment; filename=\"Backup_MySql_aprmq_".date("Ymd-Hi").".sql\"\n\n"; $attachement .= chunk_split(base64_encode($this->sql_export)); mail($this->ini["email_adresse"],$sujet,$message.$attachement,$headers); } //save le fichier sur le serveur public function save_file($file="") { $this->ini["file_name"] = empty($file) ? $this->ini["file_name"] : $file; if (!$handle = fopen($this->ini["file_name"].'.sql', 'w')) echo('Impossible d\'ouvrir en écriture le fichier sql : '.$this->ini["file_name"].".sql\n"); if (fwrite($handle, $this->sql_export) == FALSE) echo('Erreur d\'exportation de la base '.$this->ini["db_name"]."\n"); fclose($handle); } //save le fichier sur un serveur externe public function save_ftp($url="",$login="",$pwd="",$file="") { $this->ini["ftp_url"] = empty($url) ? $this->ini["ftp_url"] : $url; $this->ini["ftp_login"] = empty($login) ? $this->ini["ftp_login"] : $login; $this->ini["ftp_pass"] = empty($pwd) ? $this->ini["ftp_pass"] : $pwd; $this->ini["ftp_filename"] = empty($file) ? $this->ini["ftp_filename"] : $file; $conn_id = ftp_connect($this->ini["ftp_url"]); // Identification avec un nom d'utilisateur et un mot de passe $login_result = ftp_login($conn_id, $this->ini["ftp_login"], $this->ini["ftp_pass"]); // Efface l'ancien fichier $del_result = ftp_delete($conn_id,$this->ini["ftp_filename"].".sql"); // Fermeture de la connexion et du pointeur de fichier ftp_close($conn_id); $ftp = "ftp://".$this->ini["ftp_login"].":".$this->ini["ftp_pass"]."@".$this->ini["ftp_url"]."/".$this->ini["ftp_filename"].".sql"; $handle = fopen($ftp, "w") or die("FTP - Impossible d'ouvrir en écriture le fichier : ".$this->ini["file_name"].".sql\n"); if(fwrite($handle, $this->sql_export) == FALSE) { echo "Erreur d'exportation de la base ".$this->ini["db_name"]."\n"; } fclose($handle); } } /*************************************
  • Variable pour des dates
                                                                          • /
define("VAR_JAN","Janvier"); define("VAR_FEV","Février"); define("VAR_MAR","Mars"); define("VAR_AVR","Avril"); define("VAR_MAI","Mai"); define("VAR_JUN","Juin"); define("VAR_JUI","Juillet"); define("VAR_AOU","Août"); define("VAR_SEP","Septembre"); define("VAR_OCT","Octobre"); define("VAR_NOV","Novembre"); define("VAR_DEC","Décembre"); function format_date($date) { $mois = array(VAR_JAN, VAR_FEV, VAR_MAR, VAR_AVR, VAR_MAI, VAR_JUN, VAR_JUI, VAR_AOU, VAR_SEP, VAR_OCT, VAR_NOV, VAR_DEC); $jour = strftime("%d", strtotime($date)); $mois2 = intval(strftime("%m", strtotime($date))) -1; $mois2 = $mois[$mois2]; $annee = strftime("%Y", strtotime($date)); $date = $jour." ".$mois2.", ".$annee; return $date; } /*************************************************/ /* Programme principal */ /*************************************************/ $DB = new saveBD($_GET["db"]); $DB->print_db(); //$DB->save_ftp(); //$DB->save_file(); //$DB->confirme_email(); ?>

Conclusion :


J'attends vos impression, la perfection n'existe point hélas dans notre monde.

A voir également

Ajouter un commentaire

Commentaires

PetitRaptor
Messages postés
4
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
5 octobre 2010

Bonjour,

Je sais que ce script peut enregistrer le fichier final sur le serveur, sous un serveur distant ou l'envoyer par mail.

J'ai aussi compris que pour l'utiliser sans tâche cron, il faut visiter la page comme ceci: ma_page_save.php?db=nom_db

Mais je ne suis pas vraiment un génie en poo PHP donc pourrais-je savoir comment envoyer cette sauvegarde par mail exactement ?

Cordialement,
1030
Messages postés
5
Date d'inscription
samedi 1 juillet 2006
Statut
Membre
Dernière intervention
10 mai 2011

Salut Fabrice88,

le script est bati pour fonctionner sous un principe de cron. Donc des exécution automatique shéduler sur le serveur. Il y a uniquement des message d'erreur qui sont retourné afin de facilité le débogage lors de test avec l'URL.

Si tu utilise la méthode $DB->save_ftp() vérifie dans ton répertoire si le fichier est écrit. Assure toi que l'utilisateur choisi pour la connexion a les droit d'écriture dans ce répertoire.

Prend le temp de lire les commentaires dans la source, il y a une fonction qui te permet d'afficher uniquement.
cs_fabrice88
Messages postés
97
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
7 août 2015

Bonjour,
j'essai de faire fonctionner le system de sauvegarde pour mon site mais jusque là sans succès.
j'ai fait un copier coller du code proposé puis j'ai saisie les données de ma base de données et celles de mon acces ftp.
lorsque j'execute le script j'ai un temps de quelques secondes qui passe et apres j'ai une page blanche. Je ne reçoi aucune sauvegarde par mail ou autre.
D'ou pourrait venir le probleme ?
mahlaoui
Messages postés
29
Date d'inscription
lundi 10 décembre 2007
Statut
Membre
Dernière intervention
13 octobre 2008

Cette classe fonctionne en PHP5
Donc vous êtes obligé de l'installer ou bien de modifier cette source pout l'adapter au PHP4 en éliminant les mots clé Private, Public
docteursas
Messages postés
33
Date d'inscription
lundi 25 juillet 2005
Statut
Membre
Dernière intervention
13 mars 2011

j'essaie de mettre en place le code mais j'ai l'erreur suivante :
Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in d:\icla3\testsave.php on line 20

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (1030)