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


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

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)