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);
}
}
/*************************************
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.
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.